如何为独立的 Illuminate IoC 容器创建 Illuminate/Support/Facade/App facade
How to create Illuminate/Support/Facade/App facade for standalone Illuminate IoC Container
在我的独立(没有 Laravel)项目中,我想使用 Illuminate IoC 容器。此外,我想通过 illuminate/support
组件提供的 App
外观访问应用程序容器。我安装了这两个组件 (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
的实例,并且 class Illuminate\Support\Facades\App
不支持在其静态 属性 [=25 上调用任意函数=].
为了让它工作,我在 Illuminate\Support\Facades\App
中添加了以下函数:
public function __call( $method , array $arguments ) {
return call_user_func_array(array(static::$app, $method), $arguments);
}
但是肯定编辑外部组件不是正确的做法!!!肯定有人以前遇到过这个!
所以问题是:执行此操作的正确方法是什么?
您缺少一个关键组件。 Application
class 需要绑定到容器。 Facade 正在寻找要绑定到 'app' 的 class 但没有找到,因此您的错误。您可以通过将 Illuminate\Container\Container
class 绑定到 'app':
来解决问题
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');
在我的独立(没有 Laravel)项目中,我想使用 Illuminate IoC 容器。此外,我想通过 illuminate/support
组件提供的 App
外观访问应用程序容器。我安装了这两个组件 (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
的实例,并且 class Illuminate\Support\Facades\App
不支持在其静态 属性 [=25 上调用任意函数=].
为了让它工作,我在 Illuminate\Support\Facades\App
中添加了以下函数:
public function __call( $method , array $arguments ) {
return call_user_func_array(array(static::$app, $method), $arguments);
}
但是肯定编辑外部组件不是正确的做法!!!肯定有人以前遇到过这个!
所以问题是:执行此操作的正确方法是什么?
您缺少一个关键组件。 Application
class 需要绑定到容器。 Facade 正在寻找要绑定到 'app' 的 class 但没有找到,因此您的错误。您可以通过将 Illuminate\Container\Container
class 绑定到 'app':
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');