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').

644   2  

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

    Ничего не найдено.