通过插件添加到laravel的路由

时间:2014-02-19 10:17:00

标签: php codeigniter laravel

我正在设计一个特定的Web框架,允许我们的团队将新组件添加为插件,然后允许客户使用控制面板添加这些插件或模块。 使用CodeIgniter很简单,只需将控制器复制到controllers文件夹中,客户端模块就可以通过URL app / index.php / module / function查找 但是Laravel不允许这样的动态路由。

无论如何都要扩展路由配置而不用手动编辑routes.php?

3 个答案:

答案 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.phpapi.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数组中。

小心!

当用户定义了一条名称为动态添加路线的路线时,您的路线将被覆盖。如果要动态添加路由,请确保使用某种路由前缀。

进一步阅读

Laravel Docs - IoC Container