2011-08-04 37 views
23

Tôi đang học Symfony2 (và OOP) và muốn tạo một dịch vụ có sẵn trong ứng dụng của tôi. Dịch vụ này lấy một giá trị foo, kiểm tra nó dựa vào một bảng cơ sở dữ liệu và trả về một thanh giá trị.Làm thế nào để bạn truy cập Doctrine DBAL trong một lớp dịch vụ Symfony2?

Tôi có một chút lớp

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; 
    } 


} 

thiết lập của tôi là:

services: 
    toolbox: 
     class:  Acme\TestBundle\Toolbox 
     arguments: [@database_connection] 

Nhưng nó ném một lỗi nói rằng method get() là không xác định. Tôi bị kẹt-- làm cách nào tôi có thể sử dụng DBAL trong dịch vụ? Cảm ơn!

Trả lời

34

Trước hết bạn nên thêm một constructor cho lớp của bạn và vượt qua trong các @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; 
    } 


} 

cấu hình dịch vụ của bạn bây giờ sẽ trông như thế này:

parameters: 
my_service_connection: default 

services: 
toolbox: 
    class:  Acme\TestBundle\Toolbox\StringToolbox 
    arguments: [@doctrine.dbal.%my_service_connection%_connection] 

gì bạn đang nói với cấu hình này là "biến tôi thành dịch vụ có tên hộp công cụ sẽ nhận dịch vụ doctrine.dbal.default_connection làm đối số hàm tạo đầu tiên"

Có các phương pháp tiêm khác bên cạnh việc tiêm Constructor và bạn nên đọc tài liệu http://symfony.com/doc/current/book/service_container.html để nắm bắt tất cả các khả năng (Setter injection, Factory injection, vv) và để hiểu rõ hơn cách Dependency Injection hoạt động

+0

này giúp ích rất nhiều! Các tài liệu của Symfony rất tuyệt vời nhưng chúng cho rằng toàn bộ kiến ​​thức về OOP và tôi có một số khoảng trống. Cảm ơn! – Acyra

+0

Vì một số lý do này không còn hoạt động nữa, tôi phải chuyển một đối số khác: các đối số: [@database_connection] – Acyra

+5

Dịch vụ '@ doctrine.dbal.connection' là một trừu tượng. Hãy thử sử dụng '@ doctrine.dbal.% Connection_name% _connection' trong đó'% connection_name% 'giữ chỗ tên của kết nối mà bạn muốn tiêm. –

9

@doctrine.dbal.connection không hoạt động, Như Igor nói rằng, @doctrine.dbal.connection là bản tóm tắt, sử dụng @doctrine.dbal.default_connection nếu bạn chỉ có một kết nối db hoặc @doctrine.dbal.%connection_name%_connection trong đó trình giữ chỗ %connection_name% tên của kết nối mà bạn muốn chèn.

cấu hình dịch vụ của bạn bây giờ sẽ trông như thế này:

services: 
toolbox: 
    class:  Acme\TestBundle\Toolbox\StringToolbox 
    arguments: [@doctrine.dbal.default_connection] 
+0

Cảm ơn câu trả lời của bạn. Nếu chúng ta sử dụng '@ doctrine.dbal.Cách tiếp cận% connection_name% _connection', sau đó làm cách nào để chuyển '% connection_name%' cho kết nối mong muốn? – Nis

Các vấn đề liên quan