Laravel 语言切换器,将附加参数传递给路由
Laravel language switcher, pass additional parameters to a route
我真的想不出解决这个问题的优雅解决方案,所以这里是:
我按照本教程 https://www.youtube.com/watch?v=KqzGKg8IxE4 为我的网站创建了本地化选项。但是,集成身份验证是一种癌症,现在我面临着一个更大的问题,即需要 get 参数的页面的路由。
这是我在 app.blade.php 中用于语言切换器的 blade 代码:
<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 } parameters - 语言切换器将抛出一个错误,因为我没有向它传递 {id} 参数。
我能想到的唯一解决方案是在 child blade 视图中添加 language-switcher 并从那里传递所需的参数,但这意味着我必须添加language-switcher 每个 child 视图,而不是仅在 parent.
视图中显示一次
您可以通过以下步骤实现:
- 实施一个 URL 生成器宏,这将使生成你的 URLs 变得容易得多,除了语言
之外必须完全相同
- 获取当前路由的参数
- 将所选语言合并到其中
<?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
我真的想不出解决这个问题的优雅解决方案,所以这里是:
我按照本教程 https://www.youtube.com/watch?v=KqzGKg8IxE4 为我的网站创建了本地化选项。但是,集成身份验证是一种癌症,现在我面临着一个更大的问题,即需要 get 参数的页面的路由。
这是我在 app.blade.php 中用于语言切换器的 blade 代码:
<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 } parameters - 语言切换器将抛出一个错误,因为我没有向它传递 {id} 参数。
我能想到的唯一解决方案是在 child blade 视图中添加 language-switcher 并从那里传递所需的参数,但这意味着我必须添加language-switcher 每个 child 视图,而不是仅在 parent.
视图中显示一次您可以通过以下步骤实现:
- 实施一个 URL 生成器宏,这将使生成你的 URLs 变得容易得多,除了语言 之外必须完全相同
- 获取当前路由的参数
- 将所选语言合并到其中
<?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