如何为独立的Illuminate IoC Container创建Illuminate / Support / Facade / App facade

时间:2015-05-05 12:58:46

标签: php laravel ioc-container 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');

不幸的是,尝试绑定某些内容会导致:

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

其中$instanceIlluminate\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);
}

但肯定编辑外部组件不是正确的做法!肯定有人以前遇到过这个!

所以问题是:这样做的正确方法是什么?

1 个答案:

答案 0 :(得分:2)

您缺少一个关键组件。 Application类需要绑定到容器。 Facade正在寻找一个应用于“应用程序”的课程。但没有,因此你的错误。您可以通过将Illuminate\Container\Container课程绑定到&#39; app&#39;

来解决问题
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');