【问题标题】:yii extensions: how to access controller which is located inside extensionyii 扩展:如何访问位于扩展内部的控制器
【发布时间】:2014-12-22 20:19:35
【问题描述】:

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

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

 )

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

【问题讨论】:

  • 您正在编写应用程序组件 (yiiframework.com/doc/guide/1.1/en/…) 或模块 (yiiframework.com/doc/guide/1.1/en/extension.create#module)?如果两者都不是,只需在您的配置文件中导入extensions.XYZ.controllers.*
  • 我已经这样做了 'application.extensions.XYZ.*' ,所以应该包括 XYZ 文件夹中的所有内容。
  • Yii 不会递归地从子文件夹导入类,所以你应该使用完整的文件夹别名包含来自controllers 的类。
  • @AlexAkr 实际上我尝试以您编写的方式导入类,但仍然没有结果......
  • @stratovarius 显示你的protected/config/main.php

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


【解决方案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 url 区分大小写。因此,如果控制器名为 XYZController,则类似“xyz/index”的路由将不起作用。

并且不需要导入/路径别名。至少对于控制器来说不是。您可能需要导入来加载扩展的其余文件,例如模型、小部件等,但正如 Aleksei 指出的那样,Yii 不会递归导入,因此您应该一一导入包含类的扩展的所有目录你想让它们自动加载。

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

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

最后一件事,我不知道你的扩展是做什么的,但如果你有很多控制器,你可能会考虑开发一个模块。

扩展只是简单的目录,其中包含一些您可以导入应用程序并使用的工具。但是如果你的扩展是一个“迷你”应用程序,有很多控制器,那么作为一个模块来管理会更容易,因为在一个模块中,所有控制器都会在模块加载时自动加载,并且它的结构与完整的 Yii 应用程序非常相似。

如果你需要一个模块开始,我认为 Gii 代码生成工具可以为你做一个。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多