var counter = (function () {
var current = 0;
return function () {
current++;
return current;
}
})();
console.log(counter()); // 1
console.log(counter()); // 2
var current = 0;
var counter = function () {
current++;
return current;
}
console.log(counter()); // 1
current = 5;
console.log(counter()); // 6
'driver' => env('MAIL_DRIVER', 'smtp'),
'host' => env('MAIL_HOST', 'smtp.yandex.ru'),
'port' => env('MAIL_PORT', 587),
'from' => [
'address' => 'user@yandex.ru',
'name' => 'Type What You Want',
],
'encryption' => env('MAIL_ENCRYPTION', 'tls'),
'username' => env('MAIL_USERNAME', 'user@yandex.ru'),
'password' => env('MAIL_PASSWORD', 'secretpass'),
По хорошему валидацию должен делать реквест
Тоесть выходит 2 запроса, 1 - через валидаторы фреймворка, а 2 - когда в контроллере или сервисе достаем эту-же запись для дальнейшей работы.
В добавок к этому иногда логика может быть достаточно замысловатой
Мне не очень нравится идея выносить куски логики в реквест
Соответственно получается неудобная ситуация, когда часть валидации нужно разместить в реквесте, а часть в сервисе.
<?php
namespace Vendor\Project\AppBundle\Controller;
use KoKoKo\assert\Assert;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Method;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;
use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Symfony\Component\HttpFoundation\JsonResponse;
use Vendor\Project\Path\Authorization\UserNotFoundException;
use Vendor\Project\Path\Authorization\InvalidCredentialsException;
class LoginController extends Controller
{
/**
* @Route("/login", name="login")
* @Method({"POST"})
* @param Request $request
* @return JsonResponse
*/
public function loginAction(Request $request) : JsonResponse
{
try {
$login = $request->request->get('login');
$pass = $request->request->get('pass');
Assert::assert($login, 'login')->string()->notEmpty()->match('/^[a-z\d]{3,32}$/i');
Assert::assert($pass, 'pass')->string()->notEmpty()->lengthBetween(6, 32);
} catch (\Throwable $exception) {
return new JsonResponse($exception->getMessage(), JsonResponse::HTTP_BAD_REQUEST);
}
try {
$user = $this->get('UserAuthorizator')->authorize($login, $pass);
return new JsonResponse($user->getId());
} catch (UserNotFoundException $exception) {
return new JsonResponse('User not found', JsonResponse::HTTP_BAD_REQUEST);
} catch (InvalidCredentialsException $exception) {
return new JsonResponse('Invalid login or path', JsonResponse::HTTP_BAD_REQUEST);
} catch (\Throwable $exception) {
$this->get('logger')->error($exception->getMessage(), ['exception' => $exception]);
return new JsonResponse('Something went wrnog :((', JsonResponse::HTTP_INTERNAL_SERVER_ERROR);
}
}
}
С мобильного приложения я отправляю логин и пароль на сервер api.Никогда! Слышишь, Карл?! НИКОГДА НЕ ПЕРЕСЫЛАЙ данные авторизации на сервер БЕЗ ПРЕДВАРИТЕЛЬНОГО ХЕШИРОВАНИЯ на стороне клиента серверным ключом.
X-Authorization
. Если вы решите хранить токен в куках и передавать его, это желательно должны быть http-only куки (хотя в случае JWT не обязательно) и на сервере должна быть защита от CSRF атак.