Kon*_*tin 6 php ioc-container laravel illuminate-container laravel-facade
在我的独立(没有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');
Run Code Online (Sandbox Code Playgroud)
不幸的是,尝试绑定某些内容会导致:
Fatal error: Call to undefined method Illuminate\Support\Facades\App::bind() in ...\illuminate\support\Facades\Facade.php on line 213
Run Code Online (Sandbox Code Playgroud)
这是该行的代码
$instance = static::getFacadeRoot();
...
return $instance->$method($args[0], $args[1]); // <--- line 213
Run Code Online (Sandbox Code Playgroud)
哪里$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);
}
Run Code Online (Sandbox Code Playgroud)
但肯定编辑外部组件不是正确的做法!肯定有人以前遇到过这个!
所以问题是:这样做的正确方法是什么?
您缺少一个关键组件。类Application需要绑定到容器。外观正在寻找一个绑定到“app”的类,但什么也没有,因此你的错误。您可以通过将类绑定到“app”来解决问题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');
Run Code Online (Sandbox Code Playgroud)