Symfony: как получить параметр из маршрута внутри FormType?
Я пытаюсь получить доступ к параметру page из текущего маршрута в пределах FormType. Он работает в Controller, но не в FormType. Я хотел бы избежать передачи параметра типа /?page=1 и предпочесть /page/1.
Маршрутизация.yml
my_route:
path: /data/page/{page}
defaults:
_controller: MyBundle:MyController:myAction
Src / myBundle / Form / Type / MyFormType.php
class MyFormType extends AbstractType {
// ...
public function buildForm(FormBuilderInterface $builder, array $options) {
$request = Request::createFromGlobals();
$page = $request->query->get('page');
echo "page: $page"; // empty
// ...
}
}
Я хотел бы избежать передачи параметра через контроллер в FormType и предпочитаю обращаться к нему непосредственно в FormType.
Любой идеи?
Заранее спасибо!
Редактировать:
Относительно выбранного ответа;page атрибут доступен через $request->attributes->get('page'), а не через $request->query->get('page').
2 ответов:
Для этого необходимо ввести службу стека запросов в тип формы:
class MyFormType extends AbstractType { private $requestStack; public function __construct(RequestStack $requestStack) { $this->requestStack = $requestStack; } public function buildForm(FormBuilderInterface $builder, array $options) { $request = $this->requestStack->getCurrentRequest(); //do something: for example hide/show fields from request parameters } }Зарегистрируйте тип формы и их зависимости:
services: app.form.type.myform: class: AppBundle\Form\Type\MyFormType arguments: ['@request_stack'] tags: - { name: form.type }
Однако вместо этого рекомендуется создать новую опцию для передачи всех переменных, необходимых для вашего типа формы.
Я не уверен, что ответ, предоставленный Yonel, является лучшим, потому что вы вводите зависимость в свою форму. У него есть некоторые недостатки, и главный из них-это то, что он затруднит тест, так как зависимость от параметра страницы скрыта.
Лучшим решением будет добавить его в качестве опции формы в вашу форму.
Объект запроса уже доступен в вашем контроллере, и вы, вероятно, создаете свою форму следующим образом:
$form = $this->createForm(WhateverFormType::class, $entity)Используя метод createForm, вы можете введите третий аргумент, который является параметрами (т. е. дополнительными данными), которые вы хотите передать в свою форму.
Итак, в вашем контроллере:
$page = $request->query->get('page'); $form = $this->createForm(WhateverFormType::class, $entity, ['page' => $page]);И в вашем типе формы следуйте примеру, приведенному в этом ответе на тот же вопрос: https://stackoverflow.com/a/10922788/2721918
Comments