2014-01-04 8 views
1

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

В моей интерфейс/конфигурации/main.php У меня есть это:

'controllerNamespace' => 'frontend\controllers', 

Я бы эффективно хотел бы быть в состоянии сделать что-то вроде этого:

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

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

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

Любые идеи? Благодарю.

+0

Могу ли я узнать, почему вы хотите, чтобы все контроллеры находились в одном месте? – Hemc

+0

Я этого не делаю. Я хочу, чтобы некоторые из них были в интерфейсе/контроллерах, а некоторые - в обычных/контроллерах. –

+0

Я работаю над структурой, использующей Yii 1.14 с 5 приложениями на той же модели совместного использования уровня и других библиотеках. Приложения - это интерфейс, консоль, бэкэнд, приложение и api. Я думаю, что это не будет совместимо с дизайном yii 1.X. Я буду рад, если найду способ в Yii 2.0 – Hemc

ответ

0

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

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

0

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

Так что может быть контроллер в 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 не нужно больше быть изменено.

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

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

namespace frontend\controllers; 

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

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