2012-02-09 15 views
109

रूट एप निर्देशिका को नियंत्रक के अंदर से प्राप्त करने का सबसे अच्छा तरीका क्या है? क्या इसे नियंत्रक के बाहर ले जाना संभव है?Symfony2 एप्लिकेशन की रूट डीआईआर कैसे प्राप्त करें?

अब मैं, एक तर्क के रूप सेवा करने के लिए (पैरामीटर से) यह पारित करके इसे पाने के इस तरह:

services: 

    sr_processor: 
     class: Pro\Processor 
     arguments: [%kernel.root_dir%] 

वहाँ एक बेहतर, सरल तरीके से Symfony2 में यह जानकारी प्राप्त करने है?

+11

आपका समाधान सर्वोत्तम है – Inoryy

+4

आप एक सेवा और नियंत्रक को जोड़ रहे हैं –

+2

फिर से सिम्फनी 3.3 के लिए और बाद में अपनी परियोजना की जड़ प्राप्त करने के लिए '% kernel.project_dir%' का उपयोग करें। –

उत्तर

199

उपयोग करें:

$this->get('kernel')->getRootDir(); 

और तुम वेब जड़ चाहते हैं:

$this->get('kernel')->getRootDir() . '/../web' . $this->getRequest()->getBasePath(); 

इस नियंत्रक कार्रवाई विधि से काम करेंगे ...

संपादित करें: का सवाल है सेवाओं, मुझे लगता है कि जिस तरह से आपने इसे संभव बनाया उतना साफ है, हालांकि मैं पूर्ण कर्नेल सेवा को तर्क के रूप में पास कर दूंगा ... लेकिन थाई रों भी चाल हो जाएगा ...

+3

+1 लेकिन symfony2 के लिए सटीक नहीं है। इसके बजाए उपयोग करें: '$ this-> प्राप्त करें (' कर्नेल ') -> getRootDir()। '/../ ..'। $ this-> getRequest() -> getBasePath(); ' – Sebastian

+0

क्या आप निश्चित हैं? मैंने इस कोड का सफलतापूर्वक '2.0' -> '2.2' में उपयोग किया है। निर्देशिका संरचना '2.3' या' मास्टर' में बदल गई थी? –

+34

यह समाधान केवल नियंत्रकों के लिए सही है। यहां समस्या सेवाओं के बारे में है। वैसे भी, एक चर प्राप्त करने के लिए * पूरे * कंटेनर को क्यों गुजर रहा है? केवल% kernel.root_dir% –

6

आप भी इस के अलावा रेगुलर एक्सप्रेशन का उपयोग कर सकते हैं:

$directoryPath = $this->container->getParameter('kernel.root_dir') . '/../web/bundles/yourbundle/'; 
    $directoryPath = preg_replace("/app..../i", "", $directoryPath); 
    echo $directoryPath; 
7

आप (उदाहरण के लिए परियोजनाएं हैं जो कोड नहीं हैं के कुछ हिस्सों तक पहुँचने के लिए इस मार्ग का उपयोग कर रहे हैं एक अपलोड निर्देशिका, या एक SQLite डेटाबेस) तो यह एक पैरामीटर में पथ चालू करने के लिए, इस तरह बेहतर हो सकता है:

parameters: 
    database_path: '%kernel.root_dir%/../var/sqlite3.db' 

यह पैरामीटर हर जगह इंजेक्ट किया जा सकता यदि आपको इसकी आवश्यकता है, तो आप गंदगी की जरूरत नहीं है अपने कोड में पथ के साथ अब और भी। इसके अलावा, पैरामीटर तैनाती के समय पर ओवरराइड किया जा सकता है। अंत में, प्रत्येक रखरखाव प्रोग्रामर के पास एक बेहतर विचार होगा कि आप इसके लिए क्या उपयोग कर रहे हैं।

अद्यतन: निश्चित kernel.root_dir निरंतर उपयोग।

5

In Symfony 3.3 आप

$projectRoot = $this->get('kernel')->getProjectDir(); 

का उपयोग वेब/परियोजना जड़ पाने के लिए कर सकते हैं।

+1

के बजाय उपयोग करें! मुझे उन लोगों से प्यार है जो रिलीज नोट पढ़ते हैं))) –

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