2022/05/28
ECCUBE4 Containerをどこからでも取得する方法
ECCUBE4で、少し複雑な処理をする時にController(コントローラー)以外で「$this->container」(コンテナ)を使いたい事ががあると思います。
例えば……..
Command(コマンド)、Controller(コントローラー)、Entity(エンティティ)、EventListener(イベントリスナー)、Repository(リポジトリ)、Service(サービス)、FormType(フォームタイプ)、Security(セキュリティ)など
利用したいと思う場面は結構あります。
Containerの取得方法
通常であれば__constructで取得する方法が一般的かと思いますが、別のやり方で大体どこでも取得出来る方法をお教えします。
global $kernel;
$container = $kernel->getContainer();
これだけです。
これで本当なら終わりなのですが、コンテナを__constructから取得出来ない場所でも取得した場合に出来る事を一例で載せておきます。
このコンテナ取得を利用して出来る事の例
EntityManager(エンティティマネージャー)・Repository(リポジトリ)の取得
global $kernel;
$container = $kernel->getContainer();
// エンティティマネージャーの取得
$entityManager = $container->get('doctrine')->getManager();
// Orderリポジトリの取得
$orderRepository = $entityManager->>getRepository('Eccube\Entity\Order');
// or
$orderRepository = $entityManager->>getRepository(\Eccube\Entity\Order::class);
ログインユーザーの取得
global $kernel;
$container = $kernel->getContainer();
$token = $container->get('security.token_storage')->getToken();
$user = $token->getUser()
強制ログイン
global $kernel;
$container = $kernel->getContainer();
// $Customerにログインさせたいユーザーを指定($Customer = Eccube\Entity\Customer)
$container->get('security.token_storage')->setToken(
new UsernamePasswordToken(
$Customer, null, 'customer', $Customer->getRoles()
)
);
強制ログアウト
global $kernel;
$container = $kernel->getContainer();
$container->get('security.token_storage')->setToken( null );
twig(テンプレートファイル)の存在確認
global $kernel;
$container = $kernel->getContainer();
$flag = $container->get('twig')->getLoader()->exists( $template_path );
if ( $flag ) {
// テンプレートが存在するよ
} else {
// テンプレートは存在しないよ
}
以上!