Kohana(3.2以降)モジュールとルーティングの優先順位に関する背景:
- モジュールは、
Kohana::modules
と呼ばれる順序で初期化されます。これは、ルートに必要な優先順位に基づいて重要です。あなたの例ではKohana::modules(array_merge(array($module_name=>$directory), Kohana::modules()));
、すでに配置されているモジュールはすべてKohana::modules()
初期化されています。新しいモジュールをリストの先頭にマージしている場合でも、モジュールKohana::modules()
は呼び出されたとおりに初期化されます。「system/classes / kohana / core.php」の565行目を見ると、「init.php」が1回必要であることがわかります(モジュールに存在する場合)。
- ルートは、追加された順序で照合されます。同じルート名が使用されている場合も上書きされます。
要約すると、コハナには、ルートをリストの先頭にプッシュする方法はありません。もちろん、問題のモジュールが最初にロードされることを保証することで、問題は解決します(ルートが後で上書きされない限り)。ルートを透過的に拡張できる場合、スタックの先頭にルートを追加することにより、モジュールが後でロードされる場合にこれを実現する方法を以下に示します。
GitHubの要点(単体テストを含む):https ://gist.github.com/3148737
<?php defined('SYSPATH') or die('No direct script access.');
/**
* Route transparently extended. Place in "classes" directory of Kohana 3+ application or module.
*/
class Route extends Kohana_Route
{
/**
* Prepend Route to beginning of stack. If name already exists further in the stack, it is
* removed.
*
* Route::prepend('default', '(<controller>(/<action>(/<id>)))')
* ->defaults(array(
* 'controller' => 'welcome'
* ));
*
* @static
* @access public
* @param string route name
* @param string URI pattern
* @param array regex patterns for route keys
* @return Route
*/
public static function prepend($name, $uri_callback = NULL, $regex = NULL)
{
// Ensure entry does not already exist so it can be added to the beginning of the stack
if (isset(Route::$_routes[$name]))
{
unset(Route::$_routes[$name]);
}
// Create reference
Route::$_routes = array_merge(array($name => NULL), Route::$_routes);
// Overwrite reference
return Route::$_routes[$name] = new Route($uri_callback, $regex);
}
}