Laravel 8 获取当前路由参数
Laravel 8 get current route parameters
我有下拉菜单来更改导航菜单中的区域设置。但我不知道如何获取参数。
如何获取当前参数?
当前参数:slug、quiz_id、id等
导航菜单blade:
<a class="dropdown-item" href="{{route(Route::currentRouteName(),'az')}}"> Az </a>
<a class="dropdown-item" href="{{route(Route::currentRouteName(),'en')}}"> En </a>
我有不同的路线。
Web.php
Route::group(['prefix'=>'{language}'],function(){
Route::get('quiz/{slug}',[MainController::class,'quiz_join'])->name('quiz_join');
Route::get('quiz/{quiz_id}/questions/{id}', [QuestionController::class, 'destroy'] )->whereNumber('id')->name('question.destroy');
});
如果您找不到其他方法并且不存在其他方法,您可以使用 URL::toRoute()
并使用当前路由并从中提取参数:
URL::toRoute($cur = Route::current(), ['language' => 'az'] + $cur->parameters(), true)
你可以为此制作一个宏来简化它:
use Illuminate\Support\Facades\Route;
use Illuminate\Support\Facades\URL;
URL::macro('toCurrentRouteWithParameters', function (array $parameters = [], $absolute = true) {
$current = Route::current();
return $this->toRoute($current, $parameters + $current->parameters(), $absolute);
});
您可以将其添加到服务提供商的 boot
方法中。
然后你可以在你的 Blade 模板中调用它:
{{ URL::toCurrentRouteWithParameters(['language' => 'az']) }}
如果您不想使用宏,请尝试第一部分:
<a class="dropdown-item" href="{{ URL::toRoute($cur = Route::current(), ['language' => 'az'] + $cur->parameters(), true) }}"> Az </a>
应用程序的默认语言存储在 config/app.php
配置文件的 locale
配置选项中。您可以自由修改此值以满足您的应用程序的需要。
您可以使用 App
门面提供的 setLocale
方法在运行时修改单个 HTTP 请求的默认语言:
use Illuminate\Support\Facades\App;
Route::get('/greeting/{locale}', function ($locale) {
if (! in_array($locale, ['en', 'es', 'fr'])) {
abort(400);
}
App::setLocale($locale);
//
});
您可以配置“后备语言”,当活动语言不包含给定的翻译字符串时将使用该语言。和默认语言一样,后备语言也在config/app.php
配置文件中配置:
'fallback_locale' => 'en',
确定当前语言环境
您可以使用 App
facade 上的 currentLocale
和 isLocale
方法来确定当前语言环境或检查语言环境是否为给定值:
use Illuminate\Support\Facades\App;
$locale = App::currentLocale();
if (App::isLocale('en')) {
//
}
我的建议是创建一个中间件来相应地更改用户语言。
<?php
namespace App\Http\Middleware;
use App;
use Closure;
class Localization
{
/**
* Handle an incoming request.
* @param \Illuminate\Http\Request $request
* @param \Closure $next
* @return mixed
*/
public function handle($request, Closure $next)
{
if (session()->has('locale')) {
App::setlocale(session()->get('locale'));
}
return $next($request);
}
}
最后,将您创建的中间件添加到middlewareGroups数组下的kernel.php。
/**
* The application's route middleware groups.
*
* @var array
*/
protected $middlewareGroups = [
'web' => [
\App\Http\Middleware\EncryptCookies::class,
\Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class,
\Illuminate\Session\Middleware\StartSession::class,
\Laravel\Jetstream\Http\Middleware\AuthenticateSession::class,
\Illuminate\View\Middleware\ShareErrorsFromSession::class,
\App\Http\Middleware\VerifyCsrfToken::class,
\Illuminate\Routing\Middleware\SubstituteBindings::class,
\App\Http\Middleware\HandleInertiaRequests::class,
\App\Http\Middleware\Localization::class, // <- Localization Middleware
],
'api' => [
'throttle:api',
\Illuminate\Routing\Middleware\SubstituteBindings::class,
],
];
我有下拉菜单来更改导航菜单中的区域设置。但我不知道如何获取参数。 如何获取当前参数?
当前参数:slug、quiz_id、id等
导航菜单blade:
<a class="dropdown-item" href="{{route(Route::currentRouteName(),'az')}}"> Az </a>
<a class="dropdown-item" href="{{route(Route::currentRouteName(),'en')}}"> En </a>
我有不同的路线。
Web.php
Route::group(['prefix'=>'{language}'],function(){
Route::get('quiz/{slug}',[MainController::class,'quiz_join'])->name('quiz_join');
Route::get('quiz/{quiz_id}/questions/{id}', [QuestionController::class, 'destroy'] )->whereNumber('id')->name('question.destroy');
});
如果您找不到其他方法并且不存在其他方法,您可以使用 URL::toRoute()
并使用当前路由并从中提取参数:
URL::toRoute($cur = Route::current(), ['language' => 'az'] + $cur->parameters(), true)
你可以为此制作一个宏来简化它:
use Illuminate\Support\Facades\Route;
use Illuminate\Support\Facades\URL;
URL::macro('toCurrentRouteWithParameters', function (array $parameters = [], $absolute = true) {
$current = Route::current();
return $this->toRoute($current, $parameters + $current->parameters(), $absolute);
});
您可以将其添加到服务提供商的 boot
方法中。
然后你可以在你的 Blade 模板中调用它:
{{ URL::toCurrentRouteWithParameters(['language' => 'az']) }}
如果您不想使用宏,请尝试第一部分:
<a class="dropdown-item" href="{{ URL::toRoute($cur = Route::current(), ['language' => 'az'] + $cur->parameters(), true) }}"> Az </a>
应用程序的默认语言存储在 config/app.php
配置文件的 locale
配置选项中。您可以自由修改此值以满足您的应用程序的需要。
您可以使用 App
门面提供的 setLocale
方法在运行时修改单个 HTTP 请求的默认语言:
use Illuminate\Support\Facades\App;
Route::get('/greeting/{locale}', function ($locale) {
if (! in_array($locale, ['en', 'es', 'fr'])) {
abort(400);
}
App::setLocale($locale);
//
});
您可以配置“后备语言”,当活动语言不包含给定的翻译字符串时将使用该语言。和默认语言一样,后备语言也在config/app.php
配置文件中配置:
'fallback_locale' => 'en',
确定当前语言环境
您可以使用 App
facade 上的 currentLocale
和 isLocale
方法来确定当前语言环境或检查语言环境是否为给定值:
use Illuminate\Support\Facades\App;
$locale = App::currentLocale();
if (App::isLocale('en')) {
//
}
我的建议是创建一个中间件来相应地更改用户语言。
<?php
namespace App\Http\Middleware;
use App;
use Closure;
class Localization
{
/**
* Handle an incoming request.
* @param \Illuminate\Http\Request $request
* @param \Closure $next
* @return mixed
*/
public function handle($request, Closure $next)
{
if (session()->has('locale')) {
App::setlocale(session()->get('locale'));
}
return $next($request);
}
}
最后,将您创建的中间件添加到middlewareGroups数组下的kernel.php。
/**
* The application's route middleware groups.
*
* @var array
*/
protected $middlewareGroups = [
'web' => [
\App\Http\Middleware\EncryptCookies::class,
\Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class,
\Illuminate\Session\Middleware\StartSession::class,
\Laravel\Jetstream\Http\Middleware\AuthenticateSession::class,
\Illuminate\View\Middleware\ShareErrorsFromSession::class,
\App\Http\Middleware\VerifyCsrfToken::class,
\Illuminate\Routing\Middleware\SubstituteBindings::class,
\App\Http\Middleware\HandleInertiaRequests::class,
\App\Http\Middleware\Localization::class, // <- Localization Middleware
],
'api' => [
'throttle:api',
\Illuminate\Routing\Middleware\SubstituteBindings::class,
],
];