Laravel:用于确定使用哪个控制器的中间件

时间:2016-09-01 16:09:04

标签: laravel laravel-5 laravel-5.2

我正在建立一个网站,它通过javascript加载所有页面和内容,同时还操纵浏览器地址栏(给出了一个正常的,可导航的网站的错觉,每个页面都有自己的URL)。作为后备,并且为了搜索引擎的利益,页面也必须能够正常加载到各自的URL。

为此,我需要让Laravel知道是否通过ajax调用或普通HTTP请求请求页面数据。这 - 我认为 - 这将是我将使用中间件的情况。我希望能够使用两个不同的控制器处理页面;一个用于ajax,一个用于HTTP。

即:

if (Request::ajax()){
    forward request to ajax page controller
}else {
    forward request to standard page controller
}

这可以用中间件来处理吗?我能找到的所有例子似乎都假设控制器已经是给定的。

1 个答案:

答案 0 :(得分:1)

我使用routes.php文件而不是中间件。我相信中间件是在路线确定之后。

if(Request::ajax() || Request::json()){
    Route::get('items', [
        'as' => 'api.posts.index' ,
        'uses' => 'Api\ItemsController@index'
    ]);
} else {
    Route::get('items', [
        'as' => 'posts.index' ,
        'uses' => 'ItemsController@index'
    ]);
}

我是这样做的,因为我喜欢将json和web的网址分开。

Route::get('items', [
    'as' => 'posts.index' ,
    'uses' => 'ItemsController@index'
]);

/**
 * JSON API
 *
 */
Route::group([
         'prefix' => 'api/v1', 
         'as' => 'api.', 
         'namespace' => 'Api'
      ], function () {

    Route::get('items', [
        'as' => 'posts.index' ,
        'uses' => 'ItemsController@index'
    ]);

}

无论哪种方式,你的控制器都会住在这里。

App/Http/Controllers/Api/ItemsController.php
App/Http/Controllers/ItemsController.php

修改

我阅读了GONG的评论表格,而RouteServiceProvider也适用于此,但您仍然会有两个不同的网址。你必须管理另一个路由文件,但任何适合你的。