Laravel 5.1 - 如何为所有已注册的路由动态添加前缀

时间:2015-07-17 02:08:19

标签: php laravel laravel-5 laravel-routing

TL; DR:如何为所有已注册的Laravel路线添加前缀?

详细信息:   - 一个包含第三方软件包的大型Laravel 5.1应用程序    注册它自己的路线。   - 对于某些多语言支持,所有路由都必须以前缀为前缀,而不修改这些第三方包。   - 正如您在Laravel 5.1中所了解的那样,路由器服务很早就受到了限制    甚至在调用自定义服务提供商之前,所以如果路由器反弹了    应用程序将有一个分离的路由器。   - 那么我们怎么能在所有当前注册的路线前加上?   - 如果没有直接解决方案,换句话说:如何替换默认\ Illuminate \ Routing \ Router \ Router :: prefix()这似乎是一种可能的解决方案..

3 个答案:

答案 0 :(得分:1)

在不破坏第三方软件包的情况下,多语言支持的最佳选择是从public / index.php中的REQUEST_URI中删除语言环境slug。

$pattern = '/^\/(en|fr)\//';
$uri = filter_input(INPUT_SERVER, 'REQUEST_URI', FILTER_SANITIZE_URL);

if (preg_match($pattern, $uri, $matches)) {
    $uri = preg_replace($pattern, '/', $uri);

    $_SERVER['REQUEST_URI'] = $uri;

    define('LOCALE', $matches[1]);
}

有一个Laravel包语言学家究竟是怎么做的,并且有助于URL和html锚标记生成多语言环境。

https://github.com/keevitaja/linguist

答案 1 :(得分:1)

我知道我迟到了,但在Laravel 5.4我们可以做到这样的事情:

第1步创建您的包并在其中创建服务提供商。

第2步在laravel配置应用中注册您的包服务提供商。

第3步现在创建一个单独的路由服务提供程序,其中包含以下

namespace MyPackage\Providers;


use App\Providers\RouteServiceProvider;
use Illuminate\Support\Facades\Route;

class MyPackageRouteServiceProvider extends RouteServiceProvider
{
    protected $namespace='MyPackage\Controllers';

    public function boot()
    {
        parent::boot();
    }

    public function map()
    {
        $this->mapApiRoutes();

        $this->mapWebRoutes();
    }


    protected function mapApiRoutes()
    {
    Route::prefix('Mypackage\api')
        ->middleware('api')
        ->namespace($this->namespace)
        ->group(__DIR__ . '\..\Routes\api.php');
    }

    protected function mapWebRoutes()
    {
        Route::prefix('Mypackage')
            ->middleware('web')
            ->namespace($this->namespace)
            ->group(__DIR__ . '\..\Routes\web.php');
    }
}

注意:我考虑有Routes Folder并包含web.phpapi.php文件。根据您的问题,您想要动态加载它,您可以拥有构造函数并轻松传递package nameprefixnamespace

第4步现在最后一步是注册服务提供商,您可以在包服务提供商中调用类似的内容:

public function boot()
{
    $this->app->register('Mypackage\Providers\MyPackageRouteServiceProvider');
}
希望这有助于他人。干杯

答案 2 :(得分:0)

您没有发布尝试的代码段,但似乎您正在寻找route groups,它允许您为一堆已定义的路径轻松添加前缀,使用中间件和其他内容。

如果您仍需要为路由类添加逻辑,您可能希望extend it.