yii扩展:如何访问位于扩展内部的控制器

时间:2014-12-22 20:19:36

标签: php yii yii-extensions yii-routing yii-widgets

我正在尝试为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')从views文件夹中显示表单。因此扩展成功加载。 当我尝试访问扩展文件夹内的控制器时出现问题。

通常当需要访问例如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',
      ),
   ),
  -------------
  -------------

 )

请在这种情况下给我任何暗示。 提前谢谢。

1 个答案:

答案 0 :(得分:1)

我在许多项目中使用minScript扩展,我知道这个扩展从其自己的目录加载一个控制器。

您走在正确的道路上,但是您以错误的方式引用了控制器。

minScript扩展程序是这样的:

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

如您所见,不需要导入。我想"分机"已经是扩展目录的别名,你也可以写:" application.extensions。"代替。

链接到controllerMap配置上的文档。参数: 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网址区分大小写。所以像" xyz / index"如果控制器名为XYZController,则无效。

不需要导入/路径别名。至少不适用于控制器。您可能需要导入来加载扩展文件的其余部分,例如模型,窗口小部件等,但正如Aleksei所指出的,Yii不会递归导入,因此您应该逐个导入所有目录。您的扩展程序包含您希望自动加载它们的类。

从扩展程序导入所有内容的示例:

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

最后一件事,我不知道您的扩展程序会做什么,但如果您要拥有大量控制器,则可以考虑开发一个模块。

扩展只是普通目录,包含一些可以导入应用程序并使用的工具。但是如果你的扩展名是" mini"应用程序,有许多控制器,作为模块管理会更容易,因为在模块中,所有控制器在加载模块时自动加载,其结构与完整的Yii应用程序非常相似。

如果您需要一个模块,我认为Gii代码生成工具可以为您制作一个。