Я пытаюсь написать собственное расширение для платформы yii и не могу получить доступ к контроллеру, который хранится в папке extensions / controllers. Я много искал, но не нашел намека на это.
Это структура
protected
-- extensions
-- XYZ (Extension's name)
-- assets
-- controllers
-- XYZController.php
-- models
-- XYZModel.php
-- widgets
-- views
-- form.php
-- XYZWidget.php
Я сделал все корректировки, необходимые для загрузки расширения, и в настоящее время я могу отобразить форму из папки представлений, используя $ this-> renderInternal (‘views / form.php’). Таким образом, расширение успешно загружено.
Проблема появляется, когда я пытаюсь получить доступ к контроллеру внутри папки расширений.
Обычно, когда нужно получить доступ, например, к методу index внутри protected / controllers / SiteController.php, тогда URL http://project.com/index.php/site/index«Поэтому, что я должен написать в действии формы, чтобы получить доступ к любому методу в /extensions/controllers/XYZController.php из формы.
Я добавил этот кусок кода в main.php, как это было написано в различных рекомендациях
'controllerMap'=>array(
'XYZ'=>array(
'class'=> 'XYZ.controllers.XYZController',
),
),
файл config / main.php
Yii::setPathOfAlias('XYZPath', realpath('protected') . '/extensions/AQ');
return array(
-------
-------
'preload'=>array('log', 'XYZ'),
// autoloading model and component classes
'import'=>array(
'application.models.*',
'application.components.*',
'application.extensions.XYZ.controllers.*',
'application.extensions.XYZ.models.*',
'application.extensions.XYZ.widgets.*',
),
'controllerMap'=>array(
'XYZ'=>array(
//'class'=> 'XYZPath.controllers.XYZController',
'class'=> 'extensions/XYZ/controllers/XYZController',
),
),
-------------
-------------
)
Просьба дать мне любую подсказку в этой ситуации.
Заранее спасибо.
Я использую расширение minScript во многих моих проектах, и я знаю, что это расширение загружает контроллер из своего собственного каталога.
Вы на правильном пути, но вы неверно ссылаетесь на контроллер.
Расширение minScript делает это так:
'controllerMap'=>array(
'min'=>array(
'class'=>'ext.minScript.controllers.ExtMinScriptController',
),
),
Как видите, импорт не требуется. Я думаю «доб.» это уже псевдоним каталога расширений, вы могли бы также написать: «application.extensions». вместо.
Ссылка на документы в configMap контроллера. параметр:
http://www.yiiframework.com/doc/api/1.1/CWebApplication#controllerMap-detail
Вы должны всегда проверять код фреймворка, если не уверены, какой параметр передавать куда-либо.
Исходя из этого, вы должны получить что-то вроде:
'controllerMap'=>array(
'min'=>array(
'class'=>'ext.XYZ.controllers.XYZController',
),
),
И вы можете получить к нему доступ через /index.php?r=XYZ/index, если у вас есть действие «index». Также имейте в виду, что в среде, отличной от Windows, по умолчанию URL-адреса Yii чувствительны к регистру. поэтому маршрут типа «xyz / index» не будет работать, если контроллер называется XYZController.
И нет необходимости в псевдониме импорта / пути. По крайней мере, не для контроллера. Вам может потребоваться импорт, чтобы загрузить остальные файлы вашего расширения, такие как модели, виджеты и т. Д., Но, как отметил Алексей, Yii не выполняет рекурсивный импорт, поэтому вы должны импортировать по одному все каталоги вашего расширения, содержащие классы, которые Вы хотите, чтобы они были автоматически загружены.
Пример импорта всего содержимого из расширения:
'ext.activitystream.models.*',
'ext.activitystream.behaviors.*',
'ext.activitystream.verbs.*',
'ext.activitystream.notifications.*',
'ext.activitystream.widgets.*',
'ext.activitystream.*',
И последнее, я не знаю, что делает ваше расширение, но если у вас будет много контроллеров, вы можете вместо этого разработать модуль.
Расширения — это просто каталоги, содержащие инструмент, который вы можете импортировать в приложение и использовать. Но если ваше расширение представляет собой «мини» приложение со многими контроллерами, было бы легче управлять как модулем, потому что в модуле все контроллеры загружаются автоматически, когда модуль загружается, и его структура очень похожа на полное приложение Yii.
Если вам нужен модуль для начала, я думаю, что инструмент для генерации кода Gii может сделать его для вас.
Других решений пока нет …