如何为独立的Illuminate IoC容器创建Illuminate/Support/Facade/App门面 [英] How to create Illuminate/Support/Facade/App facade for standalone Illuminate IoC Container

查看:119
本文介绍了如何为独立的Illuminate IoC容器创建Illuminate/Support/Facade/App门面的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

在我的独立项目(没有Laravel)中,我想使用Illuminate IoC容器.我也想通过illuminate/support组件提供的App门面访问应用程序容器.我安装了两个组件(v5.0.28).这是我的(简化)代码:

In my standalone (without Laravel) project i want to use Illuminate IoC container. Also i would like to access the app container through App facade provided by illuminate/support component. I installed both components (v5.0.28). Here is my (simplified) code:

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');

不幸的是,尝试绑定某些东西会导致:

Unfortunately, trying to bind something results in:

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上调用任意函数.

Where $instance is an instance of Illuminate\Support\Facades\App, $method == 'bind', $args[0] == 'w' and $args[1] == 'Widget'. The problem is that $instance is not an instance of Illuminate\Container\Container and class Illuminate\Support\Facades\App does not have any support for calling arbitrary functions on its static property $app.

为使其正常工作,我向Illuminate\Support\Facades\App添加了以下功能:

To make it work i added the following function to Illuminate\Support\Facades\App:

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

但是肯定地编辑外部组件不是正确的事情!!!肯定有人遇到过!

But surely editing external component is not the right thing to do!!! Surely someone have encountered this before!

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

So the question is : What is the proper way to do this?

推荐答案

您缺少一个关键组成部分. Application类需要绑定到容器.外立面正在寻找要绑定到"app"的类,但没有,因此是您的错误.您可以通过将Illuminate\Container\Container类绑定到'app'来解决此问题:

You are missing one key component. The Application class needs to be bound to the container. The Facade is looking for a class to be bound to 'app' but nothing is, hence your error. You can fix the problem by binding the Illuminate\Container\Container class to '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');

这篇关于如何为独立的Illuminate IoC容器创建Illuminate/Support/Facade/App门面的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆