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クラスに格納し、コントローラークラスに「コントローラーロジック」のみを含める方が適切だと思います
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;
}
}
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;
}
}
これは仕事です:
// 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');
}
}