我正在设计一个特定的Web框架,允许我们的团队将新组件添加为插件,然后允许客户使用控制面板添加这些插件或模块。 使用CodeIgniter很简单,只需将控制器复制到controllers文件夹中,客户端模块就可以通过URL app / index.php / module / function查找 但是Laravel不允许这样的动态路由。
无论如何都要扩展路由配置而不用手动编辑routes.php?
答案 0 :(得分:2)
您只需在服务提供商的“启动”方法中添加所需的任何路由:
public function boot()
{
$this->app['router']->get('my-route', 'MyVendor\Mypackage\MyController@action');
}
如果你想拥有一种自动前缀,那不会自动发生,但创建一个并不太难:
public function boot()
{
$this->app['router']->group(['prefix' => 'my-module'], function ($router) {
$router->get('my-route', 'MyVendor\MyPackage\MyController@action');
$router->get('my-second-route', 'MyVendor\MyPackage\MyController@otherAction');
});
}
很多人都会将此前缀作为配置变量,以便开发人员可以选择他们想要的前缀(如果这样做,请记住为路由命名,以便您可以轻松地引用它们):
public function boot()
{
$this->app['router']->group(['prefix' => \Config::get('my-package::prefix')], function ($router) {
$router->get('my-route', 'MyVendor\MyPackage\MyController@action');
$router->get('my-second-route', 'MyVendor\MyPackage\MyController@otherAction');
});
}
答案 1 :(得分:2)
我知道我迟到了,但在Laravel 5.4
我们可以做到这样的事情:
第1步创建您的包并在其中创建服务提供商。
第2步在laravel配置应用中注册您的包服务提供商。
第3步现在创建一个包含以下
的sperate routes服务提供商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
文件。根据您的问题,您想要动态加载它,您可以拥有一个构造函数,并按照您的方便传递包名,前缀和命名空间。
第4步现在最后一步是注册服务提供商,您可以在包服务提供商中调用类似的内容:
public function boot()
{
$this->app->register('Mypackage\Providers\MyPackageRouteServiceProvider');
}
希望这会有所帮助。干杯
答案 2 :(得分:1)
实际上这很简单!当你考虑它时,Laravels路由层也只是一个绑定到Laravels容器的组件。
这使我们可以从我们访问容器的任何地方抓取它。由于您尝试修改程序包中的路由,因此可以在您的程序包服务提供商中使用它。
此外,在服务提供商中执行此操作时,您将自动访问app
属性(您的服务提供商是Laravels ServiceProvider类的子类),您可以轻松获取路由器!
<?php namespace My\Packages\Namespace;
use Illuminate\Support\ServiceProvider;
class MyPackageProvider extends ServiceProvider {
public function boot()
{
$this->app['router']->get('package-route', function(){
return "I just dynamically registered a route out of my package";
});
}
}
这是您的软件包的服务提供商。用户唯一需要做的就是将服务提供商添加到providers
中的config/app.php
数组中。
当用户定义了一条名称为动态添加路线的路线时,您的路线将被覆盖。如果要动态添加路由,请确保使用某种路由前缀。