2011-08-04 12 views
23

मैं सिम्फनी 2 (और ओओपी) सीख रहा हूं और एक सेवा बनाना चाहता हूं जो पूरे ऐप में उपलब्ध हो। यह सेवा एक मूल्य foo लेती है, इसे डेटाबेस तालिका के विरुद्ध जांचती है, और एक मान बार देता है।आप सिम्फनी 2 सर्विस क्लास में डॉक्टरेट डीबीएएल तक कैसे पहुंचते हैं?

मैं एक छोटे से वर्ग है

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


} 

मेरी सेटिंग्स हैं:

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

लेकिन यह एक त्रुटि कह रही है कि प्राप्त() विधि अपरिभाषित है फेंकता है। मैं अटक गया हूँ - मैं सेवा में डीबीएएल का उपयोग कैसे कर सकता हूं? धन्यवाद!

उत्तर

34

सबसे पहले आप अपने वर्ग के लिए एक निर्माता जोड़ना चाहिए और पारित @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 दस्तावेज़ पढ़ें सभी संभावनाओं की समझ (सेटर इंजेक्शन, फैक्टरी इंजेक्शन, आदि) प्राप्त करने के लिए करना चाहिए और बेहतर कैसे निर्भरता इंजेक्शन काम करता है

+0

यह एक बहुत मदद करता है! सिम्फनी दस्तावेज़ बहुत अच्छे हैं लेकिन वे पूर्ण ओओपी ज्ञान मानते हैं, और मेरे पास कुछ अंतराल हैं। धन्यवाद! – Acyra

+0

किसी कारण से यह अब काम नहीं करता है, मुझे एक अलग तर्क पारित करना होगा: तर्क: [@डेटा_कनेक्शन] – Acyra

+5

'@ doctrine.dbal.connection' सेवा एक सार है। '@ Doctrine.dbal।% Connection_name% _connection' का उपयोग करने का प्रयास करें, जहां'% connection_name% 'प्लेसहोल्डर उस कनेक्शन का नाम है जिसे आप इंजेक्ट करना चाहते हैं। –

9

@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] 
+0

आपके उत्तर के लिए धन्यवाद। अगर हम '@ doctrine.dbal का उपयोग करते हैं।% connection_name% _connection' दृष्टिकोण, फिर हम वांछित कनेक्शन के लिए '% connection_name%' कैसे पास करते हैं? – Nis

संबंधित मुद्दे