Update
2013-10-03
请原谅我编辑一个两年前的答案......然而,有几个人质疑现有的方法,虽然它有效(并且对于我的特定用例来说工作得很好),但定义服务当然是交响乐方式.
没有人提供示例,因此,为了参考/完整性,我将更新我的答案。我必须承认我不是真的au fait当我最初发布这个答案时定义自定义服务,但我们生活和学习。
原答案保留如下。
1. 创建额外的DBAL连接
- 创建连接
foo
in app/config/config.yml
.
- 争论
wrapper_class
在这种情况下不需要(参见原始答案)。
doctrine:
dbal:
connections:
default:
driver: %database_driver%
host: %database_host%
dbname: %database_name%
user: %database_user%
foo:
driver: %foo_driver%
host: %foo_host%
dbname: %foo_name%
user: %foo_user%
2.配置服务
- 假设 YAML 格式。
- 添加配置到
src/Acme/TestBundle/Resources/config/services.yml
.
- 注意,我们正在注入上面定义的 DBAL
foo_connection
进入服务。
services:
foo_query_service:
class: Acme\TestBundle\Services\FooQueryService
arguments:
- @doctrine.dbal.foo_connection
3.为配置的服务创建类
- 创建以下类
src/Acme/TestBundle/Services/FooQueryService.php
:
<?php
namespace Acme\TestBundle\Services;
use DateTime;
use Doctrine\DBAL\Connection;
class FooQueryService
{
private $connection;
public function __construct(Connection $connection)
{
$this->connection = $connection;
}
public function findBarByDate(DateTime $date)
{
$stmt = $this->connection->prepare('SELECT * FROM bar WHERE date = :date');
$stmt->bindValue('date', $date, 'datetime');
$stmt->execute();
return $stmt->fetch();
}
}
4. 最后,在任何需要的地方使用您的查询!
例如,在控制器中...
/**
* @Route("/", name="home")
* @Template()
*/
public function indexAction()
{
$date = new \DateTime();
$result = $this->get('foo_query_service')
->findBarByDate($date);
return array();
}
完成:)感谢Acayra
and koskoz
以获取他们的反馈。
好吧,我想我找到了一个在这种情况下适合我的解决方案。
实际上,我对创建实体/管理器进行了另一次研究 - 实际上,似乎缺乏将特定实体映射到多个管理器的 Symfony2 文档。在这种情况下,它似乎仍然是一种矫枉过正的方法(并且“参考”模式非常混乱)。
幸运的是,可以为 DBAL 连接指定一个包装类,并将查询抽象为其中的特定方法。
- 使用包装类创建额外的 DBAL 连接
config.yml
:
doctrine:
orm:
connections:
default:
driver: %driver%
host: %host%
dbname: %name%
user: %user%
foo:
wrapper_class: 'Acme\TestBundle\Doctrine\DBAL\FooConnection'
driver: %foo_driver%
host: %foo_host%
dbname: %foo_name%
user: %foo_user%
- 在指定的路径创建包装类:
<?php
namespace Acme\TestBundle\Doctrine\DBAL\FooConnection;
use Doctrine\DBAL\Connection;
class FooConnection extends Connection
{
// custom query...
public function findBarByDate(\DateTime $date)
{
$stmt = $this->prepare('SELECT * FROM bar WHERE date = :date');
$stmt->bindValue('date', $date, 'datetime');
$stmt->execute();
return $stmt->fetch();
}
}
请注意,包装类必须扩展\Doctrine\DBAL\Connection
.
- 在任何需要的地方使用您的查询:
$date = new \DateTime();
$conn = $this->getDoctrine()->getConnection('foo');
$result = $conn->findBarByDate($date);
希望这可以帮助!