Symfony服务在哪里可以使用?

时间:2015-03-01 15:55:59

标签: symfony

official documentation中创建和使用服务的示例。在开始我们创建一些类,然后在config / services.yml中注册它,然后我们可以在我们的代码中使用它,如下所示:

$result = $this->get('app.myservice')->myMethod($arg);

//(In the [example][1] it is little bit other code:)
//$slug = $this->get('app.slugger')->slugify($post->getTitle());

但是为了什么?虽然我可以像这样做同样的事情:

use MyServiceNamespace/MyService
//...
$result = (new MyService())->myMethod($arg);

使用服务的利润在哪里?这只是语法糖吗?

2 个答案:

答案 0 :(得分:4)

不。远非语法糖。

您需要对依赖注入的含义有所了解。也许从这里浏览开始:http://symfony.com/doc/current/book/service_container.html

假设您的服务需要一个学说资源库来完成它的工作。哪个更好?

class MyController
{...
    $userManager = $this->get('user.manager');
    OR
    $userRepository = $this->getDoctrine()->getManager()->getRepository('MyBundle::User');
    $userManager = new UserManager($userRepository);

您的选择,但是一旦您完成了如何添加服务的机制,那么您将永远不会回头。

我还应该指出,你的sluglfy示例需要一个use语句,并将代码直接绑定到特定的实现。如果你需要调整你的slugge然后你需要返回并改变所有使用它的地方。

// These lines make your code more difficult to maintain
use Something\Slugify;
$slugify = new Slugify();
AS Opposed to
$slugify = $this->get('slugify');

答案 1 :(得分:3)

在这种情况下,它并不真正相关。但是从简单的设计考虑,服务允许更好的依赖管理。

例如,如果您宣布在另一个服务中继服务,那么您不必实例化这两个服务。 Symfony会照顾它。

由于您的声明是集中的,对您决定创建服务的方式进行了任何修改(=声明它),您不必更改所有对您更改的服务的引用,因为symfony将负责它在需要时的实施方式。

另一点是服务范围。可能会检查此信息,但我认为symfony一次性服务(Singleton)意味着更好的内存使用。