[英]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.