Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/295.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
Php 基于中间件的条件路由_Php_Laravel_Laravel 5_Routing_Middleware - Fatal编程技术网

Php 基于中间件的条件路由

Php 基于中间件的条件路由,php,laravel,laravel-5,routing,middleware,Php,Laravel,Laravel 5,Routing,Middleware,我需要基于中间件为同一url调用不同的控制器。url必须相同,因此在中间件中重定向不是一个选项。下面的代码是示例,几十个路由的控制器已经完成,因此也没有选项检查会话值 尝试创建两个不同的中间件(会话值为/hasnt),但后一个路由组仍会覆盖前一个。有线索吗?也许需要一种不同的方法 route.php如下所示: Route::group(array('namespace' => 'Admin', 'prefix' => 'admin', 'middleware' => 'auth

我需要基于中间件为同一url调用不同的控制器。url必须相同,因此在中间件中重定向不是一个选项。下面的代码是示例,几十个路由的控制器已经完成,因此也没有选项检查会话值

尝试创建两个不同的中间件(会话值为/hasnt),但后一个路由组仍会覆盖前一个。有线索吗?也许需要一种不同的方法

route.php如下所示:

Route::group(array('namespace' => 'Admin', 'prefix' => 'admin', 'middleware' => 'auth'), function () {

    // set of default routes
    Route::get('/', array('as' => 'admin', 'uses' => 'FirstController@index'))->middleware('admin');
    Route::get('/profile', array('as' => 'profile', 'uses' => 'FirstController@profile'))->middleware('admin');

    Route::group(array('middleware' => 'sessionhassomething'), function () {
        // set of the same routes like above but overwritten if middleware validates    
        Route::get('/', array('as' => 'admin', 'uses' => 'SecondController@index'))->middleware('admin');
        Route::get('/profile', array('as' => 'profile', 'uses' => 'SecondController@profile'))->middleware('admin');
    });
});
SessionHasSomething中间件

class sessionHasSomething {
    public function handle($request, Closure $next)
    {
        if(session()->has("something_i_need_to_be_set")) {
            return $next($request);
        }

        // return what if not set, or ...?
    }
}

提前谢谢

我们几乎有同样的问题,下面是我所做的。(我没有使用中间件)

在我的
blade.php
中,我使用了
@if
@else
@endif

<?php
   use App\Models\User;
   $check = User::all()->count();
?>
@if ($check == '0')
    // my html/php codes for admin
@else
    // my html/php codes for users
@endif

@如果($check='0')
//我的html/php管理员代码
@否则
//我的html/php用户代码
@恩迪夫

您也可以在控制器中执行此操作,使用
if
else

如果您只检查
会话()->是否有('something')
,则可以使用路由闭包来在路由内添加需要动态的条件

以下是一个例子:

Route::get('/', function() {
    $controller = session()->has('something')) ? 'SecondController' : 'FirstController';
    app('app\Http\Controllers\' . $controller)->index();
});

->index()
是控制器类中的方法。

我非常喜欢这种方法,但是所有~100条路由都必须从route.php移动到中间件。这对我来说似乎有点不合适,但它可能会起作用。可以理解,我很快就会找到另一种方法。问题是我们已经完成了刀片和控制器,因此数百个条件必须以这种方式进行。我想避免这种情况。