TL; DR:如何为所有已注册的Laravel路线添加前缀?
详细信息: - 一个包含第三方软件包的大型Laravel 5.1应用程序 注册它自己的路线。 - 对于某些多语言支持,所有路由都必须以前缀为前缀,而不修改这些第三方包。 - 正如您在Laravel 5.1中所了解的那样,路由器服务很早就受到了限制 甚至在调用自定义服务提供商之前,所以如果路由器反弹了 应用程序将有一个分离的路由器。 - 那么我们怎么能在所有当前注册的路线前加上? - 如果没有直接解决方案,换句话说:如何替换默认\ Illuminate \ Routing \ Router \ Router :: prefix()这似乎是一种可能的解决方案..
答案 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锚标记生成多语言环境。
答案 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.php
和api.php
文件。根据您的问题,您想要动态加载它,您可以拥有构造函数并轻松传递package name
,prefix
和namespace
。
第4步现在最后一步是注册服务提供商,您可以在包服务提供商中调用类似的内容:
public function boot()
{
$this->app->register('Mypackage\Providers\MyPackageRouteServiceProvider');
}
希望这有助于他人。干杯
答案 2 :(得分:0)
您没有发布尝试的代码段,但似乎您正在寻找route groups,它允许您为一堆已定义的路径轻松添加前缀,使用中间件和其他内容。
如果您仍需要为路由类添加逻辑,您可能希望extend it.