Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/symfony/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php Symfony 2最佳实践DBAL无对象原则_Php_Symfony_Pdo_Doctrine Orm_Doctrine - Fatal编程技术网

Php Symfony 2最佳实践DBAL无对象原则

Php Symfony 2最佳实践DBAL无对象原则,php,symfony,pdo,doctrine-orm,doctrine,Php,Symfony,Pdo,Doctrine Orm,Doctrine,我终于开始学习Symfony了,我想人们会理解我的问题(我希望)和我构建代码的愿望 我想创建一个名为Reception的类,这个类在每个方法/函数中都有一个sql。每个和evry方法都可以返回不同的列名结果 例如: sql1:Jo;日期; sql2:客户端;汽车时间 让我们告诉你,我不想创建一个实体来将其与条令一起使用 我想使用DBAL(pdo原则sql查询)来执行我的查询。。。就像普通的PHP poo编程一样 最后一个问题是:我是否应该将这个类作为服务、实体来完成?或者我可以简单地将pdo查询

我终于开始学习Symfony了,我想人们会理解我的问题(我希望)和我构建代码的愿望

我想创建一个名为Reception的类,这个类在每个方法/函数中都有一个sql。每个和evry方法都可以返回不同的列名结果

例如: sql1:Jo;日期; sql2:客户端;汽车时间

让我们告诉你,我不想创建一个实体来将其与条令一起使用

我想使用DBAL(pdo原则sql查询)来执行我的查询。。。就像普通的PHP poo编程一样

最后一个问题是:我是否应该将这个类作为服务、实体来完成?或者我可以简单地将pdo查询放在控制器中

提前感谢您的回答。。。 我暂时避免信条,因为我主要做一些统计工作,也会玩一点symfony,提高难度水平

谢谢你的理解。。。 早安

服务()通常只是负责完成某些特定任务的一门课。假设您有一些统计信息,您需要在特定事件发生时更新这些统计信息(例如,文件被下载、收藏等),并且您有多个控制器,这些不同的事件发生在这些控制器中。简单地“复制粘贴”代码是一个非常糟糕的主意。更好的方法是创建一个服务并调用它

实体
()是表示数据库表的对象。此对象稍后可用于在Symfony中生成表单。一旦创建了
实体
,就可以创建
实体存储
。它用于存储更全面的sql查询。例如,您可以使用如下方法:

public function findUsersWithOrders() {
    // Here you can:
    //  1. use queryBuilder, which generates the query for you
    //  2. write your DQL (Doctrine Query Language) manually
    //  3. write a plain SQL query and return the results
}
我强烈建议您使用这种方法——一旦掌握了它,它将为您节省大量时间,而且IMHO是一种更好的编码实践

如果您仍然决定继续在类中存储查询的想法:

  • 是的,您可以创建一个
    服务
    ,并将其用于该目的。您应该使用Symfony>=2.3,因为它优化了服务加载。以下是您的服务的示例:

    // App\BaseBundle\Services\MyServiceName.php
    namespace App\BaseBundle\Services;
    
    use Doctrine\ORM\EntityManager;
    
    class MyServiceName {
    
        /**
         * @var \Doctrine\ORM\EntityManager
         */
        private $em;
    
        /**
         * @var \Doctrine\DBAL\Connection
         */
        private $connection;
    
        public function __construct(EntityManager $entityManager) {
            $this->em = $entityManager;
            $this->connection = $entityManager->getConnection();
        }
    
        public function getUsers(){
            // Update query
            $this->connection->query('UPDATE statistics SET counter=counter+1 WHERE id = 1')->execute();
    
            // Prepare (you can use just query() as well)
            $select = $this->connection->prepare('SELECT * FROM users WHERE username LIKE :username');
            $select->bindValue(':username', '%sample%');
            $select->execute();
    
            return $select->fetch(\PDO::FETCH_ASSOC);
        }
    }
    
    然后,在您的
    services.yml
    文件中,您需要放置以下内容:

    app.myservicename:
        class: App\BaseBundle\Services\MyServiceName
        arguments: [ @doctrine.orm.entity_manager ]
    
    现在,无论何时从
    控制器调用
    $this->get('app.myservicename')
    ,您都将获得一个类的实例

  • 当然,您也可以将sql代码放入控制器中。这不是一个好的做法,但是你应该避免这样做。此示例向您展示了如何执行此操作:

    /**
     * @Route("/some/route")
     * @Template()
     */
    public function indexAction()
    {
    
        /**
         * @var \Doctrine\ORM\EntityManager $em
         */
        $em = $this->getDoctrine()->getManager();
    
        // some business logic ...
    
        try {
            $em->getConnection()->query('UPDATE statistics SET counter=counter+1 WHERE id = 1')->execute();
        } catch(\Doctrine\DBAL\DBALException $e){
            // the query might fail, catch the exception and do something with it.
        }
    
        // other business logic...
    
        return array('name' => 'Hello World');
    }
    

  • 我建议您查看一下,看看解决常见问题的最佳方法是什么。同时,阅读将帮助您澄清许多问题。

    您好,tfld!哇,谢谢你理解我的问题,谢谢你完整而清晰的回答。。。它非常有用,这个月我用了两次。我终于明白了实体、服务和如何有效地构建代码之间的区别!!:)很好的一天!我很高兴能帮上忙!我从经验中知道,刚开始使用symfony时会有点困惑,但过了一段时间,你就会意识到它有多大的潜力。干杯!:)