'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 |
