【问题标题】:Laravel localization and routes from Jetstream / FortifyLaravel 本地化和来自 Jetstream / Fortify 的路线
【发布时间】:2021-01-09 00:03:18
【问题描述】:

我有这个新的 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)

【问题讨论】:

  • 也许这会有所帮助stackoverflow.com/a/64003630/7908390
  • 我看到了这个,但它并不完全一样......这是一个固定前缀,我需要一个变量一个
  • 我知道。但是您可以做的是放置一个参数前缀,例如 /{lang} 并用中间件填充它。
  • 有趣!显然我也可以在fortify 配置文件中定义要使用的中间件。但它不适用于 jetstream 中定义的路线,对吧?
  • 是的,目前您无法为 jetstream 定义前缀,但您可以创建自己的路线。进行真正身份验证的主要软件包是 fortify,因此,如果您必须自定义大量或不使用 livewire 和惯性喷射流不适合您的项目

标签: laravel localization laravel-8 laravel-localization jetstream


【解决方案1】:

我使用 Jetstream 创建了一个新的 Laravel 项目。我想在我的项目中使用多语言支持,但是当我根据url 中的语言使用前缀(en/loginde/login)时,我也遇到了 Route 的问题。我按照这些步骤解决了我的问题。我希望你也有用:

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 - 强化路由,在 vendor\laravel\fortify\routes.php - Route::group 中包含 prefix,如下所示:

Route::group(['prefix' => LaravelLocalization::setLocale(),
'middleware' => config('fortify.middleware', ['web'])], function () {
$enableViews = config('fortify.views', true);
.......

5 - Livewire 路由,在 vendor\laravel\jetstream\routes\livewire.php - Route::group 中包含 prefix,如下所示:

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.phpprefix,就像在这个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 - 幸福的结局...

【讨论】:

    【解决方案2】:

    我遇到了几乎相同的问题,即我目前不使用mcamara/laravel-localization

    根据上面@JeremyBelolo@TEFO 之间的有用讨论,以下解决方案对我有用:

    1. 'path' => '{locale}/my-secret-path' 添加到config/fortify.php。正如@JeremyBelolo 和@ETO 所讨论的,the support for that was recenlty added
    2. \Laravel\Jetstream\Http\Middleware\AuthenticateSession::class 之前添加了我的中间件到web $middlewareGroups
    3. 在将请求更深入地传递到应用程序之前,我的中间件设置了区域设置 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 配置选项已更改]

    pathfortify config option changedprefix。因此在config/fortify.php 中应该使用以下键:

    'prefix' => '{locale}/my-secret-path'

    【讨论】:

      【解决方案3】:

      终于成功解决了这个问题。我只是禁用了来自 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 的路线复制到您的 web.php 文件中,并在带有您需要的前缀的路线组内。

      【讨论】:

      • 是的,并确保将其添加到 register 函数中,而不是添加到 boot 函数中(如 sometimes 建议的那样),因为这将“为时已晚”。
      • 您没有 c&p 所有路线。我们可以轻松地将它们包括在内。 Route::group([ 'namespace' => 'Laravel\Fortify\Http\Controllers', ], function () { require(base_path('vendor/laravel/fortify/routes/routes.php')); });
      猜你喜欢
      • 2021-01-13
      • 2021-07-14
      • 1970-01-01
      • 2021-04-30
      • 1970-01-01
      • 2021-08-27
      • 2021-06-24
      • 2021-12-30
      • 2019-06-24
      相关资源
      最近更新 更多