有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);
使用服务的利润在哪里?这只是语法糖吗?
答案 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)意味着更好的内存使用。