2016-09-14 47 views
3

我試圖從FormType內的當前路線訪問參數page。它在Controller中工作,但不在FormType中。我想避免傳遞參數/?page=1,並且更喜歡/page/1Symfony:如何從FormType中的路由獲取參數?

的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 

     // ... 
    } 
} 

我想避免通過控制器來傳遞參數FormType並且喜歡直接在FormType中訪問它。

任何想法?

在此先感謝!

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

+3

如果你有FormType旁路控制器和拉變量從全局變量中,你打敗了使用FormType的目的(而不是直接在Controller中的操作中構建表單)。FormTypes允許您在多個上下文中重用表單 - 您將無法在沒有相同路徑變量的任何路由上重複使用此FormType。 –

+1

@HaydenSchiff好點,我真的同意你,但在我目前的情況下,這是一個可選的方式來設置默認的表單結構。如果路線具有參數,則FormType隱藏一個字段並設置其值。如果不是,則該字段可見並且用戶必須選擇/插入該值。上面的例子只是爲了保持簡單。 –

回答

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 } 

但是,建議改爲創建一個新選項來傳遞你需要的所有變量來爲你的表單類型。

+1

非常感謝。這正是我需要的。我在我的示例'page'中查找的參數現在可以像這樣訪問:'$ request-> attributes-> get('page')'。 –

+0

您應該避免使用構造函數將額外的參數傳遞給您的表單類型,請檢查其他答案。 – COil

3

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

相關問題