6

在我的独立(没有 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'$instanceIlluminate\Container\ContainerIlluminate\Support\Facades\App$app

为了使它工作,我添加了以下功能Illuminate\Support\Facades\App

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

但是编辑外部组件肯定不是正确的做法!!!肯定有人遇到过这种情况!

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

4

1 回答 1

3

您缺少一个关键组件。该类Application需要绑定到容器。门面正在寻找一个绑定到“应用程序”的类,但什么都没有,因此你的错误。您可以通过将类绑定Illuminate\Container\Container到“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');
于 2015-05-05T15:43:14.190 回答