【问题标题】:Yii - Controller in subdirectoryYii - 子目录中的控制器
【发布时间】:2011-07-10 11:13:14
【问题描述】:

我遇到了 Yii 框架路由的问题。

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

然后,我需要将它放到一个名为 Make 的子目录中,所以我的结构如下所示:

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

当然,如果我更改它的名称,它可以正常工作,但是有没有办法将同名的控制器放在控制器目录和子目录中?

编辑
我的 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 错误(?)。

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

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

我还创建了正确的路由规则'bookmarks/&lt;controller:\w+&gt;/&lt;action:\w+&gt;'=&gt;'bookmarks/&lt;controller&gt;/&lt;action&gt;',

我的文件结构现在如下:

BookmarksController.php
bookmarks/CategoriesController.php

这是一个被抛出的异常:

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

【问题讨论】:

  • 我在官方 YIi 支持论坛上问了一个问题。这是链接:yiiframework.com/forum/index.php?/topic/…。我也试图重现这个问题(如论坛上发布的那样)并面临同样的问题。似乎使用 Yii 做这样的功能是不可能的——这对我来说真的很奇怪——我无法保证它是正确的答案,因为我几天前才开始使用 Yii(这没问题,但基本上没有足够的经验来使用这个框架提供有用的答案)。
  • 您要访问哪个网址以获取“bookmarks/CategoriesController.php”?如果您转到书签/类别,它应该在 CategoriesController 中查找 actionIndex。确保首先放置“书签”ULR 规则。它应该与 Gii 的路由基本相同,所以如果这对你有用,那么它也应该如此。

标签: yii


【解决方案1】:

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

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

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

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

【讨论】:

  • 这是正常行为!你对这里有什么期待?你只有一个 /bookmarks/ 前缀并且你想在两个控制器之间共享?如果您将 /bookmarks/ 的路由规则放在默认路由之前(“//” => .. ),您可以访问您的 /bookmarks/categories/正常,但 CategoriesControler 无法使用!
  • 你完全正确。由于某种原因,我的方法是错误的。感谢您的努力。
【解决方案2】:

您应该能够使用如下条目更新您的 URL 管理器:

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

然后通过 /Make/test[/action] 访问该控制器

【讨论】:

  • 不幸的是,xception 'CHttpException' with message 'The system is unable to find the requested action "Test"。似乎 Yii 忽略了我的路由规则,它试图在 Test 控制器中搜索 Test 操作,而不是 Make/Test 控制器。很奇怪。
  • 我已经通过在控制器的主目录中创建 MakeTest 控制器暂时解决了这个问题,但我认为必须有其他方法来解决这个问题。
  • 请发布您的网址管理器配置以及您要打开的网址
【解决方案3】:

我的 nginx 配置:

最后重写 ^/(.*) /index.php;

我的 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>',
            )
        ),

【讨论】:

  • 我只做了规则配置,效果很好 '//'=>'//' 我也不得不更改访问控制的路径...
【解决方案4】:

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

【讨论】:

  • 是的,我当然试过了。已引发异常 - 找不到操作。似乎 Yii 在 TestController 中搜索一个动作并忽略了 Make/TestController。有什么想法吗?
  • 我使用 gii 模块添加了 TestController 和 Make/TestController(参见屏幕 here),它对我很有效。如果你看到有很多控制器可以进入模块,你仍然可以创建一个名为 Make 的模块。然而,它不是它的主要用途,它可以这样工作。
  • 是的,让我们暂时忽略其他所有内容。我也在使用 Gii,但路由不起作用。请参阅我对 ldg 回答的评论。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-11-23
  • 2012-01-21
  • 2016-05-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多