2

我正在将旧代码迁移到 5.7,当涉及到帮助程序时,我遇到了一个奇怪的问题。我正在使用两个包 - 我们称它们为 A 和 B。包 A 实现了一个 ServiceProvider。我想在包 B 的控制器中使用它,但似乎无法正确找到它。我是在install()包A的函数中配置的,如下

$providers = Config::get('providers');
if (!$providers) {
    $providers = array('group_membership' => '\Concrete\Package\A\Src\GroupMembership\GroupMembershipProvider');
} else {
    $providers['group_membership'] = '\Concrete\Package\A\Src\GroupMembership\GroupMembershipProvider';
}
Config::set('providers', $providers);

在 ServiceProvider 本身中,我相应地绑定它;

<?php namespace Concrete\Package\A\Src\GroupMembership;

use \Concrete\Core\Foundation\Service\Provider as ServiceProvider;

class GroupMembershipProvider extends ServiceProvider
{
    public function register() {
        $this->app->bind('helper/group_membership', 'Concrete\Package\A\Src\GroupMembership\GroupMembershipProvider');
    }
}

然后当我想在包 A 中使用时,这工作得很好:

$helper = Core::make('helper/group_membership');

但是当我在包 B 中这样做时,它告诉我:

Class helper/group_membership does not exist

除了将两个包合并在一起,我还能做什么?这可能是什么原因造成的?

4

1 回答 1

2

提供者不能像那样注册,因为我们在加载包之前使用了那个配置入口方式。

注册包的正确方法是实例化一个新包\Concrete\Core\Foundation\Service\ProviderList并使用该registerProvider方法。

这是如何做到这一点的一个很好的例子

// Register our service provider
$list = new ProviderList(\Core::getFacadeRoot());
$list->registerProvider('Concrete\\Package\\LegacySample\\Libraries\\ServiceProvider');
于 2015-05-01T20:10:41.717 回答