我正在Laravel 5.3应用程序中创建本地化。它必须遵循以下要求:

  • 如果路由路径包含区域设置前缀,则应根据该前缀设置区域设置
  • 如果没有路由前缀,则应将其设置为English。

  • 例如:

    A)mysite.org/pl/blog/133将语言环境设置为pl并使用参数113调用BlogController

    B)mysite.org/en/blog/133将语言环境设置为en并使用参数113调用BlogController

    C)mysite.org/blog/133与以前的行为相同。

    为了实现这一点,我使用了以下代码:
    #routes/web.php
    
    require base_path('routes/common.php');
    // TODO set default locale to en
    
    Route::group(['prefix' => '{locale}'], function($group) {
    
        require base_path('routes/common.php');
        // TODO set locale to $locale
    
        foreach ($group -> getRoutes() as $route) {
            $route->where('locale', 'en|ru|pl|ua|de');
        }
    
    });
    
    
    #routes/common.php
    
    Route::get('/blog/{id}', function($id) {
        // Return view of respective blogpost
    });
    

    问题是,当我使用路径A或B时,我在动作函数中获得了一个额外的第一个参数,该参数是从语言环境前缀衍生而来的。

    我可以以某种方式隐藏此参数吗?还是有一种方法可以在结构上更正确地实现我想要的?

    最佳答案

    我不确定我的解决方案是否最佳
    但是你可以试试看

  • 在app / Http / Middileware / Language.php中创建新文件

  • ...
    namespace App\Http\Middleware;
    
    use Closure;
    use Illuminate\Routing\Redirector;
    use Illuminate\Http\Request;
    
    class Language {
    
        public function __construct(Redirector $redirector) {
            // $this->app = $app;
            $this->redirector = $redirector;
            // $this->request = $request;
        }
    
        /**
         * Handle an incoming request.
         *
         * @param  \Illuminate\Http\Request  $request
         * @param  \Closure  $next
         * @return mixed
         */
        public function handle($request, Closure $next)
        {
            // Make sure current locale exists.
            $segments = $request->segments();
            $locale = $segments[0];
    
            $languages = ['en','ru','pl','ua','de'];
            if (!in_array($locale, $languages)) {
                $segments = array_merge(['en'], $segments);
                return $this->redirector->to(implode('/', $segments));
            }
    
            return $next($request);
        }
    
    }
    
  • 在app / Http / Kernel.php和这一行
    protected $middleware = [
        \App\Http\Middleware\Language::class,
    \Illuminate\Foundation\Http\Middleware\CheckForMaintenanceMode::class,
    ];
    
  • 在文件路由(route / web.php)中在组中添加前缀
    Route::group(['middleware' => ['web'], 'prefix' => '{locale}'],
    function ()      {
    ...
    

  • 希望这个帮助

    09-30 15:19
    查看更多