【问题标题】:Laravel 8 get current route parametersLaravel 8 获取当前路由参数
【发布时间】:2021-06-30 01:15:31
【问题描述】:

我有下拉菜单来更改导航菜单中的区域设置。但我不知道如何获取参数。 如何获取当前参数?

当前参数:slug、quiz_id、id 等

导航菜单刀片:

<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');
});

【问题讨论】:

标签: php laravel locale laravel-routing laravel-8


【解决方案1】:

如果您找不到其他方法并且其他方法不存在,您可以使用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>

【讨论】:

  • Symfony\Component\Routing\Exception\RouteNotFoundException 路由 [127.0.0.1:8000/az/dashboard] 未定义。 (查看:C:\xampp\htdocs\quiz\resources\views\navigation-menu.blade.php)127.0.0.1:8000/az/dashboard
  • @SahmarQuluzade 将此“仪表板”路线的路线定义添加到您的问题中,因为它不是您列出的路线之一
  • 在字符串上调用成员函数parameters()(查看:C:\xampp\htdocs\quiz\resources\views\navigation-menu.blade.php)
  • 不可能这样...Route::current()返回当前Route实例或null...不能是字符串...github.com/laravel/framework/blob/8.x/src/Illuminate/Routing/…
  • 好像你打电话给URL::current()而不是Route::current()
【解决方案2】:

应用程序的默认语言存储在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 外观上的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);
    }
}

最后将你创建的中间件添加到 kernel.php 的 middlewareGroups 数组下。

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

【讨论】:

  • 这与他们试图做的事情无关
  • 这与理解他想要做什么有关。这是通过路由中的参数更改语言的最佳方式。
  • 如果他做的事情与我在这里所做的类似,它将有助于解决他的问题。如果它不能准确回答他的问题也没关系,因为我仍然会尝试推荐最佳实践,而不仅仅是回答他的问题。
  • 这与设置语言环境无关,问题与此无关..它是关于获取当前路由的路由参数并生成包含这些参数的当前路由的 URL ...您在这里所拥有的再次与此无关...这是标题“ Laravel 8获取当前路由参数”与设置语言环境无关
  • 错误提示 {slug} 参数丢失,与语言无关
猜你喜欢
  • 2021-08-07
  • 2019-08-17
  • 2014-05-29
  • 2011-11-25
  • 2015-12-04
  • 2018-05-18
  • 2018-07-05
  • 2016-12-16
  • 1970-01-01
相关资源
最近更新 更多