จะรับรูท dir ของแอพพลิเคชั่น Symfony2 ได้อย่างไร


121

วิธีที่ดีที่สุดในการรับไดเรกทอรีแอปรูทจากภายในคอนโทรลเลอร์คืออะไร? เป็นไปได้ไหมที่จะนำมันออกจากตัวควบคุม?

ตอนนี้ฉันได้รับมันโดยการส่ง (จากพารามิเตอร์) ไปยังบริการเป็นอาร์กิวเมนต์ดังนี้:

services:

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

มีวิธีที่ดีกว่าและง่ายกว่าในการรับข้อมูลนี้ใน Symfony2 หรือไม่


13
ทางออกของคุณดีที่สุด
Inoryy

4
คุณกำลังผสมผสานบริการและตัวควบคุมคุณ
จอห์นสมิ ธ

4
อีกครั้งสำหรับ Symfony 3.3 ขึ้นไปใช้%kernel.project_dir%เพื่อเริ่มต้นโครงการของคุณ
Muzafar Ali

1
อย่าลืมห่อหุ้มตัวอักษรในเครื่องหมายคำพูด: ["%kernel.root_dir%"]
ochitos

คำตอบ:


220

อัพเดท 2018-10-21:

ณ สัปดาห์getRootDir()นี้เลิกใช้งานแล้ว โปรดใช้getProjectDir()แทนตามที่แนะนำในส่วนความคิดเห็นโดย Muzaraf Ali

-

ใช้สิ่งนี้:

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

และถ้าคุณต้องการรูทเว็บ :

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

สิ่งนี้จะทำงานจากวิธีการดำเนินการของคอนโทรลเลอร์ ...

แก้ไข: สำหรับบริการฉันคิดว่าวิธีที่คุณทำนั้นสะอาดที่สุดแม้ว่าฉันจะส่งผ่านบริการเคอร์เนลที่สมบูรณ์เป็นอาร์กิวเมนต์ ... แต่นี่จะเป็นการหลอกลวงด้วย ...


3
+1 แต่ไม่แม่นยำสำหรับ symfony2 ใช้แทน:$this->get('kernel')->getRootDir() . '/../..' . $this->getRequest()->getBasePath();
Sebastian

36
โซลูชันนี้เหมาะสำหรับคอนโทรลเลอร์เท่านั้น นี่คือปัญหาเกี่ยวกับบริการ อย่างไรก็ตามทำไมการส่งผ่านคอนเทนเนอร์ทั้งหมดเพื่อรับตัวแปร? ดีกว่ามากที่จะส่งผ่านเพียง% kernel.root_dir%
Massimiliano Arione

2
Massimiliano ถูกต้องและนอกจากนี้ฉันใช้$this->container->getParameter('kernel.cache_dir')ในคอนโทรลเลอร์แทนโซลูชันที่คุณให้มา
Lackovic10

2
นี่เป็นหัวข้อเพิ่มเติมเกี่ยวกับการบริการของคุณที่ได้รับการcontainerฉีด :) หากคุณปฏิบัติตามแนวทางปฏิบัติที่ดีที่สุดcontainerควรหลีกเลี่ยงการฉีดด้วยค่าใช้จ่ายทั้งหมด สำหรับวิธีแก้ปัญหาในการรับwebไดเร็กทอรีฉันยังคงใช้วิธีที่ฉันให้ไว้ข้างต้น;)
Jovan Perovic

4
ตั้งแต่ Symfony 3.3 เป็นต้นไปให้ใช้%kernel.project_dir%/web/แทน%kernel.root_dir%/../web/
Muzafar Ali


8

หากคุณกำลังใช้พา ธ นี้เพื่อเข้าถึงส่วนต่างๆของโปรเจ็กต์ที่ไม่ใช่โค้ด (เช่นไดเร็กทอรีอัพโหลดหรือฐานข้อมูล SQLite) การเปลี่ยนพา ธ ให้เป็นพารามิเตอร์เช่นนี้อาจเป็นการดีกว่า:

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

พารามิเตอร์นี้สามารถฉีดได้ทุกที่ที่คุณต้องการดังนั้นคุณจึงไม่ต้องยุ่งกับเส้นทางในโค้ดของคุณอีกต่อไป นอกจากนี้พารามิเตอร์สามารถถูกแทนที่ได้ในเวลาปรับใช้ สุดท้ายโปรแกรมเมอร์ที่ดูแลทุกคนจะมีความคิดที่ดีขึ้นว่าคุณใช้มันเพื่ออะไร

อัปเดต: แก้ไขการใช้งานคงที่ kernel.root_dir


6

คุณยังสามารถใช้นิพจน์ทั่วไปนอกเหนือจากนี้:

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

2

เนื่องจาก Symfony 3.3 คุณสามารถใช้การผูกเช่น

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

หลังจากนั้นคุณสามารถใช้พารามิเตอร์ $ kernelProjectDir ในคอนโทรลเลอร์หรือบริการใด ๆ เหมือนกับ

class SomeControllerOrService
{
    public function someAction(...., $kernelProjectDir)
    {
          .....
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.