2015-11-01 149 views
0

我想注入一个依赖到我的Silex控制器,因为我需要一个在我的控制器中的用户类型的对象,并处理它的一些东西。Silex控制器依赖注入

$app->mount("/users", new \MyApp\Controller\Provider\User($user)); 

而且我通过实现ControllerProviderInterface实现控制器:

class User implements ControllerProviderInterface{ 
    protected $user; 

    public function __construct($user){ 
     //... 
    } 

    public function connect(Application $app) 
    { 
     //... 
    } 
} 

的途径和方法都是在控制器设置。没有依赖注入一切工作正常。但是只要我编辑的代码,并添加注射我收到以下错误:

Missing argument 1 for ...::__construct()

当我创建的对象,我该参数发送给它,但不知何故的Silex没有通过一个构造函数之前创建一个实例任何争论。

回答

4

另一种方法是使用ServiceController而不是ControllerProvider。您可以通过这种方式获得更熟悉的依赖注入感受。

$app->register(new Silex\Provider\ServiceControllerServiceProvider()); 

$app["user"] = function() { 
    return new User(); 
}; 
$app["user.controller"] = function() use ($app) { 
    return new UserController($app["user"]); 
}; 

$app->get("https://stackoverflow.com/users/{id}", "user.controller:get"); 

...

class User implements UserInterface 
{ 
    // ... 
} 

...

class UserController 
{ 
    protected $user; 

    public function __construct(UserInterface $user) 
    { 
     $this->user = $user; 
    } 

    public function get(Request $request, $id) 
    { 
     $this->user; 

     // Do stuff 
    } 
} 

参考:http://silex.sensiolabs.org/doc/providers/service_controller.html

+0

这看起来更熟悉。我想我会使用ServiceController,因为我们知道它更像是依赖注入。感谢您的回答和您的帮助! – Tobias

1

Silex采用了一种不同的方法来进行依赖注入,而不是您可能会习惯或可能期望的方式。 Silex\Application是在Silex应用程序的几乎任何上下文中都可用的依赖注入容器。您可以使用$app注册您的依赖关系,这些依赖关系可以通过$app注入到您可能需要的任何环境中。以下是您可能在您的情况下做的一些事例。

$app["user"] = function() { 
    return new \MyApp\Service\User(); 
}; 

$app->mount("/users", new \MyApp\Controller\Provider\User()); 

...

class User implements ControllerProviderInterface 
{ 
    public function connect(Application $app) 
    { 
     $controller = $app["controller_factory"]; 

     $controller->get("/{id}", array($this, "get")); 

     return $controller; 
    } 

    public function get(Application $app, Request $request, $id) 
    { 
     $user = $app["user"]; 

     // Do stuff 
    } 
} 

依赖注入Silex的是不同的,它需要时间来适应了一点,但一旦你熟悉它,它是一个很高兴一起工作,这是非常有效的。

+0

太谢谢你了! :) – Tobias

0

这个接受的答案不是问题的答案。而答案中所描述的事情也不是依赖注入,或者是它的一种真正的粗糙形式。它更像是硬编码$应用到你的控制器中。

问题中的代码应该不加修改地工作。连接函数和构造函数中的代码可能会帮助您找出问题出在哪里。它不是呼吁登上,林肯定。

+0

你有什么建议?我可以通过$ app对象注入依赖项,但是,这不是最好的方法。也许你可以举一个例子,说明它应该如何正确完成。我的代码不起作用,我无法弄清楚错误在哪里。谢谢 – Tobias

+0

@bloodstix,我的目标是提供惯用的Silex方式来做到这一点。就像我在回答中所说的,Silex采用不同的方法来注入依赖关系。这并不是大多数人在考虑依赖注入时所想到的,但它具有相同的目的。你可能会争辩说这不是严格的依赖注入,但那真的不是我的观点。 – Jason

+0

不,它不。它只是没有为你呈现一个自动的。 在$ app中注册您的单个依赖关系,然后为您的类提供需要依赖关系的类,以及$ Component上的具体索引。 这将是依赖注入。要求具体的东西,而不是容器。 – bloodstix