컨트롤러 내부에서 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/
'development' 카테고리의 다른 글
핵심 데이터 : 다 대다 관계를위한 NSPredicate. (0) | 2020.11.23 |
---|---|
명령과 이벤트가 별도로 표시되는 이유는 무엇입니까? (0) | 2020.11.23 |
부트 스트랩 입력을위한 부모 컨테이너의 완벽한 100 % 너비? (0) | 2020.11.23 |
평신도의 관점에서 상각 된 복잡성? (0) | 2020.11.23 |
PowerShell 모듈이 설치되었는지 어떻게 확인합니까? (0) | 2020.11.23 |