Laravel 路由可选参数到控制器
Posted
技术标签:
【中文标题】Laravel 路由可选参数到控制器【英文标题】:Laravel route optional parameter to controller 【发布时间】:2020-09-01 17:05:25 【问题描述】:您好,请帮我解决以下问题,
在 Laravel 5.5 上
我有以下路线:
这个有效:
Route::delete('/delete-comment/id', 'CommentController@destroy');
这个不起作用,因为我使用与上述路由相同的方法,并且没有不需要的第一个参数're_id':
Route::delete('/your-template/re_id/delete-comment/id', 'CommentController@destroy');
方法是:
public function destroy($id)
//do something
我想对子路由 're_id' 使用不带第一个参数的相同方法。
我不需要这种解决方案,因为我想对两条路线使用相同的功能。
public function destroy($re_id= '' $id)
//do something
有没有办法忽略路由上的第一个参数“re_id”或更通用的方法来在路由上的第一个片段上使用 slug,例如:
哪个 btw 不起作用:
Route::delete('/slug?/delete-comment/id', 'CommentController@destroy');
【问题讨论】:
【参考方案1】:在 php 中,可选参数通常必须在末尾...
例如,这将导致 PHP v7.1 中出现致命错误^
function test($first = null, $second)
echo $first .' '.$second;
test('string');
在你的情况下,我会这样尝试(不确定它是否会起作用)
Route::delete('/delete-comment/id/slug?', 'CommentController@destroy');
public function destroy($id, $re_id = null)
//do something
【讨论】:
这是一个嵌套路由,所以我需要它的显示方式 Route::delete('/your-template/re_id/delete-comment/id ', 'CommentController@destroy'); 你的大约。看起来不错,但遗憾的是不适合我的情况。【参考方案2】:如果有人对此感到困惑,我有一个解决方案:
1.- 创建一个配置文件'route.php'
<?php
return [
'filters' => [
// Routes
'your-template/re_id/delete-comment/id',
'your-template/re_id/update-comment/id',
'article' => [
// Route arguments name
're_id',
]
]
];
2.- 使用命令创建中间件:
php artisan make:middleware RouteArgumentsFilterMiddleware
<?php
namespace App\Http\Middleware;
use Closure;
class RouteArgumentsFilterMiddleware
/**
* Handle an incoming request.
*
* @param \Illuminate\Http\Request $request
* @param \Closure $next
* @return mixed
*/
public function handle($request, Closure $next)
$config = config('route.filters');
if (in_array($request->route()->uri, $config))
foreach ($config['article'] as $argument)
$request->route()->forgetParameter($argument);
return $next($request);
3.- 在您的 web.php 文件中将中间件添加到所需的路由:
Route::delete('/your-template/re_id/delete-comment/id', 'CommentController@destroy')->middleware('param_filter');
Route::put('/your-template/re_id/update-comment/id', 'CommentController@update')->middleware('param_filter');
4.- 运行 composer dump-autoload
然后发送到控制器时将忽略所需的参数。
【讨论】:
以上是关于Laravel 路由可选参数到控制器的主要内容,如果未能解决你的问题,请参考以下文章