Symfony2 애플리케이션의 루트 디렉토리를 얻는 방법은 무엇입니까?


121

컨트롤러 내부에서 루트 앱 디렉토리를 얻는 가장 좋은 방법은 무엇입니까? 컨트롤러 외부로 가져올 수 있습니까?

이제 다음과 같이 매개 변수에서 서비스에 인수로 전달하여 가져옵니다.

services:

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

Symfony2에서이 정보를 얻는 더 좋고 간단한 방법이 있습니까?


13
솔루션은 최고입니다
Inoryy

4
당신은 서비스와 컨트롤러를 섞어
john Smith

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 %
마시밀리아노 Arione

2
Massimiliano의 말이 맞습니다. 또한 $this->container->getParameter('kernel.cache_dir')귀하가 제공 한 솔루션 대신 컨트롤러에서 사용 합니다
lackovic10

2
이것은 당신의 서비스가 container주입 되었다는 주제에 관한 것입니다. :) 모범 사례를 따르면, 주입은 어떤 container대가를 치르더라도 피해야합니다. 지고의 솔루션으로 web) 디렉토리, 나는 아직도 위에 제공 한 I 사용
조반 Perovic

4
심포니 3.3 및 이후의로 사용하는 %kernel.project_dir%/web/대신%kernel.root_dir%/../web/
Muzafar 알리


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.