Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Laravel:用于确定使用哪个控制器的中间件_Laravel_Laravel 5_Laravel 5.2 - Fatal编程技术网

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

Laravel:用于确定使用哪个控制器的中间件,laravel,laravel-5,laravel-5.2,Laravel,Laravel 5,Laravel 5.2,我正在构建一个网站,它通过javascript加载所有页面和内容,同时还操纵浏览器地址栏(给人一种正常的、可导航的网站的错觉,每个页面都有自己的URL)。作为备用方案,为了搜索引擎的利益,这些页面还必须能够在各自的URL上正常加载 为此,我需要让Laravel知道是否通过ajax调用或正常HTTP请求请求页面数据。我想,在这种情况下,我会使用中间件。我希望能够使用两个不同的控制器处理页面;一个用于ajax,一个用于HTTP 即: 这可以用中间件处理吗?我能找到的所有示例似乎都假设控制器已经是给定

我正在构建一个网站,它通过javascript加载所有页面和内容,同时还操纵浏览器地址栏(给人一种正常的、可导航的网站的错觉,每个页面都有自己的URL)。作为备用方案,为了搜索引擎的利益,这些页面还必须能够在各自的URL上正常加载

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

即:


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

我使用
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的URL

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
编辑
我阅读了评论表单,RouteServiceProvider也可以这样做,但是您仍然有两个不同的URL。您必须管理另一个routes文件,但任何适合您的文件。

我认为您需要使用
RouteServiceProvider
来实现这一点。只使用中间件是不可能的。中间件通常是在识别路由并应用中间层,然后是控制器之后触发的。@MinaAbadir您的评论将意味着在运行中间件时,选择要传递给哪个控制器的选项仍然是开放的-这是我希望/假设的。但看起来Laravel实际上只能在路由和控制器都已经确定之后才能运行中间件;在中间件中切换控制器是不可能的(?)@Inigo我的评论暗示,这是不可能的。因为Laravel中的路由需要附加到该路由的操作。因此,一旦确定了路线,就选择了行动。中间件已连接到操作/控制器。是的,明白了。在这种情况下,中间件的名称有些误导,因为本质上它不是route->middleware->controller,而是route+contoller->middlewareThanks作为您的答案。好的,我们将把if/else放在routes.php文件中。我本来希望有更优雅一点的东西,但我想这是最直接的方式。根据OP,我的情况取决于URL是否相同,因此不能使用其他建议。请注意,if语句应该测试
Request::ajax
。因此,我的代码如下:
if(Request::ajax()){Route::get('/',['as'=>'api.home','使用'=>'api_Controller@index']);}其他{Route::get('/',['作为'=>'主页','使用'=>'Primary@index“]);}
@Inigo很抱歉,我本来打算同时使用ajax和json的。我把它放在我的代码中,因为如果没有这两个,我偶尔会得到一个假阴性。我更新了我的答案。
App/Http/Controllers/Api/ItemsController.php
App/Http/Controllers/ItemsController.php