2

我在我的文件中做这样的共享服务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 时,$app['rules']->test();它是一种新的版本 $app 并且它没有我稍后$app从应用程序的其他部分设置的变量。有没有办法访问父$app级而不是这个内部版本?

4

1 回答 1

6

您正在使用类型提示将整体$app注入构造函数,但不是在调用时由 DIC 注入,而是在 ti 的当前状态(部分)中传递变量。Rules__construct(Application $app)$app$appuse

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

顺便说一句,您正在注入整个容器(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很好,保持构造函数不变。

于 2013-10-15T01:26:22.530 回答