访问Silex共享服务中的$ app

时间:2013-10-14 18:21:42

标签: silex

我正在app.php文件中执行此类共享服务:

$app['rules'] = $app->share(function() use($app) {
    return new MyProject\Rules($app);
});

然后:

namespace MyProject;

use Silex\Application;

class Rules
{

    private $app;
    public $request;

    public function __construct(Application $app) {
        $this->app = $app;
    }


    public test() {
        print_r($this->app['something']);
    }
}

但是当我在$app['rules']->test();内部访问$ app时,它是一种新版本的应用程序,并且它没有我稍后在$app中从应用程序的其他部分设置的变量。有没有办法访问父$app而不是这个内部版本?

1 个答案:

答案 0 :(得分:6)

您正在使用类型提示$app将整个Rules注入__construct(Application $app)构造函数,但不是在通话时间内通过DIC注入$app,而是在ti的当前状态($app部分)中传递变量use

你必须使用其中一种,你这样做会覆盖类型提示并在当前状态下传递变量,不会注入任何未来的属性。

顺便说一句,您正在注入整个容器(Silex \ Application)。更好的方法是只注入您需要的服务。

$app['rules'] = $app->share(function($app) { //$app is Injected automatically when called
    return new MyProject\Rules($app); //here you pass the whole container
    return new MyProject\Rules($app['something']); //here you pass only the required dependency
});

MyProject中的代码很好,保留构造函数。