@edik89

Как переопределить конкретный метод из модуля в Yii2?

В модуле есть контроллер, у которого есть куча методов. Я хочу переопределить один метод, не правя при этом код самого модуля. Вроде понимаю, что это как-то можно сделать через контейнер внедрения зависимостей, но не до конца понимаю как. В качестве эксперимента создал 2 тестовых контроллера NodeController и MyController, в каждом из которых есть actionTest(). И я хочу переопределить actionTest() из NodeController в MyController, т.е чтобы при вызове этого метода из контроллера NodeController (myloc.ru:8080/node/test) вызывался этот же метод, но из контроллера MyController. Пробовал делать через конструкцию в bootstrap.php :
Yii::$container->set(
    'backend\controllers\NodeController',
    'backend\controllers\MyController'
);

В данном случае вызов myloc.ru:8080/node/test перестает работать и отдается 404 ошибка. Как можно решить эту проблему?
  • Вопрос задан
  • 858 просмотров
Решения вопроса 1
qonand
@qonand
Software Engineer
Насколько я понимаю Вам нужно не переопределить действие контроллера, а подменить его. Т.е. подменить действие одного контроллера - действием другого контроллера. Задача конечно сомнительная, но для ее решения нужно понимать как происходит обработка запросов в Yii, а именно:
1. Пользователь отправляет запрос на сервер
2. Yii разбирает запрос и определяет к какому модулю/контроллеру/действию этот запрос относиться
3. Yii адресует запрос к найденному в п2. действию контроллера

Соответственно что бы подменить запрос c /node/test на /my/test достаточно внести корректировки в процесс разбора URL, это можно сделать например создав соответствующее правило в UrlManager приложения:
'urlManager' => [
    'enablePrettyUrl' => true,
    'showScriptName' => false,
    'rules' => [
        'node/test' => 'my/test'  // все запросы с node/test переадресовывать на my/test
    ]
],


Соответственно таким образом Вы можете подменять действия между контроллерами.
Если же есть необходимость подменить целый контроллер в модуле/приложении тогда стоит воспользоваться свойством controllerMap
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
slo_nik
@slo_nik Куратор тега Yii
Добрый день.
<?php
class MyController extends NodeController
{
      public function actionTest()
      {

      }
}
?>

extends
Ответ написан
@developer007
зачем так делать вообще?

в экшене actionTest NodeController
return Yii::$app->runAction('MyController/test');
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы