0

コハナモジュールを作成し、そのモジュール内に動的にルートを作成しています。アプリの他の部分のルートよりもルートを優先させたいのですが。(特にデフォルトのキャッチオールルート)。

これを行う方法について何か考えはありますか?

ありがとう!

======更新:

次のように、モジュールを動的にロードしていることを忘れたと思います。

Kohana::modules(array_merge(array($module_name=>$directory), Kohana::modules()));

次に、次のように、モジュールに対してHMVCリクエストを実行します。

$response = Request::factory('versioned-api')
            ->method('POST')
            ->secure(true)
            ->post(array('data'=>serialize($request))) // Performing a straightforward POST
            ->execute();
4

2 に答える 2

3

Kohana(3.2以降)モジュールとルーティングの優先順位に関する背景:

  1. モジュールは、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回必要であることがわかります(モジュールに存在する場合)。
  2. ルートは、追加された順序で照合されます。同じルート名が使用されている場合も上書きされます。

要約すると、コハナには、ルートをリストの先頭にプッシュする方法はありません。もちろん、問題のモジュールが最初にロードされることを保証することで、問題は解決します(ルートが後で上書きされない限り)。ルートを透過的に拡張できる場合、スタックの先頭にルートを追加することにより、モジュールが後でロードされる場合にこれを実現する方法を以下に示します。

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);
    }
}
于 2012-07-20T04:52:12.267 に答える
2

簡単なルーティングの例を次に示します。

// APPPATH/bootstrap.php
// define route before module loading
Route::set('route1', ...);
// load module list
Kohana::module(array(
    'module1'  => 'module1',
    'module2'  => 'module2',
));
Route::set('catch-all', ...);

module1とmodule2の両方に、に独自のルート(mroute1mroute2)がありinit.phpます。したがって、コハナはこのルーティングシーケンスを使用します。

 1. `route1`    // defined in bootstrap before modules
 2. `mroute1`   // from first module
 3. `mroute2`   // from second module
 4. `catch-all` // this one was loaded after all modules
  1. モジュールコントローラまたはヘルパーのどこかにルートを作成している場合は、ルートの後に追加されることに注意してくださいcatch-all
  2. モジュールの順序を変更できKohana::modules(array('module3' => 'module3') + Kohana::modules());ます。モジュールを並べ替えてmodule3、リストの最初になります。ただし、これはモジュールが初期化される順序には影響しません。以前にすべてKohana::modulesの呼び出しが初期化されていました。モジュールは現在リストの先頭にありますが、他のモジュールの後に初期化されています(http://kohanaframework.org/3.2/guide/api/Kohana_Core#modulesを参照)。
于 2012-07-19T06:33:01.990 に答える