簡體   English   中英

Symfony:如何從FormType中的路由獲取參數?

[英]Symfony: how to get a parameter from the route within a FormType?

我正在嘗試從FormType的當前路由訪問參數page 它適用於Controller ,但不適用於FormType 我想避免傳遞像/?page=1和prefer /page/1

使用routing.yml

my_route:
    path: /data/page/{page}
    defaults:
        _controller: MyBundle:MyController:myAction

SRC / myBundle /表/類型/ 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

        // ...
    }
}

我想避免將參數通過Controller傳遞給FormType,而是希望直接在FormType中訪問它。

有任何想法嗎?

提前致謝!

編輯:關於選定的答案; page 屬性可以通過$request->attributes->get('page') ,而不是通過$request->query->get('page')

我不確定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

您需要將請求堆棧服務注入表單類型來執行此操作:

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 }

但是,建議您創建新選項以傳遞表單類型所需的所有變量。

沒有必要在formtype的構造中注入請求堆棧服務。 您可以使用表單事件偵聽器訪問requestStack,如下所示:

$builder->addEventListener(FormEvents::PRE_SET_DATA, function (FormEvent $event) {
$form = $event->getForm();
$form->getConfig()->getRequestHandler();
// do what you need...
});

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM