在symfony中创建服务或类

时间:2015-12-18 19:47:26

标签: mongodb symfony dependency-injection

我创建了新的连接mongoDB的类,它是一个单例类。

我是否已在服务中转换此类?

何时使用服务而不是类?

服务已经是Singleton吗?

我的服务是

class MongoDB
{

    private $dbname;
    private $url;
    private $db;

    /**
     * MongoDB constructor.
     * @param $dbname
     * @param $url
     */
    public function __construct($dbname,$url)
    {
        $this->dbname = $dbname;
        $this->url = $url;
    }

    public function getMongoCon()
    {
        if ($this->db === null)
        {
            try {
                $connection = new \MongoClient($this->url);
                $this->db = $connection->selectDB($this->dbname);
            } catch (\MongoConnectionException $e) {
                die('Failed to connect to MongoDB '.$e->getMessage());
            }
            $this->db = $connection;
        }

        return $this->db;
    }
}

1 个答案:

答案 0 :(得分:4)

让我们一点一点地看待它们:

  

我是否已在服务中转换此类?

不,你没有拥有。在典型的用例中,建议使用它,因为您可能需要将其注入其他服务,这意味着它需要是一个服务才能注入。

  

何时使用服务而不是类?

这两个案例中有99%不相互排斥。服务由其类定义,可以/必须传递给其构造函数的参数(例如,它的依赖项),标签等。或者它可以是工厂服务或抽象服务或Symfony提供的任何其他类型。

  

服务已经是Singleton吗?

是和否。服务不会自动成为单身人士。除非通过范围明确指定(自2.8以来已弃用并在3.0中删除),否则服务仅在Symfony的容器中实例化一次。任何后续的检索尝试都会反复返回相同的实例。

我建议您阅读更多有关依赖注入以及如何在Symfony中实现的内容。它基本上是整个框架的核心和核心。一旦你理解了这个部分,关于框架的其他一切将更容易掌握;)。

PS:你没有正确实现Singleton模式。