- Основная информация / Basic information
- Примеры / Examples
Представим ситуацию, нам понадобилось прокидывать X-Auth-Token
из заголовков в контроллер, для дальнейшей работы с ним.
Контроллер может иметь такой вид:
<?php
declare(strict_types=1);
namespace App\Http\Controllers;
use Symfony\Component\HttpFoundation\JsonResponse;
class TestController extends Controller
{
public function index(string $token): JsonResponse
{
return new JsonResponse(['token' => $token]);
}
}
Если вы попробуете выполнить код, то получите ошибку, сообщающая нам о том,
что мы передаем слишком мало аргументов в функцию App\\Http\\Controllers\\TestController::index()
Чтобы убрать данную ошибку и решить нашу задачу создадим свой ParamConverter, чтобы извлекать токен из заголовка.
Все ParamConverters должны реализовывать ParamConverterInterface.
Создадим свой:
<?php
declare(strict_types=1);
namespace App\Components\Request\ParamConverter;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\ParamConverter;
use Sensio\Bundle\FrameworkExtraBundle\Request\ParamConverter\ParamConverterInterface;
use Symfony\Component\HttpFoundation\Request;
class TokenParamConverter implements ParamConverterInterface
{
public function apply(Request $request, ParamConverter $configuration): bool
{
return true;
}
public function supports(ParamConverter $configuration): bool
{
return true;
}
}
- Метод
supports(ParamConverter $configuration): bool;
проверяет, что ParamConveter может быть применен с данными, предоставленными в $configuration. Если все в порядке, результатом будет true. В противном случае будет false и ParamConverter перемещается в другой конвертер. - Метод
apply(Request $request, ParamConverter $configuration): bool;
выполняется при успешном варианте supports и тут мы выполняем нашу логику (преобразование).
Добавим проверку в supports:
public function supports(ParamConverter $configuration): bool
{
return $configuration->getName() === 'token';
}
Если TestController::index(), будет найден атрибут с наименованием token, то мы начнем выполнять метод TokenParamConverter::apply().
Добавим логику в apply:
public function apply(Request $request, ParamConverter $configuration): bool
{
$request->attributes->set(
$configuration->getName(),
$request->headers->get('X-Auth-Token')
);
return true;
}
Во время выполнения наш ParamConverter собирает и преобразует все поддерживаемые атрибуты из переменной attributes запроса $request->attributes->all()
Поэтому мы получаем значение токена из заголовка X-Auth-Token и присваиваем переменной attributes с помощью метода ParameterBag.
Итоговый вид нашего TokenParamConverter:
<?php
declare(strict_types=1);
namespace App\Components\Request\ParamConverter;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\ParamConverter;
use Sensio\Bundle\FrameworkExtraBundle\Request\ParamConverter\ParamConverterInterface;
use Symfony\Component\HttpFoundation\Request;
class TokenParamConverter implements ParamConverterInterface
{
public function apply(Request $request, ParamConverter $configuration): bool
{
$request->attributes->set(
$configuration->getName(),
$request->headers->get('X-Auth-Token')
);
return true;
}
public function supports(ParamConverter $configuration): bool
{
return $configuration->getName() === 'token';
}
}
Наш пользовательский TokenParamConverter завершен. Теперь мы можем им пользоваться. Осталось только добавить его в файле конфигурации config/param-converter.php в ключ с перечислением converters.
<?php
use App\Components\Request\ParamConverter\TokenParamConverter;
use Sensio\Bundle\FrameworkExtraBundle\Request\ParamConverter\DateTimeParamConverter;
return [
'request' => [
'converters' => true,
],
'converters' => [
DateTimeParamConverter::class,
TokenParamConverter::class
]
];
При передаче заголовка X-Auth-Token со значением fa8426a0-8eaf-4d22-8e13-7c1b16a9370c на наш TestController::index() возвращается следующая структура:
{
"token": "fa8426a0-8eaf-4d22-8e13-7c1b16a9370c"
}