基于中间件的条件路由

时间:2018-11-05 12:02:47

标签: php laravel laravel-5 routing middleware

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

试图创建两个不同的中间件(具有/具有会话值),但是后一个路由组仍然会覆盖前一个。有什么线索吗?也许需要其他方法吗?

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 ...?
    }
}

谢谢!

2 个答案:

答案 0 :(得分:1)

如果您仅检查else是否可行,则可以使用路由闭包在路由中添加需要动态的条件。

下面是一个示例:

session()->has('something')

Route::get('/', function() { $controller = session()->has('something')) ? 'SecondController' : 'FirstController'; app('app\Http\Controllers\' . $controller)->index(); }); 是控制器类中的方法。

答案 1 :(得分:0)

我们几乎遇到了同样的问题,这就是我所做的。 (我没有使用中间件)。

在我的SELECT monthname, description FROM (VALUES (1, 'January'), (2, 'February'), (3, 'March'), (4, 'April'), (5, 'May'), (6, 'June'), (7, 'July'), (8, 'August'), (9, 'September'), (10, 'October'), (11, 'November'), (12, 'December') ) AS va(monthnumber, monthname) LEFT JOIN yourdata ON DATEPART(MONTH, fdate) = va.monthnumber ORDER BY monthnumber 中,我使用了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 if