2012-05-11 3 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 и совершенно новый. Когда я реализую ваш ответ, я получаю следующую ошибку 'Catchable fatal error: Аргумент 1, переданный Fried \ FrameworkBundle \ Controller \ SectionController :: __ construct() должен быть экземпляром Symfony \ Component \ HttpFoundation \ Request, не указанным,'. Я считаю, что мне, возможно, придется пройти эти маршруты. Я могу быть не прав. Можете ли вы указать, как я могу передать эти 2 переменные в контроллере? Благодарю. – Nis

4

Я не уверен, что вы не хотите делать, очень полезно. Экземпляр контроллера будет создаваться каждый раз, когда вызывается контроллер. Сессия и запрос будут разными при каждом вызове контроллера.

Я думаю, вы должны создать класс BaseController, расширяющий класс Controller с помощью метода ярлыков для доступа к вашему значению MyVar в сеансе.

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

Весь ваш другой контроллер будет простираться от этого BaseController.

Для получения запроса просто используйте метод быстрого доступа, предоставляемый классом Controller, Controller::getRequest().

Смежные вопросы