Реализация фронт-контроллера Yii до маршрутизации

Я хочу реализовать сеттер языка для всех контроллеров, и мне нужно запустить этот метод перед маршрутизацией к контроллеру -> передний контроллер.

Если в моем классе контроллера реализован метод, но для некоторых применений его необходимо запустить раньше, до инициализации контроллера.

class Controller extends CController
{
  public function __construct($id, $module = null)
  {


    // Set the application language 

    if (isset($_GET['language']))
    {
        $lang = $_GET['language'];

person Sebastian Viereck    schedule 22.07.2013    source источник


Ответы (2)


Вы можете использовать событие приложения onBeginRequest. Обычно для этого требуется, чтобы вы добавили некоторый код в файл index.php. Вот краткий пример:

$app = Yii::createWebApplication($config);
$app->onBeginRequest = function($event) {
    // ... whatever you want to do
}
$app->run();

Конечно, вместо замыкающей функции вы также можете подключить любой другой допустимый обратный вызов. .

person Michael Härtl    schedule 22.07.2013

Вы можете переопределить beforeAction($action)

class Controller extends CController
{
  public function beforeAction($action)
  {
    $language = !empty($_GET['lang']) ? $_GET['lang'] : 'en';
    return parent::beforeAction($action);
  }
}
person Nikita Melnikov    schedule 22.07.2013
comment
beforeAction выполняется после функции __construct не раньше - person Sebastian Viereck; 22.07.2013