Php 通过插件向laravel添加路由
我正在设计一个特定的web框架,允许我们的团队添加新组件作为插件,然后允许客户使用控制面板添加这些插件或模块。 使用CodeIgniter,事情很简单,只需将控制器复制到controllers文件夹中,客户端模块就会通过URL app/index.php/module/function找到它的路径 但Laravel不允许这种动态路由 是否可以在不手动编辑routes.php的情况下扩展路由配置 只是一些理论 这其实很简单!仔细想想,Laravels路由层也只是一个绑定到Laravels容器的组件 这使得我们可以从那里抓取它,无论我们在哪里访问容器。由于您正在尝试修改包中的路由,因此最好在包服务提供商中进行修改 此外,在服务提供商中执行此操作时,您将自动访问Php 通过插件向laravel添加路由,php,codeigniter,laravel,Php,Codeigniter,Laravel,我正在设计一个特定的web框架,允许我们的团队添加新组件作为插件,然后允许客户使用控制面板添加这些插件或模块。 使用CodeIgniter,事情很简单,只需将控制器复制到controllers文件夹中,客户端模块就会通过URL app/index.php/module/function找到它的路径 但Laravel不允许这种动态路由 是否可以在不手动编辑routes.php的情况下扩展路由配置 只是一些理论 这其实很简单!仔细想想,Laravels路由层也只是一个绑定到Laravels容器的组件
应用程序
属性(您的服务提供商是Laravels ServiceProvider类的子类),并且您可以非常轻松地获取路由器
动手操作代码
您只需在服务提供商的“引导”方法中添加所需的任何路由即可:
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');
});
}
很多人会将此前缀作为配置变量,以便开发人员可以选择他们想要的前缀(如果这样做,请记住命名路线,以便可以轻松引用):
我知道我有点晚了,但在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文件夹
并包含web.php
和api.php
文件。根据您的问题,您希望动态加载它,您可以拥有一个构造函数,并根据您的需要传递包名、前缀和名称空间
步骤4现在最后一步是注册服务提供商,您可以在套餐服务提供商中调用类似的内容:
public function boot()
{
$this->app->register('Mypackage\Providers\MyPackageRouteServiceProvider');
}
希望这有帮助。干杯
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');
}
}
public function boot()
{
$this->app->register('Mypackage\Providers\MyPackageRouteServiceProvider');
}