programing

Symfony2의 웹 디렉토리로 가는 서버 경로를 컨트롤러 내부에서 가져오는 방법은?

bestprogram 2023. 10. 9. 23:27

Symfony2의 웹 디렉토리로 가는 서버 경로를 컨트롤러 내부에서 가져오는 방법은?

질문은 다음과 같습니다.

Symfony2의 웹 디렉토리에 대한 서버 경로를 컨트롤러 내부에서(또는 다른 곳에서) 가져오려면 어떻게 해야 합니까?

이미 찾은 내용(여기서 검색):

독트린 파일 처리에 관한 요리책 기사에 이 내용이 나와 있습니다.

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

주변 검색을 통해 찾을 수 있으며 컨트롤러 내부에서만 사용 가능(또는 커널이 주입된 서비스):

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

그렇다면, 적어도 그 '웹' 부분은 얻을 방법이 전혀 없는 것일까요?예를 들어 제가 이름을 바꾸거나 옮기거나 하면 어떨까요?

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

Symfony2에서는 프레임워크가 웹디어와 완전히 독립적이기 때문에 웹디어에 대한 경로를 직접적으로 제공할 수 있는 방법이 없습니다.

사용가능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(f.i.Controller) 클래스에서 얻을 수 있습니다.

  • apache를 웹 서버로 사용하는 경우(다른 웹 서버의 경우에도 솔루션이 비슷할 것으로 생각합니다) 가상 호스팅을 사용하는 경우(사용자의 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를 사용하고 있으니 "의존성 주입"을 생각해보세요 ^^

모든 SF 프로젝트에서 parameters.yml:

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

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

$this->getParameter('web_dir');

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

define('WEB_DIRECTORY', __DIR__);

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

다른 솔루션으로는 앱커널에서 DIR을 반환하는 정적 메서드를 추가할 수 있습니다.'/...web/' 그래서 어디서나 액세스할 수 있습니다.

업데이트: 2.8부터는 애셋이 기본적으로 더 이상 포함되지 않으므로 더 이상 작동하지 않습니다.비록 당신이 아세트를 사용한다면 이것은 효과가 있을 것입니다.

를 할 수 .%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