Search code examples
phplaravellaravel-5.5

2 parameters id and lang route middleware locale group don't work - Laravel 5.5


I dont have a problem with the single-parameter url or route in the middleware group. But I get an error when there are two parameters (lang and id) such as show or edit. The codes are as follows. Where am I making mistakes?

File path app/Http/Middleware

Locate.php

<?php

namespace App\Http\Middleware;

use Closure;

class Locale
{
    /**
     * Handle an incoming request.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Closure  $next
     * @return mixed
     */
    public function handle($request, Closure $next)
    {
        if ($request->method() === 'GET') {
            $segment = $request->segment(1);

            if (!in_array($segment, config('app.locales'))) {
                $segments = $request->segments();
                $fallback = session('locale') ?: config('app.fallback_locale');
                $segments = array_prepend($segments, $fallback);

                return redirect()->to(implode('/', $segments));
            }

            session(['locale' => $segment]);
            app()->setLocale($segment);
        }

        return $next($request);
    }
}

route file web.php

Auth::routes();
Route::prefix('{lang?}')->middleware('locale')->group(function($lang=null) {
    Route::get('/', 'HomeController@index');
    Route::get('reservation-edit/{id}', 'ReservationController@reservationEdit');

});

blade file

{{ route ('reservations.update', ['lang'=> $lang, 'id' => $reservation->id]) }}

Controller file

public function reservationEdit($id){
        $check = Reservation::find($id);
        $this->authorize('view', $check);
        $hotels = DB::table('hotels')->select('hotel_name', 'id')->get();
        return view('reservations.reservation-edit', ['reservation' => Reservation::findOrFail($id)], ['hotels' => $hotels]);
    }

Solution

  • In your middleware 'Locale', use forgetParameter to transfert only the id param to your controller.

    app()->setLocale($request->segment(1));
    $request->route()->forgetParameter('locale');
    return $next($request);