Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/codeigniter/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 通过插件向laravel添加路由_Php_Codeigniter_Laravel - Fatal编程技术网

Php 通过插件向laravel添加路由

Php 通过插件向laravel添加路由,php,codeigniter,laravel,Php,Codeigniter,Laravel,我正在设计一个特定的web框架,允许我们的团队添加新组件作为插件,然后允许客户使用控制面板添加这些插件或模块。 使用CodeIgniter,事情很简单,只需将控制器复制到controllers文件夹中,客户端模块就会通过URL app/index.php/module/function找到它的路径 但Laravel不允许这种动态路由 是否可以在不手动编辑routes.php的情况下扩展路由配置 只是一些理论 这其实很简单!仔细想想,Laravels路由层也只是一个绑定到Laravels容器的组件

我正在设计一个特定的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');
}