Symfony2 uygulamasının kök dizini nasıl alınır?


121

Kök uygulama dizinini denetleyicinin içinden almanın en iyi yolu nedir? Kontrolörün dışına çıkarmak mümkün mü?

Şimdi bunu (parametrelerden) servise argüman olarak ileterek elde ediyorum, şöyle:

services:

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

Bu bilgileri Symfony2'de almanın daha iyi ve daha basit bir yolu var mı?


13
çözümünüz en iyisi
Inoryy

4
bir hizmet ve bir denetleyiciyi karıştırıyorsun yo
john Smith

4
Yine Symfony 3.3 ve sonrası %kernel.project_dir%için projenizin köküne ulaşmak için kullanın .
Muzafar Ali

1
değişmez değerleri tırnak içine ["%kernel.root_dir%"]
aldığınızdan

Yanıtlar:


220

GÜNCELLEME 2018-10-21:

Bu hafta itibariyle getRootDir()kullanımdan kaldırıldı. Lütfen getProjectDir()bunun yerine Muzaraf Ali'nin yorum bölümünde önerildiği gibi kullanın .

-

Bunu kullan:

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

Ve web kökünü istiyorsanız :

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

bu, denetleyici eylem yönteminden çalışacaktır ...

DÜZENLEME: Hizmetlere gelince, bunu yaptığın yolun olabildiğince temiz olduğunu düşünüyorum, ancak bir argüman olarak tam çekirdek hizmetini geçecektim ... ama bu aynı zamanda hile yapacak ...


3
+1 ancak symfony2 için doğru değil. Bunun yerine şunu kullanın:$this->get('kernel')->getRootDir() . '/../..' . $this->getRequest()->getBasePath();
Sebastian

36
Bu çözüm yalnızca kontrolörler için doğrudur. Burada mesele hizmetlerle ilgili. Her neyse, neden sadece bir değişken elde etmek için tüm kapsayıcıyı geçelim? Sadece% kernel.root_dir%
Massimiliano Arione

2
Massimiliano haklı ve ek olarak, $this->container->getParameter('kernel.cache_dir')sağladığınız çözüm yerine kontrol cihazlarında kullanıyorum
lostovic10

2
Bu daha çok hizmetinizin containerenjekte edildiğiyle ilgiliydi :) En iyi uygulamaları takip ederseniz, ne containerpahasına olursa olsun enjekte etmekten kaçınılmalıdır. webDizin alma çözümüne gelince , yukarıda verdiğim çözümü hala kullanıyorum;)
Jovan Perovic

4
Symfony 3.3 ve sonrası %kernel.project_dir%/web/yerine kullanın%kernel.root_dir%/../web/
Muzafar Ali

15

Symfony 3.3'te kullanabilirsiniz

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

web / proje kökünü almak için.


8

Projelerin kod olmayan bölümlerine erişmek için bu yolu kullanıyorsanız (örneğin bir yükleme dizini veya bir SQLite veritabanı), yolu aşağıdaki gibi bir parametreye dönüştürmek daha iyi olabilir:

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

Bu parametre ihtiyacınız olan her yere enjekte edilebilir, böylece artık kodunuzdaki yollarla uğraşmanıza gerek kalmaz. Ayrıca, parametre dağıtım zamanında geçersiz kılınabilir. Son olarak, bakım yapan her programcı, onu ne için kullandığınız konusunda daha iyi bir fikre sahip olacaktır.

Güncelleme: Sabit kernel.root_dir kullanımı düzeltildi.


6

Buna ek olarak normal ifadeyi de kullanabilirsiniz:

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

2

Symfony 3.3'ten beri bağlama kullanabilirsiniz.

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

Bundan sonra, herhangi bir denetleyicide VEYA hizmette $ kernelProjectDir parametresini kullanabilirsiniz. Tıpkı

class SomeControllerOrService
{
    public function someAction(...., $kernelProjectDir)
    {
          .....
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.