'Laravel - Missing required parameters [Route: {$route->getName()}] with Route::currentRouteName();

I have do the multiple lang for my project with use the middleware SetLanguage::class to run with change language. all page working well but only when I go to the access book_edit page will pop up this error. And I try to debug find the error, I found it the error with my app.blade.php the language selected option there. May i know why the issue with it, and have the better solution to do multiple language for the project ?

this is the error with go book_edit function

web.php

Route::redirect('/' , 'cn');

Route::get('dashboard', function () {
    return redirect()->route('home' , ['language' => app()->getLocale() ?? 'cn']);
});

Route::group([
    'prefix' => '{language}' ,
    'where' => ['language' => '[a-z]{2}']
], function(){

    
    Route::get('/', function () {
        return view('auth.login');
    })->name('login');

    Auth::routes();

    Route::group(['middleware' => ['auth']], function(){

        Route::get('allbook', [
            'uses' =>'BookController@listBook',
            'as' => 'book_index'
        ]);

        Route::get('dashboard', 'HomeController@index')->name('home');

        Route::get('addcategory', 'BookController@categoryPage')->name('addCategory');

        Route::post('addcategory','BookController@addnewCategory');

        Route::get('addbook', 'BookController@addBook')->name('addbook');

        Route::get('profile',function(){
            return view('book.profile');
        });

        Route::get('book/edit/{id}', [
            'uses' =>'BookController@edit',
            'as' => 'book_edit'
        ]);

        Route::post('addbook','BookController@insertBook');

        Route::post('book/update/{id}', [
            'uses' =>'BookController@update',
            'as' => 'book_update'
        ]);

        Route::post('book/delete/{id}', [              // this is the directory show in url
            'uses' => 'BookController@delete',          // this is get the BookController @delete method
            'as' => 'book_delete'                      // this is the value you can use "route('book_delete') to run it post"
        ]);

    });

});

app.blade.php

I have try dd debug and found this is the error to cause Missing required parameters is (Route::currentRouteName()) this function but if I comment it then can work. But i use this dropdown menu to select language on project.

<ul class="dropdown-menu" aria-labelledby="navbarScrollingDropdown">
      {{-- <li><a class="dropdown-item" href="#">{{ Str::upper($test)}}</a></li> --}}
      <li><a class="dropdown-item" href="{{ route(Route::currentRouteName(), 'en' ) }}">EN</a></li> 
     <li><a class="dropdown-item" href="{{  route(Route::currentRouteName() , 'cn' ) }}">CN</a></li>
</ul>

kernal.php

I have define the SetLanguage::class on middlewaregroup.

protected $middlewareGroups = [
        'web' => [
            \App\Http\Middleware\EncryptCookies::class,
            \Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class,
            \Illuminate\Session\Middleware\StartSession::class,
            // \Illuminate\Session\Middleware\AuthenticateSession::class,
            \Illuminate\View\Middleware\ShareErrorsFromSession::class,
            \App\Http\Middleware\VerifyCsrfToken::class,
            \Illuminate\Routing\Middleware\SubstituteBindings::class,
            \App\Http\Middleware\SetLanguage::class,
        ],

        'api' => [
            'throttle:60,1',
            \Illuminate\Routing\Middleware\SubstituteBindings::class,
        ],
    ];

    /**
     * The application's route middleware.
     *
     * These middleware may be assigned to groups or used individually.
     *
     * @var array
     */
    protected $routeMiddleware = [
        'auth' => \App\Http\Middleware\Authenticate::class,
        'auth.basic' => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class,
        'bindings' => \Illuminate\Routing\Middleware\SubstituteBindings::class,
        'cache.headers' => \Illuminate\Http\Middleware\SetCacheHeaders::class,
        'can' => \Illuminate\Auth\Middleware\Authorize::class,
        'guest' => \App\Http\Middleware\RedirectIfAuthenticated::class,
        'password.confirm' => \Illuminate\Auth\Middleware\RequirePassword::class,
        'signed' => \Illuminate\Routing\Middleware\ValidateSignature::class,
        'throttle' => \Illuminate\Routing\Middleware\ThrottleRequests::class,
        'verified' => \Illuminate\Auth\Middleware\EnsureEmailIsVerified::class,
        // 'language' => \App\Http\Middleware\SetLanguage::class,
    ];

SetLanguage.php

This is the middleware file for allow user apply multiple language all page

<?php

namespace App\Http\Middleware;

use Closure;

class SetLanguage
{
    /**
     * Handle an incoming request.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Closure  $next
     * @return mixed
     */
    public function handle($request, Closure $next)
    {
        // dd($request);
        \App::setLocale($request->language);

        return $next($request);
    }
}



Solution 1:[1]

in the Laravel documentation you can see how to get the current route: https://laravel.com/docs/5.2/routing#accessing-the-current-route.

$route = Route::current();
 
$name = $route->getName();
 
$actionName = $route->getActionName();

Remember that the "Route::" you need to import to your middlewhere is the one in Illuminate\Support\Facades\Route;

So, in your app.blade.php file:

<ul class="dropdown-menu" aria-labelledby="navbarScrollingDropdown">
    {{-- <li><a class="dropdown-item" href="#">{{ Str::upper($test)}}</a></li> --}}
    <li><a class="dropdown-item" href="{{ route(Illuminate\Support\Facades\Route::currentRouteName(), 'en') }}">EN</a></li> 
   <li><a class="dropdown-item" href="{{  route(Illuminate\Support\Facades\Route::currentRouteName() , 'cn' ) }}">CN</a></li>
</ul>

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1 Alejandra Jorge