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 路由可选参数到控制器的主要内容,如果未能解决你的问题,请参考以下文章

php中laravel框架的控制器如何获取路由传过来的可选参数?

Laravel 4:如何传递多个可选参数

Laravel 5,子域路由,带可选参数

原来 laravel 路由 参数可以为可选。。。 很灵活

带有可选参数和 ajax 调用的 Laravel 路由

Laravel 8:如何使隐式模型绑定路由参数可选而不是抛出 404?