我正在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
而不是这个内部版本?
答案 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
中的代码很好,保留构造函数。