Php Symfony 2最佳实践DBAL无对象原则
我终于开始学习Symfony了,我想人们会理解我的问题(我希望)和我构建代码的愿望 我想创建一个名为Reception的类,这个类在每个方法/函数中都有一个sql。每个和evry方法都可以返回不同的列名结果 例如: sql1:Jo;日期; sql2:客户端;汽车时间 让我们告诉你,我不想创建一个实体来将其与条令一起使用 我想使用DBAL(pdo原则sql查询)来执行我的查询。。。就像普通的PHP poo编程一样 最后一个问题是:我是否应该将这个类作为服务、实体来完成?或者我可以简单地将pdo查询放在控制器中 提前感谢您的回答。。。 我暂时避免信条,因为我主要做一些统计工作,也会玩一点symfony,提高难度水平 谢谢你的理解。。。 早安服务()通常只是负责完成某些特定任务的一门课。假设您有一些统计信息,您需要在特定事件发生时更新这些统计信息(例如,文件被下载、收藏等),并且您有多个控制器,这些不同的事件发生在这些控制器中。简单地“复制粘贴”代码是一个非常糟糕的主意。更好的方法是创建一个服务并调用它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中生成表单。一旦创建了实体
,就可以创建实体存储
。它用于存储更全面的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')
,您都将获得一个类的实例
/**
* @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时会有点困惑,但过了一段时间,你就会意识到它有多大的潜力。干杯!:)