【问题标题】:Accessing $app inside Silex Shared Service在 Silex 共享服务中访问 $app
【发布时间】:2013-10-14 18:21:42
【问题描述】:

我正在我的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 中设置的变量。有没有办法访问父 $app 而不是这个内部版本?

【问题讨论】:

    标签: silex


    【解决方案1】:

    您正在使用类型提示 __construct(Application $app) 将整个 $app 注入到 Rules 构造函数中,但不是在调用时由 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 中的代码没问题,构造函数保持原样。

    【讨论】:

    • 如果我没有在 Rules() 中传递任何内容,似乎没有任何方法可以访问 Rules 类中的 $app 。你是在建议return new MyProject\Rules($app); 和public function __construct($app) 吗? (我需要在我的共享函数中使用整个 $app。)
    • 我将使用代码示例更新我的答案以执行您想要的操作,但我强烈建议您阅读更多关于Pimple(Silex 的依赖注入容器组件)如何工作的信息更好地了解 Silex 的工作原理。
    • 我已经更新了代码,如果你仔细看,我没有使用use传递$app,它会被Silex在调用时注入。
    猜你喜欢
    • 2014-10-09
    • 1970-01-01
    • 2018-11-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-24
    • 1970-01-01
    相关资源
    最近更新 更多