2012-05-11 34 views
1

有什麼方法可以以某種方式預處理控制器數據。我將從會話中獲取param,驗證它並將其指定爲控制器屬性,並將其用作$ this-> myVar在某些控制器的操作中,或者在可能的情況下全部使用它們。使用控制器的構造函數什麼也不給我,我無法訪問請求和會話數據。謝謝!將定製屬性添加到所有symfony2控制器

UPD: 謝謝,jkucharovic,非常好的解決方案。 此外還有一個更骯髒的解決方案,沒有注入:setContainer()方法,它已被直接調用$ controller = new Controller();

use Symfony\Component\DependencyInjection\ContainerAwareInterface, 
    Symfony\Component\DependencyInjection\ContainerInterface; 

class AppServiceController extends Controller { 
private $my_property; 

/** 
    * Used as constructor 
    */ 
public function setContainer(ContainerInterface $container = null) 
{ 
    parent::setContainer($container); 
    $this->my_property = 'foo'; 
    // your controller code 
} 
} 

回答

1

如果要使用__construct方法中的服務,則必須首先使用inject that services。那麼你可以在任何其他方法之前使用它們。例如:

use Symfony\Component\HttpFoundation\Request; 
use Symfony\Component\HttpFoundation\Session; 

public function __construct(Request $request, Session $session) 
{ 
    … 
} 
+0

我可以得到一些細節嗎? – Tauquir

+0

當然:-_)_ – jkucharovic

+0

嗨。我正在使用Symfony2.5並且很新。當我實現你的答案時,我得到以下錯誤:可捕獲的致命錯誤:傳遞給Fried \ FrameworkBundle \ Controller \ SectionController :: __ construct()的參數1必須是Symfony \ Component \ HttpFoundation \ Request的實例,沒有給出。我相信我可能不得不通過這些路線。我可能錯了。你能指導我怎麼能通過控制器中的這兩個變量?謝謝。 – Nis

4

我不知道你想做什麼是非常有用的。每次調用控制器時都會創建一個控制器實例。每次調用控制器時,會話和請求都會有所不同。

我認爲你應該創建一個BaseController類延伸Controller類與快捷方式來訪問您的會話MyVar值。

class BaseController extends Controller 
{ 
    public function getMyVar() 
    { 
     return $this->get('session')->get('MyVarSessionKey'); 
    } 
} 

所有其他控制器將延長從這個BaseController

要獲取請求,只需使用Controller類提供的快捷方法,即Controller::getRequest()

相關問題