Я перевожу старый код на 5.7 и сталкиваюсь со странной проблемой, когда дело касается помощников. Я работаю с двумя пакетами — давайте назовем их A и B. Пакет A реализует ServiceProvider. Я хотел бы использовать его в контроллере из пакета B, но он не может найти его должным образом. Я настраиваю это в install()
функция пакета А, следующим образом
$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');
}
}
Затем, когда я хочу использовать в пакете А, это прекрасно работает:
$helper = Core::make('helper/group_membership');
Но когда я делаю это в пакете B, он говорит мне:
Class helper/group_membership does not exist
Что я мог сделать, кроме как объединить два пакета вместе? Что может быть причиной этого?
Провайдеры не могут быть зарегистрированы таким образом, так как мы потребляем эту запись конфигурации намного раньше мы загружаем пакеты.
Правильный способ зарегистрировать пакет — создать новый экземпляр \Concrete\Core\Foundation\Service\ProviderList
и использовать registerProvider
метод.
Вот хороший пример того, как это сделать
// Register our service provider
$list = new ProviderList(\Core::getFacadeRoot());
$list->registerProvider('Concrete\\Package\\LegacySample\\Libraries\\ServiceProvider');
Других решений пока нет …