如果可选参数不在列表中,则Laravel处理默认路由

时间:2016-01-30 14:51:07

标签: php laravel laravel-5 laravel-5.1 laravel-routing

我在路线中定义了可选参数“type”,并用where子句限制了可接受的值(A,B或C):

Route::get('test/{type?}', ['uses' => 'MyController@index'])->where('type', 'A|B|C');

如果类型值与A不同,则B或C(例如“X”)框架返回错误页面:

NotFoundHttpException in RouteCollection.php

在这种情况下,我想忽略收到的可选参数和句柄路由,因为它没有指定参数,即:test/

如何实施?

1 个答案:

答案 0 :(得分:4)

通过允许类型参数的值不在正则表达式条件中,意味着where方法在这种情况下无用。但是,您可以将逻辑移动到中间件并在那里处理它。以下是步骤:

1。通过在Laravel目录中运行此命令,创建一个新的中间件,让我们称之为OptionalType

php artisan make:middleware OptionalType

2. 上一个命令在名为app/Http/Middleware的{​​{1}}中创建了一个文件。该文件的内容应如下所示:

OptionalType.php

3. 接下来,您需要将中间件注册为namespace App\Http\Middleware; use Closure; class OptionalType { protected $allowedTypes = ['A', 'B', 'C']; /** * Handle an incoming request. * * @param \Illuminate\Http\Request $request * @param \Closure $next * @return mixed */ public function handle($request, Closure $next) { $route = $request->route(); // If the `type` parameter value is not within the allowed list // set the value to `null` which is as if it was not passed if (!in_array($route->parameter('type'), $this->allowedTypes)) { $route->setParameter('type', null); } return $next($request); } } 中的路由中间件:

app/Http/Kernel.php

4. 现在您可以将中间件添加到您的路由中(不再需要protected $routeMiddleware = [ ... 'type' => \App\Http\Middleware\OptionalType::class, ]; 条件,因为逻辑现在位于中间件中):

where

现在当您将Route::get('test/{type?}', ['middleware' => 'type', 'uses' => 'MyController@index']); AB以外的任何内容传递到路线时,参数将变为C,就好像它甚至没有通过

您可以在Laravel Documentation中了解有关中间件的更多信息。