繁体   English   中英

Laravel 路由可选参数到 controller

[英]Laravel route optional parameter to controller

您好,请帮我解决以下问题,

在 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”使用不带第一个参数的相同方法。

我不需要这种解决方案,因为我想对两条路线使用相同的 function。

public function destroy($re_id= '' $id)
{
   //do something
}

有没有办法忽略路线上的第一个参数're_id'或更通用的方法在路线的第一个片段上使用 slug ,例如:

哪个顺便说一句不起作用:

Route::delete('/{slug?}/delete-comment/{id}', 'CommentController@destroy');

在 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
}

如果有人卡在这上面,我有一个解决方案:

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 工匠制作:中间件 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

然后发送到 controller 时将忽略所需的参数。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM