Symfony2 एप्लिकेशन की रूट डायर कैसे प्राप्त करें?


121

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

अब मैं इसे तर्क के रूप में सेवा में इसे (मापदंडों से) पास करके प्राप्त करता हूं:

services:

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

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


13
आपका समाधान सबसे अच्छा है
Inoryy

4
youre एक सेवा और एक नियंत्रक यो मिश्रण
जॉन स्मिथ

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

1
उद्धरणों में शाब्दिक ["%kernel.root_dir%"]
अर्थ निकालना

जवाबों:


220

अद्यतन 2018-10-21:

इस सप्ताह के अनुसार, getRootDir()पदावनत कर दिया गया था। कृपया getProjectDir()इसके बजाय उपयोग करें , जैसा कि मुजराफ अली ने टिप्पणी अनुभाग में सुझाया है।

-

इसे इस्तेमाल करो:

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

और अगर आप वेब रूट चाहते हैं :

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

यह कंट्रोलर एक्शन विधि से काम करेगा ...

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


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

36
यह समाधान केवल नियंत्रकों के लिए सही है। यहाँ समस्या सेवाओं के बारे में है। वैसे भी, पूरे कंटेनर को केवल एक चर पाने के लिए ही क्यों ? यह अभी तक बेहतर पारित करने के लिए बस% kernel.root_dir%
मासीमिलियानो Arione

2
मैसिमिलियानो सही है, और इसके अलावा, मैं $this->container->getParameter('kernel.cache_dir')आपके द्वारा दिए गए समाधान के बजाय नियंत्रकों में उपयोग करता
हूं

2
यह आपकी सेवा के containerइंजेक्शन के विषय पर अधिक था :) यदि आप सर्वोत्तम प्रथाओं का पालन करते हैं, तो इंजेक्शन लगाने containerसे हर कीमत पर बचा जाना चाहिए। webनिर्देशिका प्राप्त करने के समाधान के लिए , मैं अभी भी ऊपर दिए गए एक का उपयोग करता हूं;)
जोवन पेरोविक

4
सिम्फनी के रूप में 3.3 और उसके बाद के %kernel.project_dir%/web/बजाय का उपयोग करें%kernel.root_dir%/../web/
मुज़फ़्फ़र अली


8

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

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

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

अपडेट: निश्चित कर्नेल ।root_dir निरंतर उपयोग।


6

आप इसके अतिरिक्त नियमित अभिव्यक्ति का भी उपयोग कर सकते हैं:

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

2

सिम्फनी 3.3 के बाद से आप बाइंडिंग का उपयोग कर सकते हैं, जैसे

services:
_defaults:
    autowire: true      
    autoconfigure: true
    bind:
        $kernelProjectDir: '%kernel.project_dir%'

उसके बाद आप किसी भी कंट्रोलर या सर्विस में पैरामीटर $ k गिने-चुने डेटा का उपयोग कर सकते हैं। बिलकुल इसके जैसा

class SomeControllerOrService
{
    public function someAction(...., $kernelProjectDir)
    {
          .....
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.