在Kohana 3中路由ajax请求


Routing ajax requests in Kohana 3?

在我的bootstrap.php中我有以下代码:

// Check if ajax request
if (isset($_SERVER['HTTP_X_REQUESTED_WITH']) && $_SERVER['HTTP_X_REQUESTED_WITH'] == "XMLHttpRequest")
{
    Route::set('ajax', '(<controller>(/<action>(/<id>)))')
    ->defaults(array(
        'controller' => 'home',
        'action'     => 'index',
    ));
}
Route::set('default', '(<controller>(/<action>(/<id>)))')
    ->defaults(array(
        'controller' => 'home',
        'action'     => 'index',
    ));

'ajax'路由不完整。我想做的是如果请求是通过。那么Kohana应该在我的控制器的子文件夹ajax/中查找控制器。因此,如果 ajax请求然后:

http://localhost/myproject/somecontroller/someaction路由到ajax子文件夹中的某个控制器。如果不是 ajax,那么就使用'default'路由

使用lambda/回调函数/方法,如下所示:

Route::set('ajax', function($uri)
    {
        if (Request::$current->is_ajax() AND $params = Route::get('default')->matches($uri))
        {
            $params['directory'] = 'ajax';
            return $params;
        }
    },
    '(<controller>(/<action>(/<id>)))'
);

参见http://kohanaframework.org/3.2/guide/kohana/routing和http://kohanaframework.org/3.2/guide/api/Route

试试这个:

Route::set('ajax', '(<controller>(/<action>(/<id>)))')
->defaults(array(
    'directory'  => 'ajax',
    'controller' => 'home',
    'action'     => 'index',
));

然而,就我个人而言,我会在同一个控制器中处理AJAX和非AJAX请求,使用Request::current()->$is_ajax来判断它是否是AJAX请求。AJAX的行为与非AJAX的行为可能没有太大的不同,因此将两者放在同一个控制器中可能是有益的。如果在不同的控制器中处理AJAX请求,可能会导致代码重复。