Как создать Освещение / Поддержка / Фасад / Приложение Фасад для автономного контейнера Подсветка IoC

В моем отдельном (без Laravel) проекте я хочу использовать контейнер Illuminate IoC. Также я хотел бы получить доступ к контейнеру приложения через App фасад предоставлен illuminate/support составная часть. Я установил оба компонента (v5.0.28). Вот мой (упрощенный) код:

function setup_App(){
$container = new Illuminate\Container\Container();
Illuminate\Support\Facades\Facade::setFacadeApplication($container);
class_alias('Illuminate\Support\Facades\App', 'App');
}

setup_App();

App::bind('w', 'Widget');
$widget = App::make('w');

К сожалению, попытка связать что-то приводит к:

Fatal error: Call to undefined method Illuminate\Support\Facades\App::bind() in ...\illuminate\support\Facades\Facade.php on line 213

Вот код в этой строке

$instance = static::getFacadeRoot();
...
return $instance->$method($args[0], $args[1]); // <--- line 213

куда $instance это пример Illuminate\Support\Facades\App, $method == 'bind', $args[0] == 'w' а также $args[1] == 'Widget',
Проблема в том, что $instance не является примером Illuminate\Container\Container и класс Illuminate\Support\Facades\App не имеет поддержки для вызова произвольных функций в своем статическом свойстве $app,

Чтобы это работало, я добавил следующую функцию: Illuminate\Support\Facades\App:

public function __call( $method , array $arguments ) {
return call_user_func_array(array(static::$app, $method), $arguments);
}

Но, конечно, редактирование внешнего компонента не является правильным решением !!! Наверняка кто-то сталкивался с этим раньше!

Итак, вопрос в том, как правильно сделать это?

5

Решение

Вам не хватает одного ключевого компонента. Application класс должен быть привязан к контейнеру. Фасад ищет класс, который должен быть привязан к «приложению», но ничего не происходит, поэтому ваша ошибка. Вы можете решить проблему, связав Illuminate\Container\Container класс для «приложения»:

function setup_App(){
$container = new Illuminate\Container\Container();
Illuminate\Support\Facades\Facade::setFacadeApplication($container);
$container->singleton('app', 'Illuminate\Container\Container');
class_alias('Illuminate\Support\Facades\App', 'App');
}

setup_App();

App::bind('w', 'Widget');
2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]