Symfony 3.3/4/5+ ソリューション
これは2017 およびConstructor Injectionを使用したSymfony 3.3+バージョンです。
アプリケーション全体 (= コンテナー) を渡す代わりに、必要なパラメーターのみを渡すことができます。
1. サービス構成
# app/config/services.yml
services:
_defaults:
autowire: true
App\Controller\SomeController:
arguments: ['%kernel.environment%']
この構文を理解していない場合は、Symfony DI ニュースの前/後の例を説明しているこの投稿を確認してください。
2. コントローラー
namespace App\Controller;
final class SomeController
{
/**
* @var string
*/
private $environment;
public function __construct(string $environment)
{
$this->environment = $environment;
}
public function someAction()
{
$this->environment...
// any operations you need
}
}
コントローラーでコンテナーを渡さないようにするのはなぜですか?
コードで最も重要なことは一貫性です。
なぜそのように使用したかがわかっている場合は、この概念を混在させても問題ないかもしれません。しかし、ここでThe Broken Window Theory (Coding Horror による適切に説明されたバージョン)が再生されます。コードにアクセスする人は、そのように使用することを意図していないバージョンを選択する可能性が高くなります。
コードのあいまいさは、レガシー コードへの最初の誘いです
私は多くのアプリケーションのチームを指導してきましたが、それらは単純な$this->container
コードから始まり、数年後、静的な地獄全体を書き直したりリファクタリングしたりする方法について、私に助けを求めるようになりました。