Laravel 来自 Jetstream / Fortify 的本地化和路线
Laravel localization and routes from Jetstream / Fortify
我有这个新的 Laravel 项目要处理。我们希望以多种语言提供它。
我用 JetStream 开始了这个项目。身份验证路由等由 JetStream / Fortify 自动处理。然后我添加了 https://github.com/mcamara/laravel-localization 来处理本地化。它适用于我自己创建的路线:
Route::group(
[
'prefix' => LaravelLocalization::setLocale(),
'middleware' => [ 'localeSessionRedirect', 'localizationRedirect', 'localeViewPath' ]
], function()
{
Route::get('/', function () {
return view('welcome');
});
Route::middleware(['auth:sanctum', 'verified'])->get('/dashboard', function () {
return view('dashboard');
})->name('dashboard');
});
但是如何在 Jetstream 和 Fortify 处理的路由上设置组、前缀和中间件?
[编辑]
因此,根据@TEFO 的一些建议,我尝试添加一个中间件来处理区域设置。添加:
Fortify.php :
'path' => '{lang}',
'middleware' => ['web', 'setLang']
新中间件 setLang :
class SetLang {
/**
* Handle an incoming request.
*
* @param \Illuminate\Http\Request $request
* @param \Closure $next
* @return mixed
*/
public function handle(\Illuminate\Http\Request $request, Closure $next) {
// $lang = 'en';
// $request->attributes->add(['lang' => 'en']);
$request->route()->setParameter('lang', 'en');
// $request->request->set('lang', 'en');
return $next($request);
}
}
将中间件添加到 $routeMiddleware
。
我在尝试连接 http://mylaravel/en/login
时收到此错误:
ErrorException
Missing required parameters for [Route: login] [URI: {lang}/login]. (View: /var/www/resources/views/auth/login.blade.php)
终于成功搞定了。我只是禁用了来自 Fortify 和 Jetstream 的路由,将它们复制过来并将它们推入我的分组前缀路由中。仍在使用 https://github.com/mcamara/laravel-localization 但它应该可以随心所欲地工作 - 制作您自己的系统或其他任何东西,只要您控制好路线就可以了。
在JetstreamServiceProvider中:
public function register() {
Jetstream::ignoreRoutes();
}
在 FortifyServiceProvider 中:
public function register() {
Fortify::ignoreRoutes();
}
然后从 Fortify vendor/laravel/fortify/routes/routes.php
和 Jetstream vendor/laravel/jetstream/routes/livewire.php
复制路由(如果你正在使用它,我想适应 Inertia)到你的 web.php
文件,在一个路由内用你需要的前缀分组。
我遇到了几乎相同的问题,因为我现在不使用 mcamara/laravel-localization。
根据上面 @JeremyBelolo and @TEFO 之间的有用讨论,以下解决方案对我有用:
- 已将
'path' => '{locale}/my-secret-path'
添加到 config/fortify.php
。正如@JeremyBelolo 和@ETO 所讨论的,the support for that was recenlty added.
- 将
\Laravel\Jetstream\Http\Middleware\AuthenticateSession::class
之前的中间件添加到 web
$middlewareGroups
- 在将请求更深入地传递到应用程序之前,我的中间件设置了语言环境
app()->setLocale($locale);
和默认 {locale} url 参数 URL::defaults(['locale' => $locale]);
。
考虑到 Jetstream,我必须应用与 @JeremyBelolo 相同的步骤,除了我没有复制 jetsream/livewire 路由,而是在路由组中使用了以下内容:
require base_path('vendor/laravel/jetstream/routes/livewire.php');
现在我可以访问 {locale}/my-secret-path/login
,其中 {locale}
是我网站支持的语言环境。
更新 [Fortify 配置选项已更改]:
path
fortify config option changed 到 prefix
。因此在 config/fortify.php
中应使用以下键:
'prefix' => '{locale}/my-secret-path'
我使用 Jetstream 创建了一个新的 Laravel 项目。我想在我的项目中使用多语言支持,但是当我根据url
中的语言使用前缀(en/login
,de/login
)时,我也遇到了路由问题。我按照以下步骤解决了我的问题。我希望你也会有用:
1 - 我已将这个 https://github.com/mcamara/laravel-localization 的包包含在我的项目中。并按顺序按照说明进行操作。
2 - 我在“rautes\web.php”文件中进行了路由设置,如下所示。
Route::group(['prefix' => LaravelLocalization::setLocale(),'middleware' => [
'localeSessionRedirect', 'localizationRedirect','localeViewPath' ]], function(){
/** ADD ALL LOCALIZED ROUTES INSIDE THIS GROUP **/
Route::get('/', function () {return view('welcome');});
Route::middleware(['auth', 'verified'])->get('/dashboard', function () {
return view('back.dashboard');})->name('dashboard');
});
3 - 我已将 包含在 app\Http\Middleware\Kernel.php
中。在 middlewareGroups
结尾 web
前缀。
protected $middlewareGroups = [
'web' => [....
\Mcamara\LaravelLocalization\Middleware\LaravelLocalizationRoutes::class,
\Mcamara\LaravelLocalization\Middleware\LaravelLocalizationRedirectFilter::class,
\Mcamara\LaravelLocalization\Middleware\LocaleSessionRedirect::class,
\Mcamara\LaravelLocalization\Middleware\LocaleCookieRedirect::class,
\Mcamara\LaravelLocalization\Middleware\LaravelLocalizationViewPath::class,]
4 - Fortify Routes,将 prefix
包含在 vendor\laravel\fortify\routes.php
- Route::group
中,如下所示:
Route::group(['prefix' => LaravelLocalization::setLocale(),
'middleware' => config('fortify.middleware', ['web'])], function () {
$enableViews = config('fortify.views', true);
.......
5 - Livewire 路由,将 prefix
包含在 vendor\laravel\jetstream\routes\livewire.php
- Route::group
中,如下所示:
Route::group(['prefix' => LaravelLocalization::setLocale(),
'middleware' =>config('jetstream.middleware', ['web'])], function () {
if (Jetstream::hasTermsAndPrivacyPolicyFeature()) {
Route::get('/terms-of-service', [TermsOfServiceController::class, 'show'])-
>name('terms.show');
Route::get('/privacy-policy', [PrivacyPolicyController::class, 'show'])-
>name('policy.show');}
6 - 如果你想分离后端和前端,你可以在 protected $routeMiddleware
的 app\Http\Middleware\Kernel.php
末尾添加 prefix
就像这样 https://github.com/mcamara/laravel-localization.
protected $routeMiddleware = [
........
'localize'=> \Mcamara\LaravelLocalization\Middleware\LaravelLocalizationRoutes::class,
'localizationRedirect' => \Mcamara\LaravelLocalization\Middleware\LaravelLocalizationRedirectFilter::class,
'localeSessionRedirect' => \Mcamara\LaravelLocalization\Middleware\LocaleSessionRedirect::class,
'localeCookieRedirect' => \Mcamara\LaravelLocalization\Middleware\LocaleCookieRedirect::class,
'localeViewPath' => \Mcamara\LaravelLocalization\Middleware\LaravelLocalizationViewPath::class,
]
7 - 幸福的结局...
我有这个新的 Laravel 项目要处理。我们希望以多种语言提供它。
我用 JetStream 开始了这个项目。身份验证路由等由 JetStream / Fortify 自动处理。然后我添加了 https://github.com/mcamara/laravel-localization 来处理本地化。它适用于我自己创建的路线:
Route::group(
[
'prefix' => LaravelLocalization::setLocale(),
'middleware' => [ 'localeSessionRedirect', 'localizationRedirect', 'localeViewPath' ]
], function()
{
Route::get('/', function () {
return view('welcome');
});
Route::middleware(['auth:sanctum', 'verified'])->get('/dashboard', function () {
return view('dashboard');
})->name('dashboard');
});
但是如何在 Jetstream 和 Fortify 处理的路由上设置组、前缀和中间件?
[编辑]
因此,根据@TEFO 的一些建议,我尝试添加一个中间件来处理区域设置。添加:
Fortify.php :
'path' => '{lang}',
'middleware' => ['web', 'setLang']
新中间件 setLang :
class SetLang {
/**
* Handle an incoming request.
*
* @param \Illuminate\Http\Request $request
* @param \Closure $next
* @return mixed
*/
public function handle(\Illuminate\Http\Request $request, Closure $next) {
// $lang = 'en';
// $request->attributes->add(['lang' => 'en']);
$request->route()->setParameter('lang', 'en');
// $request->request->set('lang', 'en');
return $next($request);
}
}
将中间件添加到 $routeMiddleware
。
我在尝试连接 http://mylaravel/en/login
时收到此错误:
ErrorException
Missing required parameters for [Route: login] [URI: {lang}/login]. (View: /var/www/resources/views/auth/login.blade.php)
终于成功搞定了。我只是禁用了来自 Fortify 和 Jetstream 的路由,将它们复制过来并将它们推入我的分组前缀路由中。仍在使用 https://github.com/mcamara/laravel-localization 但它应该可以随心所欲地工作 - 制作您自己的系统或其他任何东西,只要您控制好路线就可以了。
在JetstreamServiceProvider中:
public function register() {
Jetstream::ignoreRoutes();
}
在 FortifyServiceProvider 中:
public function register() {
Fortify::ignoreRoutes();
}
然后从 Fortify vendor/laravel/fortify/routes/routes.php
和 Jetstream vendor/laravel/jetstream/routes/livewire.php
复制路由(如果你正在使用它,我想适应 Inertia)到你的 web.php
文件,在一个路由内用你需要的前缀分组。
我遇到了几乎相同的问题,因为我现在不使用 mcamara/laravel-localization。
根据上面 @JeremyBelolo and @TEFO 之间的有用讨论,以下解决方案对我有用:
- 已将
'path' => '{locale}/my-secret-path'
添加到config/fortify.php
。正如@JeremyBelolo 和@ETO 所讨论的,the support for that was recenlty added. - 将
\Laravel\Jetstream\Http\Middleware\AuthenticateSession::class
之前的中间件添加到web
$middlewareGroups
- 在将请求更深入地传递到应用程序之前,我的中间件设置了语言环境
app()->setLocale($locale);
和默认 {locale} url 参数URL::defaults(['locale' => $locale]);
。
考虑到 Jetstream,我必须应用与 @JeremyBelolo 相同的步骤,除了我没有复制 jetsream/livewire 路由,而是在路由组中使用了以下内容:
require base_path('vendor/laravel/jetstream/routes/livewire.php');
现在我可以访问 {locale}/my-secret-path/login
,其中 {locale}
是我网站支持的语言环境。
更新 [Fortify 配置选项已更改]:
path
fortify config option changed 到 prefix
。因此在 config/fortify.php
中应使用以下键:
'prefix' => '{locale}/my-secret-path'
我使用 Jetstream 创建了一个新的 Laravel 项目。我想在我的项目中使用多语言支持,但是当我根据url
中的语言使用前缀(en/login
,de/login
)时,我也遇到了路由问题。我按照以下步骤解决了我的问题。我希望你也会有用:
1 - 我已将这个 https://github.com/mcamara/laravel-localization 的包包含在我的项目中。并按顺序按照说明进行操作。
2 - 我在“rautes\web.php”文件中进行了路由设置,如下所示。
Route::group(['prefix' => LaravelLocalization::setLocale(),'middleware' => [
'localeSessionRedirect', 'localizationRedirect','localeViewPath' ]], function(){
/** ADD ALL LOCALIZED ROUTES INSIDE THIS GROUP **/
Route::get('/', function () {return view('welcome');});
Route::middleware(['auth', 'verified'])->get('/dashboard', function () {
return view('back.dashboard');})->name('dashboard');
});
3 - 我已将 包含在 app\Http\Middleware\Kernel.php
中。在 middlewareGroups
结尾 web
前缀。
protected $middlewareGroups = [
'web' => [....
\Mcamara\LaravelLocalization\Middleware\LaravelLocalizationRoutes::class,
\Mcamara\LaravelLocalization\Middleware\LaravelLocalizationRedirectFilter::class,
\Mcamara\LaravelLocalization\Middleware\LocaleSessionRedirect::class,
\Mcamara\LaravelLocalization\Middleware\LocaleCookieRedirect::class,
\Mcamara\LaravelLocalization\Middleware\LaravelLocalizationViewPath::class,]
4 - Fortify Routes,将 prefix
包含在 vendor\laravel\fortify\routes.php
- Route::group
中,如下所示:
Route::group(['prefix' => LaravelLocalization::setLocale(),
'middleware' => config('fortify.middleware', ['web'])], function () {
$enableViews = config('fortify.views', true);
.......
5 - Livewire 路由,将 prefix
包含在 vendor\laravel\jetstream\routes\livewire.php
- Route::group
中,如下所示:
Route::group(['prefix' => LaravelLocalization::setLocale(),
'middleware' =>config('jetstream.middleware', ['web'])], function () {
if (Jetstream::hasTermsAndPrivacyPolicyFeature()) {
Route::get('/terms-of-service', [TermsOfServiceController::class, 'show'])-
>name('terms.show');
Route::get('/privacy-policy', [PrivacyPolicyController::class, 'show'])-
>name('policy.show');}
6 - 如果你想分离后端和前端,你可以在 protected $routeMiddleware
的 app\Http\Middleware\Kernel.php
末尾添加 prefix
就像这样 https://github.com/mcamara/laravel-localization.
protected $routeMiddleware = [
........
'localize'=> \Mcamara\LaravelLocalization\Middleware\LaravelLocalizationRoutes::class,
'localizationRedirect' => \Mcamara\LaravelLocalization\Middleware\LaravelLocalizationRedirectFilter::class,
'localeSessionRedirect' => \Mcamara\LaravelLocalization\Middleware\LocaleSessionRedirect::class,
'localeCookieRedirect' => \Mcamara\LaravelLocalization\Middleware\LocaleCookieRedirect::class,
'localeViewPath' => \Mcamara\LaravelLocalization\Middleware\LaravelLocalizationViewPath::class,
]
7 - 幸福的结局...