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 上的 currentLocaleisLocale 方法来确定当前语言环境或检查语言环境是否为给定值:

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,
    ],
];