答案 0 :(得分:37)
首先,你应该在你的班级中添加一个构造函数并传入@doctrine.dbal.%connection_name%_connection service
namespace Acme\TestBundle\Toolbox;
use Doctrine\DBAL\Connection;
class StringToolbox
{
/**
*
* @var Connection
*/
private $connection;
public function __construct(Connection $dbalConnection) {
$this->connection = $dbalConnection;
}
public function lookupSomething($foo)
{
$sql = "SELECT bar FROM bar_list WHERE foo = :foo";
$stmt = $this->connection->prepare($sql);
$stmt->bindValue("foo", $foo);
$stmt->execute();
return $bar;
}
}
您的服务配置现在应如下所示:
parameters:
my_service_connection: default
services:
toolbox:
class: Acme\TestBundle\Toolbox\StringToolbox
arguments: [@doctrine.dbal.%my_service_connection%_connection]
您对此配置的说法是“让我成为一个名为工具箱的服务,它将接收doctrine.dbal.default_connection服务作为第一个构造函数参数”
除了构造函数注入之外还有其他注入方法,您应该阅读http://symfony.com/doc/current/book/service_container.html文档以掌握所有可能性(Setter注入,工厂注入等)并更好地理解依赖注入的工作原理
答案 1 :(得分:9)
@doctrine.dbal.connection
无法正常工作,正如Igor所说,@doctrine.dbal.connection
是摘要,如果您只有一个数据库连接则使用@doctrine.dbal.default_connection
,或@doctrine.dbal.%connection_name%_connection
使用%connection_name%
} placeholder要注入的连接的名称。
您的服务配置现在应如下所示:
services:
toolbox:
class: Acme\TestBundle\Toolbox\StringToolbox
arguments: [@doctrine.dbal.default_connection]