【问题标题】:CakePHP 2.5 plugin routes not loadingCakePHP 2.5 插件路由未加载
【发布时间】:2014-09-08 01:33:32
【问题描述】:

我正在尝试将站点从 2.4 更新到 CakePHP 2.5,但由于某种原因,它忽略了我的插件中的路由。我发现 CakePlugin::loadAll 需要更新为以下内容:-

CakePlugin::loadAll(array(array(
    'MyPlugin' => array(
        'routes' => true
    )
)));

但是,它忽略了来自 MyPlugin 的路由(它们似乎根本没有被加载。我的 app/Config/routes.php 文件中有 CakePlugin::routes()

我查看了 CakePlugin 内部,并且 CakePlugin::$_plugins 似乎将 MyPlugin['routes'] 设置为 false。

谁能解释这里出了什么问题?

【问题讨论】:

  • 我认为您不想为所有插件加载所有路由。对于没有路由文件的每个插件,您都会收到错误消息。为什么不简单地基于每个插件加载路由而不是使用 :loadALL ?
  • @AngelS.Moreno 上述内容旨在基于每个插件加载路线,并且过去一直为我们工作。这就是插件具有“'routes' => true”参数的原因。可以使用 loadAll 来包含它们存在的所有插件路由而不会出错(顺便解决了我的问题,尽管并不理想): CakePlugin::loadAll(array(array('routes' => true, 'ignoreMissing' = > true), 'MyPlugin' ));
  • 真的。我只是在您的示例中看不到 'ignoreMissing' => true 参数。难道是有一个没有路由的插件,它使所有后续路由都不包括在内?您提到添加参数'ignoreMissing' => true 可以解决您的问题。为什么不理想?
  • @AngelS.Moreno 我的问题中的示例是更复杂插件加载的简化版本。它应该只为具有'routes' => true 的插件加载路由,但这不起作用。更改我的代码以使用带有'ignoreMissing' => true 的全局包含路由解决了这个问题(感谢下面Rakesh 回答中的cmets)。这并不理想,因为这意味着即使我不希望它们用于特定插件,它也会加载所有插件路由。希望这能让事情更清楚。
  • 所以你认为你的代码应该像这样运行:加载所有插件,但只加载那些有路由的插件?我对您的目标和预期结果有些困惑。 LoadAll 加载所有插件。如果您想手动选择要加载的插件或要加载路由的插件,请不要使用 loadAll。我误会你了吗?

标签: cakephp cakephp-2.5


【解决方案1】:

我查看了 CakePlugin::loadAll() 函数,看起来你以错误的方式使用函数参数。

这是一个实际的函数:

public static function loadAll($options = array()) {
    $plugins = App::objects('plugins');
    foreach ($plugins as $p) {
        $opts = isset($options[$p]) ? (array)$options[$p] : array();
        if (isset($options[0])) {
            $opts += $options[0];
        }
        self::load($p, $opts);
    }
}

转换为 - 对于每个插件:

  • 检查选项是否将插件名称作为键,如果是,则将其值视为插件设置
  • 如果选项有数字键 (0),即没有任何键名的选项,则将其视为全局插件设置并将其添加到每个插件的设置中

只需在选项中删除多余的数组,就可以了。

CakePlugin::loadAll(array(
    'MyPlugin' => array(
        'routes' => true
    )
));

【讨论】:

  • 这是我们最初拥有代码的方式,但它没有加载该表单中的任何插件。根据 Cake 2.5 中的示例代码,正如我在示例代码中展示的那样,它对插件进行了双重包装。感觉不对,但是没有那个额外的 array() 就找不到插件了。
  • @drmonkeyninja 即使在示例中,也没有双数组。只是第一个元素是没有键的数组。你可以把它读成: CakePlugin::loadAll(array( 0 => array('bootstrap' => true), 'MyPlugin' => array( 'routes' => true ) ));
  • 如果我传递一个没有键的数组作为第一项它确实有效,但这似乎不正确,尽管它解决了问题。这修复了它: CakePlugin::loadAll(array( [], 'MyPlugin' => array( 'routes' => true ) ));
猜你喜欢
  • 2012-08-23
  • 2012-04-09
  • 1970-01-01
  • 2014-07-10
  • 2012-12-03
  • 2016-09-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多