我正在学习Symfony2(和OOP)并希望创建一个可在我的应用程序中使用的服务.此服务获取值foo,根据数据库表进行检查,并返回值栏.
我有一个小班
namespace Acme\TestBundle\Toolbox;
class StringToolbox
{
public function lookupSomething($foo)
{
$conn = $this->get('database_connection');
$sql = "SELECT bar FROM bar_list WHERE foo = :foo";
$stmt = $conn->prepare($sql);
$stmt->bindValue("foo", $foo);
$stmt->execute();
return $bar;
}
}
Run Code Online (Sandbox Code Playgroud)
我的设置是:
services:
toolbox:
class: Acme\TestBundle\Toolbox
arguments: [@database_connection]
Run Code Online (Sandbox Code Playgroud)
但它抛出一个错误,说get()方法是未定义的.我被困了 - 我怎么能在服务中使用DBAL?谢谢!
cat*_*che 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;
}
}
Run Code Online (Sandbox Code Playgroud)
您的服务配置现在应如下所示:
parameters:
my_service_connection: default
services:
toolbox:
class: Acme\TestBundle\Toolbox\StringToolbox
arguments: [@doctrine.dbal.%my_service_connection%_connection]
Run Code Online (Sandbox Code Playgroud)
你在这个配置中说的是"让我成为一个名为工具箱的服务,它将接收doctrine.dbal.default_connection服务作为第一个构造函数参数"
除了构造函数注入之外还有其他注入方法,您应该阅读http://symfony.com/doc/current/book/service_container.html文档以掌握所有可能性(Setter注入,工厂注入等)并且更好了解依赖注入如何工作
Ste*_*ing 10
@doctrine.dbal.connection不工作,作为伊戈尔说,@doctrine.dbal.connection是一个抽象的,使用@doctrine.dbal.default_connection如果你只有一个数据库连接,或者@doctrine.dbal.%connection_name%_connection在%connection_name%占位符,要注入的连接的名称.
您的服务配置现在应如下所示:
services:
toolbox:
class: Acme\TestBundle\Toolbox\StringToolbox
arguments: [@doctrine.dbal.default_connection]
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
20430 次 |
| 最近记录: |