LoginSignup
3

More than 5 years have passed since last update.

Symfony2でDIするサービスクラスにコンストラクタインジェクションでRequestオブジェクトを渡すやり方

Posted at

メソッドインジェクションで渡す場合、
コントローラからそのままRequestオブジェクトを渡せばよいと思います。

HogeController.php
public function editAction(Request $request)
{
    $service = $this->get('hoge.hoge_service');
    $service->tryHoge($request);

    return;
}

とても単純ですね。

そうではなく、コンストラクタインジェクションで渡す場合、
services.ymlを以下のように定義すれば渡すことができました。

services.yml
hoge.hoge_service:
    class: Hoge\HogeBundle\Service\Hoge\HogeManager
    arguments:
        - @doctrine.orm.default_entity_manager
        - @validator
        - @request_stack    # ★リクエスト
        - @logger
HogeManager.php
use Symfony\Component\HttpFoundation\RequestStack;

public function __construct(
    EntityManagerInterface $em,
    ValidatorInterface $validator,
    RequestStack $requestStack,
    LoggerInterface $logger
)
{
    $this->em = $em;
    $this->validator = $validator;
    $this->logger = $logger;
    $this->request = $requestStack->getCurrentRequest();        // ★リクエスト取得

    $this->rootUrl = $this->request->getSchemeAndHttpHost();    // ★取得したリクエストでいろいろできる
}

こうすることで、DIコンテナがRequestを自動で設定してくれるので
サービスクラスを利用するクラスはサービスクラスのRequestについて気にしなくてもよくなります。

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3