【问题标题】:Laravel language switcher, pass additional parameters to a routeLaravel 语言切换器,将附加参数传递给路由
【发布时间】:2020-10-17 19:39:00
【问题描述】:

我真的想不出一个优雅的解决方案来解决这个问题,所以这里是:

我按照本教程https://www.youtube.com/watch?v=KqzGKg8IxE4 为我的网站创建了本地化选项。但是,集成身份验证是一种癌症,现在我面临一个更大的问题,即需要获取参数的页面的路由。

这是我在 app.blade.php 中用于语言切换器的刀片代码:

                            <language-switcher
                                locale="{{ app()->getLocale() }}"
                                link-en="{{ route(Route::currentRouteName(), 'en') }}"
                                link-bg="{{ route(Route::currentRouteName(), 'bg') }}"
                            ></language-switcher>

这是我的一些路线

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

Route::get('email/verify', 'Auth\VerificationController@show')->name('verification.notice');
Route::get('email/verify/{id}/{hash}', 'Auth\VerificationController@verify')->name('verification.verify');
Route::get('email/resend', 'Auth\VerificationController@resend')->name('verification.resend');


Route::group([
    "prefix" => '{language}',
    'where' => ['language' => '(en||bg)'],
], function () {

    //Auth routes
    Auth::routes();

    //Returns to home
    Route::get('/', 'HomeController@index')->name('home');

    //Handles the faq routes
    Route::resource('faq', 'FaqController');

});


Route::get('password/reset/{token}', 'Auth\ResetPasswordController@showResetForm')->name('password.reset');
Route::post('password/reset', 'Auth\ResetPasswordController@reset')->name('password.update');

});

它适用于不需要任何获取参数的页面,例如:登录/注册/主页,但是如果我使用需要诸如 faq.edit 之类的东西,它需要一个 {id} 参数 -语言切换器会抛出错误,因为我没有向它传递 {id} 参数。

我能想到的唯一解决方案是在子刀片视图中添加语言切换器,然后从那里传递所需的参数,但这意味着我必须将语言切换器添加到每个子视图,而不是只添加一次在父母那里。

【问题讨论】:

    标签: php laravel url-routing laravel-blade


    【解决方案1】:

    您可以通过以下步骤实现:

    • 实现一个 URL 生成器宏,它可以更轻松地生成除了语言之外必须相同的 URL
    • 获取当前路由的参数
    • 将所选语言合并到其中
    <?php
    
    namespace App\Providers;
    
    use Illuminate\Routing\UrlGenerator;
    use Illuminate\Support\ServiceProvider;
    
    class AppServiceProvider extends ServiceProvider
    {
        /**
         * Register any application services.
         *
         * @return void
         */
        public function register()
        {
            //
        }
    
        /**
         * Bootstrap any application services.
         *
         * @return void
         */
        public function boot()
        {
            UrlGenerator::macro('toLanguage', function (string $language) {
                $currentRoute = app('router')->current();
                $newRouteParameters = array_merge(
                    $currentRoute->parameters(), compact('language')
                );
                return $this->route($currentRoute->getName(), $newRouteParameters);
            });
        }
    }
    

    在你的 Blade 文件中

    @inject('app', 'Illuminate\Contracts\Foundation\Application')
    @inject('urlGenerator', 'Illuminate\Routing\UrlGenerator')
    
    <language-switcher
        locale="{{ $app->getLocale() }}"
        link-en="{{ $urlGenerator->toLanguage('en') }}"
        link-bg="{{ $urlGenerator->toLanguage('bg') }}"
    ></language-switcher>
    

    您会注意到我使用了合约注入而不是使用外观。更多信息在这里https://laravel.com/docs/7.x/contracts#contracts-vs-facades

    如果您不了解 Laravel 宏,请点击此处了解更多信息 https://tighten.co/blog/the-magic-of-laravel-macros

    【讨论】:

    • 做到了。甚至不知道您可以在 laravel 组件中创建自己的助手,感谢您的帮助!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-03-03
    • 2018-08-14
    • 1970-01-01
    • 2016-05-16
    • 2017-01-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多