web-dev-qa-db-ja.com

symfony 4、(コントローラークラスではなく)カスタムクラスからプロジェクトのルートパスを取得します

Src/Utilsディレクトリで、さまざまなもののためにカスタムクラスFooを作成しました。 symfony 4プロジェクトの絶対ルートパスを取得する方法を探しています

コントローラから、その簡単な:

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

しかし、src/Utilsディレクトリに作成したカスタムクラスから、ルートパスディレクトリを取得するにはどうすればよいですか?

コントローラからFooクラスへのパスを渡すことができます:

$webPath = $this->get('kernel')->getProjectDir();
$faa = new Foo($webPath);
$faa->doSomething();

しかし、私はこの情報をFooクラスに格納し、コントローラークラスに「コントローラーロジック」のみを含める方が適切だと思います

10
matthieu lopez

SymfonyではAppKernelクラスはメソッドgetProjectDir()でプロジェクトのルートディレクトリを処理しています。コントローラで取得するには、次のようにします。

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

プロジェクトのルートディレクトリが返されます。

クラスの1つにプロジェクトのルートディレクトリが必要な場合は、2つの選択肢があります。まず、依存関係としてAppKernelを渡します。

class Foo 
{
    /** KernelInterface $appKernel */
    private $appKernel;

    public function __construct(KernelInterface $appKernel)
    {
        $this->appKernel = $appKernel;
    }
}

Symfony 4の自動配線の依存関係のおかげで、自動でクラスに注入され、次のようにしてアクセスできます。

$this->appKernel->getProjectDir();

しかしお気づきください:プロジェクトのルートディレクトリを取得するよりもAppKernelクラスを実際に必要とし、それ以上のことを行うまでは、それは良い考えではないと思います。特に、後でクラスの単体テストについて作成することを考える場合。たとえば、AppKernelのモックを作成する必要があるため、複雑さが自動的に増加します。

2番目のオプションとIMHOは、ディレクトリへのパスを持つ文字列のみを渡すことをお勧めします。これは、次のようにconfig/services.yaml内にサービスを定義することで実現できます。

services:
    (...)
    MyNamespace\Foo:
        arguments:
            - %kernel.project_dir%

そしてあなたのコンストラクタは次のようになります:

class Foo 
{
    /** string $rootPath */
    private $rootPath;

    public function __construct(string $rootPath)
    {
        $this->rootPath = $rootPath;
    }
}
4
Tomasz

Kernel注入なし

config/services.yaml

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

....

class Foo
{
    private $projectDir;

    public function __construct(string $projectDir)
    {
        $this->projectDir = $projectDir;
    }
}
0
Artem

これは仕事です:

// from Foo class
use Symfony\Component\HttpKernel\KernelInterface;
...
class Foo{
    private $rootDir;
    public function __construct(KernelInterface $kernel)
    {
        $this->rootDir = $kernel->getProjectDir();
    }
    public function myfoomethod(){
        return $this->getRootDir();
    }
    public function getRootDir(){
        return $this->rootDir;
    }
}


// from the controller class 
use App\Utils\Foo;
...
class FaaController extends AbstractController
{
    /**
     * @Route("/scenario", name="scenario")
     */
    public function new(Foo $foo)
    {
        dump($foo->myfoomethod()); //show the dir path !
        return $this->render('faa/index.html.twig');
    }
}
0
user2137454