gpt4 book ai didi

php - 如何从 Laravel 中的路由操作中删除路由前缀

转载 作者:行者123 更新时间:2023-12-02 01:17:36 24 4
gpt4 key购买 nike

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

  • 如果路由路径包含locale前缀,locale应该根据这个前缀设置
  • 如果没有路由前缀,则应设置为英语。

  • 例如:

    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 () {
    ...

  • 希望这有帮助

    关于php - 如何从 Laravel 中的路由操作中删除路由前缀,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41883633/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com