Yii - 子目录中的控制器

时间:2011-07-10 11:13:14

标签: yii

我遇到了Yii Framework路由问题。

我已经创建了控制器,我们称之为TestController.php

然后,我需要把它放到一个名为Make的子目录中,所以我的结构看起来像:

controllers/TestController.php
controllers/Make/TestController.php

对于ocurse,如果我更改它的名称,它可以正常工作但是有没有办法在控制器目录和子目录中放置一个同名的控制器?

修改
我的URLManager配置如下:

'urlManager'=>array(
            'showScriptName' => false,
            'urlFormat'=>'path',
            'rules'=>array(
                'gii' => 'gii',
                'gii/<controller:\w+>' => 'gii/<controller>',
                'gii/<controller:\w+>/<action:\w+>' =>                                                      'gii/<controller>/<action>',
'<controller:\w+>/<id:\d+>'=>'<controller>/view',
'<controller:\w+>/<action:\w+>/<id:\d+>'=>'<controller>/<action>',
'<controller:\w+>/<action:\w+>'=>'<controller>/<action>',
            ),
        ),

我有一个控制器Bookmarks。由于我还有一些与书签相关的内容,我需要创建一个目录bookmarks并在其中放置一些控制器,例如Categories

不能强迫它发挥作用。

编辑2
刚检查清洁应用程序。它似乎是一个Yii bug(?)。

编辑3
我按照建议更改了导入配置:

'import'=>array(
        'application.models.*',
        'application.components.*',
        'application.controllers.bookmarks.*'
    ),

我还创建了正确的路线规则'bookmarks/<controller:\w+>/<action:\w+>'=>'bookmarks/<controller>/<action>',

我的文件结构如下:

BookmarksController.php
bookmarks/CategoriesController.php

以下是抛出的异常:

  

异常'CHttpException',消息'系统无法找到   请求的行动“类别”。'在   /home/root/www/yiitesting/framework/web/CController.php:477

4 个答案:

答案 0 :(得分:4)

在创建任何子目录之前,请注意Yii自动加载功能不搜索子目录:Yii想要在Controller的情况下自动加载TestController类,因此在导入声明中添加application.controllers.Make。*:

'import'=>array(
     .....
     'application.controllers.Make.*',
 ),

当然你必须在urlManager中添加一个规则来帮助Yii查找正确的控制器,就像@ldg一样。

注意:在这种情况下,Yii将为视图查找views / Make / *。

答案 1 :(得分:2)

您应该可以使用以下条目更新您的网址管理员:

'urlManager'=>array(
  'urlFormat'=>'path',
  'rules'=>array(
  'Make/<controller:\w+>/<action:\w+>'=>'Make/<controller>/<action>',
  ...

然后通过/ Make / test [/ action]

访问该控制器

答案 2 :(得分:1)

我的nginx配置:

  

重写^ /(。*)/ index.php last;

我的Yii urlManager配置:

    'urlManager'=>array(
        'urlFormat'=>'path',
        'showScriptName' => false, 
        'rules'=>array(
              '<controller:\w+>/<action:\w+>'=>'<controller>/<action>',
              '<path:\w+>/<controller:\w+>/<action:\w+>'=>'<path>/<controller>/<action>',
            )
        ),

以下urlManager配置也有效:

    'urlManager'=>array(
        'urlFormat'=>'path',
        'showScriptName' => false,
        'rules'=>array(
              '<controller:\w+>/<action:\w+>'=>'<controller>/<action>',
              '<abc:\w+>/<controller:\w+>/<action:\w+>'=>'<abc>/<controller>/<action>',
            )
        ),

答案 3 :(得分:0)

您是否尝试访问/ Make / test而不是/ test?此功能应该开箱即用。干杯