简体   繁体   中英

Laravel route optional parameter to controller

Hi please help me with the following,

on Laravel 5.5

I have the following routes:

This one works:

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

This one does not work as I'm using the same method as the above route and does not have the first parameter 're_id' which is not required:

Route::delete('/your-template/{re_id}/delete-comment/{id}', 'CommentController@destroy');

The method being:

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

I want to use the same method without the first parameter for the sub route 're_id'.

I do not need this kind of solution, since I want to use the same function for both routes.

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

Is there a way to ignore the first parameter 're_id' on the route or a more generic way to use a slug on the first fragment on the route like:

Which btw does not work:

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

In PHP generally the optional parameter/s MUST be at the end...

for example this will cause a Fatal Error in PHP v7.1^

function test($first = null, $second)
{
    echo $first .' '.$second;
}

test('string');

In your case I would try it like this (not sure if it will work)

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

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

If anyone gets stuck on this, I got a solution:

1.- Create a config file '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.- Create a Middleware with the command:

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.- On your web.php file add the middleware to the needed routes:

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.- run composer dump-autoload

Then the desired parameter will be ignored when sent to the controller.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

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