development

컨트롤러 내부에서 Symfony2의 웹 디렉토리에 대한 서버 경로를 얻는 방법은 무엇입니까?

big-blog 2020. 11. 23. 19:34
반응형

컨트롤러 내부에서 Symfony2의 웹 디렉토리에 대한 서버 경로를 얻는 방법은 무엇입니까?


질문은 다음과 같습니다.

컨트롤러 내부 (또는 그 이유 때문에 다른 곳에서)에서 Symfony2의 웹 디렉토리에 대한 서버 경로를 어떻게 얻을 수 있습니까?

내가 이미 찾은 것 (또한 여기에서 검색) :

이것은 Doctrine 파일 처리에 대한 요리 책 기사에서 권장됩니다.

$path = __DIR__ . '/../../../../web';

주변을 검색하여 찾을 수 있으며 컨트롤러 내부에서만 사용할 수 있습니다 (또는 커널이 삽입 된 서비스).

$path = $this->get('kernel')->getRootDir() . '/../web';

그렇다면 적어도 경로의 '웹'부분을 얻을 수있는 방법이 전혀 없습니까? 예를 들어 내가 이름을 바꾸거나 이사를하기로 결정했다면 어떻게됩니까?

정적 sfConfig :: get () 메서드를 호출하여 코드의 어느 곳에서나 필요한 모든 것을 얻을 수 있었던 첫 번째 심포니에서는 모든 것이 쉬웠습니다 ..


프레임 워크가 webdir과 완전히 독립적이므로 Symfony2에서 webdir 경로를 얻는 직접적인 방법은 없습니다.

getRootDir()작성하는 것처럼 커널 클래스의 인스턴스에서 사용할 수 있습니다 . /web나중에 dir 이름을 바꾸는 것을 고려한다면 구성 가능하게 만들어야합니다. 예를 들어 AsseticBundle에는 DI 구성에 이러한 옵션이 있습니다 ( 여기여기 참조 ).


컨트롤러 외부에서 루트 디렉토리에 액세스하려면 %kernel.root_dir%서비스 구성에 인수로 삽입 하면됩니다.

service_name:
    class: Namespace\Bundle\etc
    arguments: ['%kernel.root_dir%']

그런 다음 클래스 생성자에서 웹 루트를 가져올 수 있습니다.

public function __construct($rootDir)
{
    $this->webRoot = realpath($rootDir . '/../web');
}

요청 서비스의 모든 ContainerAware (fi Controller) 클래스에서 가져올 수도 있습니다.

  • 아파치를 웹 서버로 사용하고 있고 (다른 웹 서버의 경우 솔루션이 비슷할 것이라고 가정합니다) 가상 호스팅을 사용하는 경우 (URL은 다음과 같습니다. localhost/app.php다음을 사용할 수 있습니다.)

    $container->get('request')->server->get('DOCUMENT_ROOT');
    // in controller:
    $this->getRequest()->server->get('DOCUMENT_ROOT');
    
  • 그렇지 않으면 (URL은 다음과 같습니다.- localhost/path/to/Symfony/web/app.php:

    $container->get('request')->getBasePath();
    // in controller:
    $this->getRequest()->getBasePath();
    

당신은 Symfony에 있습니다. "Dependency Injection"을 생각하세요 ^^

내 모든 SF 프로젝트에서 parameters.yml에서 수행합니다.

web_dir: "%kernel.root_dir%/../web"

따라서 컨트롤러 내에서이 매개 변수를 안전하게 사용할 수 있습니다.

$this->getParameter('web_dir');

내 해결책은이 코드를 app.php에 추가하는 것입니다.

define('WEB_DIRECTORY', __DIR__);

문제는 상수를 사용하는 명령 줄 코드에서 중단된다는 것입니다. 앱 / 콘솔 파일 및 기타 환경 프런트 컨트롤러에 상수를 추가 할 수도 있습니다.

또 다른 해결책은 DIR . '/ .. / web /' 을 반환하는 AppKernel에 정적 메서드를 추가하는 것이므로 어디서나 액세스 할 수 있습니다.


업데이트 : 2.8 이후로는 assetic이 더 이상 기본적으로 포함되지 않기 때문에 더 이상 작동하지 않습니다. assetic을 사용하는 경우에도 작동합니다.

변수를 사용할 수 있습니다. %assetic.write_to%.

$this->getParameter('assetic.write_to');

자산은이 변수에 의존하여 웹 디렉토리에 덤프되므로 웹 폴더를 찾는 데 사용하는 것이 안전합니다.

http://symfony.com/doc/current/reference/configuration/assetic.html


Symfony3의 경우 컨트롤러에서

$request->server->get('DOCUMENT_ROOT').$request->getBasePath()

$host = $request->server->get('HTTP_HOST');
$base = (!empty($request->server->get('BASE'))) ? $request->server->get('BASE') : '';
$getBaseUrl = $host.$base;

Symfony 3.3부터

%kernel.project_dir%/web/대신 사용할 수 있습니다.%kernel.root_dir%/../web/

참고 URL : https://stackoverflow.com/questions/9265788/how-to-get-the-server-path-to-the-web-directory-in-symfony2-from-inside-the-cont

반응형