一部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リクエストを処理するためのコントローラーとして機能します。
コントローラー内には、いくつかのプロパティが定義されています。これらのプロパティは、コントローラー内で使用されるサービスやリポジトリなどの依存関係を表します。
以下は各プロパティの説明です:
- $csvExportService:
CsvExportService
というクラスのインスタンスを保持するプロパティです。CSVエクスポート機能を提供するサービスです。 - $mailService:
MailService
というクラスのインスタンスを保持するプロパティです。メール送信機能を提供するサービスです。 - $prefRepository:
PrefRepository
というクラスのインスタンスを保持するプロパティです。都道府県情報を操作するリポジトリです。 - $sexRepository:
SexRepository
というクラスのインスタンスを保持するプロパティです。性別情報を操作するリポジトリです。 - $pageMaxRepository:
PageMaxRepository
というクラスのインスタンスを保持するプロパティです。ページ最大表示数を管理するリポジトリです。 - $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
のアクションメソッドであり、顧客データを検索して表示するためのものです。以下に、メソッド内で行われている主な処理を説明します:
- 初期化:
$session
、$builder
、$event
などの依存関係を初期化します。SearchCustomerType::class
を使用して検索フォームのフォームビルダーを作成します。
- イベントのディスパッチ:
EccubeEvents::ADMIN_CUSTOMER_INDEX_INITIALIZE
というイベントをディスパッチします。これにより、カスタムイベントをトリガーして、アクションメソッドの前にカスタム処理を実行できます。
- 検索フォームの作成:
- 検索フォームを作成し、リクエストを処理します。
- ページャーの設定:
- ページャーを初期化し、ページャーを設定します。
PaginatorInterface
を使用してページング処理を行います。
- ページャーを初期化し、ページャーを設定します。
- 検索条件の取得:
- リクエストがPOSTメソッドである場合、検索フォームから送信されたデータを取得し、検索条件をセットします。
- 検索結果の取得:
- ページ番号が指定されている場合、検索結果を取得します。そうでない場合は、デフォルトのページ番号を設定します。
- ページネーションの生成:
- 検索結果をページネーションに表示するために、データを適切な形式で整形します。
このようにして、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
メソッドの最後の部分であり、実際にビューに表示するデータを準備し、配列として返します。
- 検索クエリの取得:
CustomerRepository
から検索条件に基づいたクエリビルダーを取得します。
- イベントのディスパッチ:
EccubeEvents::ADMIN_CUSTOMER_INDEX_SEARCH
イベントをディスパッチして、検索の直前にカスタム処理を実行します。これにより、検索フォームや検索クエリに関する追加の操作を行うことができます。
- ページネーションの設定:
PaginatorInterface
を使用して、検索結果のクエリビルダーをページネーションします。指定されたページ番号とページサイズ($pageCount
)に基づいて、結果をページに分割します。
- ビューに渡すデータの準備:
- ビューに渡すデータを配列として返します。これには、検索フォーム、ページネーション、ページ最大数、現在のページ番号などが含まれます。
createFormView()
メソッドを使用して、Symfonyのフォームビューを取得し、検索フォームをビューに渡します。- ページネーションの結果として取得した
$pagination
をビューに渡します。 - その他、ページ最大数、現在のページ番号、エラーの有無などの情報もビューに渡します。
このようにして、index
メソッドは、ビューに表示するデータを準備して返します。これにより、顧客データの検索とページングが完了し、それをユーザーに適切に表示するためのデータが提供されます。