ECCUBE4 | Symforny コントローラー例1 | 福岡でLP・ランディングページ制作専門は、セルピー

ECCUBE4 | Symforny コントローラー例1

一部Symfonyの記述を元に説明いたします。

Class定義 / プロパティ

class CustomerController extends AbstractController
{
    /**
     * @var CsvExportService
     */
    protected $csvExportService;

    /**
     * @var MailService
     */
    protected $mailService;

    /**
     * @var PrefRepository
     */
    protected $prefRepository;

    /**
     * @var SexRepository
     */
    protected $sexRepository;

    /**
     * @var PageMaxRepository
     */
    protected $pageMaxRepository;

    /**
     * @var CustomerRepository
     */
    protected $customerRepository;

このコードは、CustomerControllerというSymfonyのコントローラークラスを定義しています。このクラスはAbstractControllerを拡張しており、Symfonyアプリケーション内でHTTPリクエストを処理するためのコントローラーとして機能します。

コントローラー内には、いくつかのプロパティが定義されています。これらのプロパティは、コントローラー内で使用されるサービスやリポジトリなどの依存関係を表します。

以下は各プロパティの説明です:

  1. $csvExportService: CsvExportServiceというクラスのインスタンスを保持するプロパティです。CSVエクスポート機能を提供するサービスです。
  2. $mailService: MailServiceというクラスのインスタンスを保持するプロパティです。メール送信機能を提供するサービスです。
  3. $prefRepository: PrefRepositoryというクラスのインスタンスを保持するプロパティです。都道府県情報を操作するリポジトリです。
  4. $sexRepository: SexRepositoryというクラスのインスタンスを保持するプロパティです。性別情報を操作するリポジトリです。
  5. $pageMaxRepository: PageMaxRepositoryというクラスのインスタンスを保持するプロパティです。ページ最大表示数を管理するリポジトリです。
  6. $customerRepository: CustomerRepositoryというクラスのインスタンスを保持するプロパティです。顧客情報を操作するリポジトリです。

これらのプロパティは、コントローラー内の各アクションメソッドで使用され、各種の処理を実行するための依存関係を注入するのに使用されます。例えば、顧客情報を取得したり、CSVファイルをエクスポートしたり、メールを送信したりする際にこれらのサービスやリポジトリが使用されるでしょう。

Class定義 / コンストラクター

このコードは、CustomerControllerクラスのコンストラクターを定義しています。Symfonyの依存性注入(Dependency Injection)機能を使用して、コントローラーが必要とする各種のサービスやリポジトリを注入します。

コンストラクターのパラメータには、以下のように各サービスやリポジトリの型ヒントが指定されています。

public function __construct(
    PageMaxRepository $pageMaxRepository,
    CustomerRepository $customerRepository,
    SexRepository $sexRepository,
    PrefRepository $prefRepository,
    MailService $mailService,
    CsvExportService $csvExportService
) {
    // コンストラクターの本体
}

そして、各サービスやリポジトリのインスタンスは、コンストラクターの引数として受け取り、それぞれのプロパティに代入されます。

$this->pageMaxRepository = $pageMaxRepository;
$this->customerRepository = $customerRepository;
$this->sexRepository = $sexRepository;
$this->prefRepository = $prefRepository;
$this->mailService = $mailService;
$this->csvExportService = $csvExportService;

このようにすることで、コントローラー内の各アクションメソッドでこれらのサービスやリポジトリにアクセスすることができます。依存性注入を使用することで、コントローラーがどのサービスやリポジトリを使用するかを柔軟に切り替えることができ、テストや保守性の向上にも貢献します。

   /**
     * @Route("/%eccube_admin_route%/customer", name="admin_customer", methods={"GET", "POST"})
     * @Route("/%eccube_admin_route%/customer/page/{page_no}", requirements={"page_no" = "\d+"}, name="admin_customer_page", methods={"GET", "POST"})
     * @Template("@admin/Customer/index.twig")
     */

Symfonyのルーティングを定義するアノテーションです。Symfonyのルーティングシステムは、URLパターンとそれに関連付けられたアクションを定義するために使用されます。

このアノテーションは、@Routeで始まり、@Templateで終わります。これらはSymfonyで使用される特別なアノテーションです。

@Route

@Routeアノテーションは、URLパターンと関連するアクションを定義します。これはeccube_admin_routeというパラメーターを使用して動的にURLを生成します。このルートは、GETとPOSTのHTTPメソッドを受け付けます。

  • 最初のルートは、/eccube_admin_route/customerというURLに対応します。
  • 2番目のルートは、/eccube_admin_route/customer/page/{page_no}というURLに対応します。{page_no}は数字である必要があります。

@Template

@Templateアノテーションは、テンプレートファイルのパスを指定します。@admin/Customer/index.twigは、Twigテンプレートエンジンを使用して表示するビューのパスです。Symfonyでは、コントローラーのアクションでテンプレートを指定せずにreturn $this->render('admin/Customer/index.twig');のように指定できるため、このアノテーションは必須ではありませんが、明示的にテンプレートを指定する場合に使用されます。

このルーティング定義により、/eccube_admin_route/customer/eccube_admin_route/customer/page/{page_no}に対するリクエストが、このコントローラーのアクションにルーティングされ、関連するテンプレートが表示されます。

public function index(Request $request, PaginatorInterface $paginator, $page_no = null)
    {
        $session = $this->session;
        $builder = $this->formFactory->createBuilder(SearchCustomerType::class);

        $event = new EventArgs(
            [
                'builder' => $builder,
            ],
            $request
        );
        $this->eventDispatcher->dispatch($event, EccubeEvents::ADMIN_CUSTOMER_INDEX_INITIALIZE);

        $searchForm = $builder->getForm();

        $pageMaxis = $this->pageMaxRepository->findAll();
        $pageCount = $session->get('eccube.admin.customer.search.page_count', $this->eccubeConfig['eccube_default_page_count']);
        $pageCountParam = $request->get('page_count');
        if ($pageCountParam && is_numeric($pageCountParam)) {
            foreach ($pageMaxis as $pageMax) {
                if ($pageCountParam == $pageMax->getName()) {
                    $pageCount = $pageMax->getName();
                    $session->set('eccube.admin.customer.search.page_count', $pageCount);
                    break;
                }
            }
        }

        if ('POST' === $request->getMethod()) {
            $searchForm->handleRequest($request);
            if ($searchForm->isValid()) {
                $searchData = $searchForm->getData();
                $page_no = 1;

                $session->set('eccube.admin.customer.search', FormUtil::getViewData($searchForm));
                $session->set('eccube.admin.customer.search.page_no', $page_no);
            } else {
                return [
                    'searchForm' => $searchForm->createView(),
                    'pagination' => [],
                    'pageMaxis' => $pageMaxis,
                    'page_no' => $page_no,
                    'page_count' => $pageCount,
                    'has_errors' => true,
                ];
            }
        } else {
            if (null !== $page_no || $request->get('resume')) {
                if ($page_no) {
                    $session->set('eccube.admin.customer.search.page_no', (int) $page_no);
                } else {
                    $page_no = $session->get('eccube.admin.customer.search.page_no', 1);
                }
                $viewData = $session->get('eccube.admin.customer.search', []);
            } else {
                $page_no = 1;
                $viewData = FormUtil::getViewData($searchForm);
                $session->set('eccube.admin.customer.search', $viewData);
                $session->set('eccube.admin.customer.search.page_no', $page_no);
            }
            $searchData = FormUtil::submitAndGetData($searchForm, $viewData);
        }

このindexメソッドは、CustomerControllerのアクションメソッドであり、顧客データを検索して表示するためのものです。以下に、メソッド内で行われている主な処理を説明します:

  1. 初期化:
    • $session$builder$eventなどの依存関係を初期化します。
    • SearchCustomerType::classを使用して検索フォームのフォームビルダーを作成します。
  2. イベントのディスパッチ:
    • EccubeEvents::ADMIN_CUSTOMER_INDEX_INITIALIZEというイベントをディスパッチします。これにより、カスタムイベントをトリガーして、アクションメソッドの前にカスタム処理を実行できます。
  3. 検索フォームの作成:
    • 検索フォームを作成し、リクエストを処理します。
  4. ページャーの設定:
    • ページャーを初期化し、ページャーを設定します。PaginatorInterfaceを使用してページング処理を行います。
  5. 検索条件の取得:
    • リクエストがPOSTメソッドである場合、検索フォームから送信されたデータを取得し、検索条件をセットします。
  6. 検索結果の取得:
    • ページ番号が指定されている場合、検索結果を取得します。そうでない場合は、デフォルトのページ番号を設定します。
  7. ページネーションの生成:
    • 検索結果をページネーションに表示するために、データを適切な形式で整形します。

このようにして、indexメソッドは、顧客データの検索とページングを処理し、それをビューに表示するためのデータを準備します。


        /** @var QueryBuilder $qb */
        $qb = $this->customerRepository->getQueryBuilderBySearchData($searchData);

        $event = new EventArgs(
            [
                'form' => $searchForm,
                'qb' => $qb,
            ],
            $request
        );
        $this->eventDispatcher->dispatch($event, EccubeEvents::ADMIN_CUSTOMER_INDEX_SEARCH);

        $pagination = $paginator->paginate(
            $qb,
            $page_no,
            $pageCount
        );

        return [
            'searchForm' => $searchForm->createView(),
            'pagination' => $pagination,
            'pageMaxis' => $pageMaxis,
            'page_no' => $page_no,
            'page_count' => $pageCount,
            'has_errors' => false,
        ];
    }

このコードは、indexメソッドの最後の部分であり、実際にビューに表示するデータを準備し、配列として返します。

  1. 検索クエリの取得:
    • CustomerRepositoryから検索条件に基づいたクエリビルダーを取得します。
  2. イベントのディスパッチ:
    • EccubeEvents::ADMIN_CUSTOMER_INDEX_SEARCHイベントをディスパッチして、検索の直前にカスタム処理を実行します。これにより、検索フォームや検索クエリに関する追加の操作を行うことができます。
  3. ページネーションの設定:
    • PaginatorInterfaceを使用して、検索結果のクエリビルダーをページネーションします。指定されたページ番号とページサイズ($pageCount)に基づいて、結果をページに分割します。
  4. ビューに渡すデータの準備:
    • ビューに渡すデータを配列として返します。これには、検索フォーム、ページネーション、ページ最大数、現在のページ番号などが含まれます。
    • createFormView()メソッドを使用して、Symfonyのフォームビューを取得し、検索フォームをビューに渡します。
    • ページネーションの結果として取得した$paginationをビューに渡します。
    • その他、ページ最大数、現在のページ番号、エラーの有無などの情報もビューに渡します。

このようにして、indexメソッドは、ビューに表示するデータを準備して返します。これにより、顧客データの検索とページングが完了し、それをユーザーに適切に表示するためのデータが提供されます。