在制作Laravel包时,如何注册服务提供者和依赖包的别名?

时间:2014-02-05 10:19:43

标签: laravel packages

我正在为Laravel创建一个包,我已经将Notification包(https://github.com/edvinaskrucas/notification)定义为我的包的依赖项。

在/workbench/vendor/package/src/composer.json我有:

"require": {
    "php": ">=5.3.0",
    "illuminate/support": "4.1.*",
    "edvinaskrucas/notification": "2.*"
}

然后我在我的包的服务提供者的注册方法中注册服务提供者(甚至不确定这是否是正确的方法),以及使用App :: alias的别名。

所以在/workbench/vendor/package/src/Vendor/Package/PackageServiceProvider.php我有:

public function register()
{
    App::register('Krucas\Notification\NotificationServiceProvider');
    App::alias('Notification','Krucas\Notification\Facades\Notification');
}

但在尝试在控制器中使用Notification :: info()或在视图中使用Notification :: showAll()时,我仍然会收到“Class'Notification'not found'异常。

如何为我的软件包依赖项正确注册服务提供程序?

3 个答案:

答案 0 :(得分:32)

我遇到了同样的问题。我在一个包中有一个依赖项,并且不想用这些依赖项来打扰用户,因为它是依赖项中的依赖项。所以这就是解决方案。希望它会对你有所帮助!

public function register()
{
    /*
     * Register the service provider for the dependency.
     */
    $this->app->register('LucaDegasperi\OAuth2Server\OAuth2ServerServiceProvider');
    /*
     * Create aliases for the dependency.
     */
    $loader = \Illuminate\Foundation\AliasLoader::getInstance();
    $loader->alias('AuthorizationServer', 'LucaDegasperi\OAuth2Server\Facades\AuthorizationServerFacade');
    $loader->alias('ResourceServer', 'LucaDegasperi\OAuth2Server\Facades\ResourceServerFacade');
}

答案 1 :(得分:5)

您可以在应用程序上使用alias()方法注册别名,但我会考虑让您的包用户在安装过程中自己注册别名和服务提供者。这是跟踪您正在使用的外部代码的好方法,也是一种将组件拉出来进行测试的好方法。

当然是个人观点。 :)

Dayle

答案 2 :(得分:0)

在软件包开发过程中,应按以下代码在composer.json文件中添加软件包服务提供者。有关更多信息,请咨询Laravel的Package Discovery

"extra": {
    "laravel": {
        "providers": [
            "Barryvdh\\Debugbar\\ServiceProvider"
        ],
        "aliases": {
            "Debugbar": "Barryvdh\\Debugbar\\Facade"
        }
    }
},