Добавление общего каталога контроллеров в проект yii2

Я хотел бы добавить общий каталог контроллера в свой проект Yii2.

В моем frontend/config/main.php у меня есть это:

'controllerNamespace' => 'frontend\controllers',

Я хотел бы иметь возможность сделать что-то вроде этого:

'controllerNamespace' => ['frontend\controllers', 'common\controllers'],

Но это не правильный способ сделать это. Он выдает ArrayToStringConversionException.

Я играю с расширенным шаблоном из альфа-версии Yii 2. Здесь есть общий каталог моделей (в разделе common/models), и я хотел бы иметь аналогичный общий каталог для контроллеров и представлений (например, в разделе common/controllers и общие/виды).

Есть идеи? Спасибо.


person Mr Goobri    schedule 04.01.2014    source источник
comment
Могу я узнать, почему вы хотите, чтобы все контроллеры были в одном месте?   -  person hemc4    schedule 04.01.2014
comment
Я не знаю, в этом суть. Я хочу некоторые во внешнем интерфейсе/контроллерах и некоторые в общих/контроллерах.   -  person Mr Goobri    schedule 04.01.2014
comment
Я работаю над структурой, используя Yii 1.14, имеющую 5 приложений на модели совместного использования одного уровня и другие библиотеки. Приложения бывают frontend, console, backend, app и api. Я думаю, что это не будет совместимо с дизайном yii 1.X. Буду рад, если найду способ в Yii 2.0   -  person hemc4    schedule 04.01.2014
comment
Вы можете проверить этот шаблон github.com/tonydspaniard/yiinitializr-advanced для ваших нужд, у меня есть использовал структуру 4 приложений с yii 1.x с этим шаблоном довольно успешно без особых проблем   -  person Manquer    schedule 05.01.2014
comment
@Manquer, как именно это помогает? Обычно у него есть какие-либо контроллеры - каждое веб-приложение (например, API, серверная часть и т. д.) имеет только свои собственные контроллеры. Или я неправильно понял? Спасибо.   -  person Mr Goobri    schedule 05.01.2014
comment
Вы также можете включать контроллеры в общие и расширять их в классах контроллеров ваших подприложений, хотя обычно это не делается. Если вам требуются глобально доступные классы и функции, вы должны использовать компоненты, а не контроллеры.   -  person Manquer    schedule 05.01.2014
comment
Вы когда-нибудь находили какое-либо решение или обходной путь для этого?   -  person robsch    schedule 15.07.2015


Ответы (2)


Я меняю каталог контроллеров с «frontend» на «application» и добавляю следующую конфигурацию, например 'controllerNamespace' и 'controllerPath'.

Для пути к моделям я добавил псевдоним вроде этого Yii::setAlias('application', your/path/ . '/application'); 'application' - это имя каталога, в котором находятся ваши модели.

person Oleksandr Mosur    schedule 06.02.2014

Одно (очевидное, простое) решение может заключаться в том, чтобы иметь контроллеры в common/controllers, а затем иметь расширяющие классы в папке контроллеров приложения без какого-либо содержимого.

Так что в common/controllers/ExampleController может быть контроллер:

namespace common\controllers;

class ExampleController extends yii\web\Controller {

    public function actionIndex() {...}
    public function actionView() {...}
    public function actionCreate() {...}
    public function actionUpdate() {...}
    public function actionDelete() {...}
    ...

}

с производным классом в frontend/controllers/ExampleController:

namespace frontend\controllers;

class ExampleController extends \common\controllers\ExampleController {
    // empty class
}

Примечание: параметр controllerNamespace не t нужно изменить больше.

Альтернативным подобным подходом может быть наличие символической ссылки в папке frontend/controllers, которая указывает на класс в common/controllers. Но я не уверен, что это может быть проблемой (символические ссылки могут быть проблемой в системе контроля версий, они могут привести к ошибкам, когда они разрешаются во время выполнения, ...).

Если вы также хотите иметь представления в общем разделе (common/views/example), вы можете переопределить getViewPath() в расширяющем классе, чтобы изменить место, где будут искаться файлы представлений.

namespace frontend\controllers;

class ExampleController extends \common\controllers\ExampleController {
    public function getViewPath() {
        return '@common/views/example';
    }
}

Примечание: чтобы изменить используемый файл макета, вы можете использовать Controller::$layout.

person robsch    schedule 06.12.2016