2014-12-22 3 views
1

Я пытаюсь написать пользовательское расширение для рамки yii, и я не могу получить доступ к контроллеру, который хранится в папке расширения/контроллеров. Я много искал, но я не нашел для этого никакого намека. Это структураyii extensions: как получить доступ к контроллеру, который находится внутри расширения

protected 

-- extensions 
    -- XYZ (Extension's name) 
     -- assets 
     -- controllers 
      -- XYZController.php 
     -- models 
      -- XYZModel.php 
     -- widgets 
      -- views 
       -- form.php 
      -- XYZWidget.php 

Я сделал все настройки, необходимые для загрузки расширения и в настоящее время я могу отобразить форму из папки просмотры с помощью $ this-> renderInternal («просмотров/form.php»). Таким образом, расширение загружается успешно. Проблема возникает, когда я пытаюсь получить доступ к контроллеру внутри папки расширений.

Обычно, когда нужно получить доступ, например, к методу индекса внутри защищенных/контроллеров/SiteController.php, тогда URL-адрес равен http://project.com/index.php/site/index «Поэтому, что я должен писать в действии формы для доступа к любому методу в/extensions/controller/XYZController .php из формы.

Я добавил этот фрагмент кода в main.php, как это было написано в различных рекомендациях

'controllerMap'=>array(
    'XYZ'=>array(
     'class'=> 'XYZ.controllers.XYZController', 
    ), 
), 

конфигурации/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', 
    ), 
    ), 
    ------------- 
    ------------- 

) 

Просьба дать мне какой-либо намек на эту ситуацию. Спасибо заранее.

+0

Вы пишете компонент приложения (http://www.yiiframework.com/doc/guide/1.1/en/extension.create#application-component) или модуль (http://www.yiiframework.com/doc/ руководство/1,1/ен/extension.create # модуль)? Если ни один из них, просто импортируйте 'extensions.XYZ.controllers. *' В свой файл конфигурации. –

+0

Я сделал это как «application.extensions.XYZ. *», Поэтому все в папке XYZ должно быть включено. – johannesMatevosyan

+1

Yii не импортирует классы из подпапок рекурсивно, поэтому вы должны включать классы из 'controllers', используя полный псевдоним папки. –

ответ

1

Я использую расширение minScript во многих своих проектах, и я знаю, что это расширение загружает контроллер из его собственного каталога.

Вы находитесь на правильном пути, но вы неверно ссылаетесь на контроллер.

расширение minScript делает это так:

'controllerMap'=>array(
     'min'=>array(
      'class'=>'ext.minScript.controllers.ExtMinScriptController', 
     ), 
    ), 

Как вы видите, не требуется никакой импорт. Я думаю, «добрый». уже является псевдонимом для каталога расширений, вы также могли бы написать: «application.extensions». вместо.

Ссылка на документы на контроллере. Конфигурация карты. параметр: 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 если у вас есть «индекс» действия. Также имейте в виду, что в среде, отличной от Windows, по умолчанию Yii urls чувствительны к регистру. поэтому такой маршрут, как «xyz/index», не будет работать, если контроллер называется XYZController.

И нет необходимости в импорте/пути. По крайней мере, не для контроллера. Вам может потребоваться импорт для загрузки остальных файлов вашего расширения, таких как модели, виджеты и т. Д., Но, как указал Алексей, Yii не импортирует рекурсивно, поэтому вы должны импортировать по одному все каталоги вашего расширения, которые содержат классы, которые вы хотите, чтобы они были автоматически загружены.

Пример импорта все вещи из расширения:

'ext.activitystream.models.*', 
'ext.activitystream.behaviors.*', 
'ext.activitystream.verbs.*', 
'ext.activitystream.notifications.*', 
'ext.activitystream.widgets.*', 
'ext.activitystream.*', 

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

Расширения - это просто справочники, содержащие какой-либо инструмент, который можно импортировать в приложение и использовать. Но если ваше расширение является «мини» -приложением, с множеством контроллеров, было бы легче управлять как модуль, потому что в модуле все контроллеры загружаются автоматически при загрузке модуля и его структура очень похожа на полное приложение Yii.

Если вам нужен модуль для начала, я думаю, что инструмент генерации кода Gii может сделать его для вас.