EC-CUBE4　ページURLから利用される本体ソースを突き止める　脱初心者二歩目

#初めに
EC-CUBEのカスタマイズをするには、カスタマイズ無しのEC-CUBEの基本的な動作を把握する事が必要と、[初心者が知っておいた方が良い事](https://qiita.com/dev_belltzel/items/e3a5ea26cf8415b0924c)の記事に書きました。

このページをカスタマイズしたいとなった時、どのような処理がされているのか、本体ソースを読む力が必要になってきます。
会員情報に項目を追加したいといった場合、どのENTITYファイルを、どのFORMファイルを拡張すれば良いのか分からなければ、カスタマイズ出来ないです。

この記事では、ページURLからどんなファイルが使われているのか、その探し方について書いています。

※こんな簡単な方法があるよ等、他に良い方法があればコメント下さい。僕と、この記事を読んでくれた方が成長できます。

#URLからController内の処理（関数）を見つけ出す。

まずは、**目的のページで、どのControllerのどの関数が利用されているのか**調べます。
Controllerから、その他のファイルを利用して、様々な処理が実行されるので、Controllerを軸にソースを読んでいきます。

Controllerには`@Route`でURLが設定されてますので、そこを見つけることができれば、目的のページのControllerにたどり着けます。
とはいえ、ファイルが多すぎて探せないよってなるのですが、**フォルダ構成やファイル名からでもある程度推測**できるので、URLからControllerのフォルダ・ファイルを絞り込み、`@Route`から利用されている関数を見つける事ができます。

本体ソースのControllerは`src/Eccube/Controller`のフォルダになります。

###フロント画面のController

####TOPページのControllerを探してみる。

`src/Eccube/Controller`内のファイル名を見てみます。
すると、`TopController.php`というファイルがあります。

その中を見ると、`public function index()`があり、`@Route("/", name="homepage")`が設定されています。
TOPページのURLは`https://exsample.com/`なので、後ろに続く文字がありません。なので`@Route`は「/」になってます。

nameの部分はルート名であり、使い方はテンプレート内で`{{ url('homepage') }}`とすれば、TOPページのURLが表示されます。
テンプレート以外でも使う事があるのでが、それはまた別の機会に。

####商品一覧ページのControllerを探してみる。

商品一覧ページのURLは`https://exsample.com/products/list`になります。
`src/Eccube/Controller`内のファイル名を見てみると、URLのproductsに近い`ProductController.php`というファイルがあります。

その中には`@Route("/products/list", name="product_list")`がありURLの`/products/list`と一緒の部分があります。
その関数`public function index(Request $request, Paginator $paginator)`が商品一覧の処理になります。

####マイページのControllerを探してみる。

マイページのURLは`https://exsample.com/mypage`になります。
`src/Eccube/Controller`内のファイル名を見ても、それっぽいControllerファイルはありません。
しかし、`src/Eccube/Controller/Mypage`というフォルダがあり、その中にいくつかControllerファイルがあります。
それらのファイルが、マイページのControllerになります。

####src/Eccube/Controller内のフォルダ

Mypageの他にも、`Admin` `Block` `Install`のフォルダがあります。
それぞれ簡単に説明すると以下の通りです。

- Adminは管理画面。
- Blockは管理画面→コンテンツ管理→ブロック管理で管理されてるブロック
- InstallはEC-CUBE本体のインストール画面

どうですか？フロント画面のURLからControllerと関数を探せそうですか？
次は管理画面のControllerの探し方になります。

###管理画面のController

管理画面のControllerは`src/Eccube/Controller/Admin`のフォルダ内になります。

管理画面URLは`https://exsample.com/××××/`になり、××××はインストール時に設定した**管理画面のディレクトリ名**になります。
`@Route`には、`/%eccube_admin_route%/`があり、この部分が**管理画面のディレクトリ名**に対応します。

管理画面もフロント画面と同様の方法でControllerを探すことができます。

####src/Eccube/Controller/Admin内のフォルダ

`src/Eccube/Controller/Admin`内にあるフォルダに対応する管理画面メニュー

- Content　コンテンツ管理
- Customer　会員管理
- Order　受注管理
- Product　商品管理
- Setting　設定
- ┣Shop　店舗設定
- ┗System　システム設定
- Store　オーナーズストア

####管理画面・商品一覧ページのControllerを探してみる。

管理画面の商品管理、商品一覧ページのURLは`https://exsample.com/××××/product`になります。
`src/Eccube/Controller/Admin/Product`内を見てみると`ProductController`というファイルがあります。

その中に、`@Route("/%eccube_admin_route%/product", name="admin_product")`があり、URLの`××××/product`と一緒の部分がありますね。
もう一つ`@Route("/%eccube_admin_route%/product/page/{page_no}", requirements={"page_no" = "\d+"}, name="admin_product_page")`が設定されてますが、こちらは２ページ目以降のURLに対応しています。

商品一覧は商品数が増えれば２ページ、３ページとページング処理されます。
２ページ目のURLは`https://exsample.com/××××/product/page/2`になり、`@Route("/%eccube_admin_route%/product/page/{page_no}"`と比較すると同じ形ですね。

`page_no`はページ数になり、ページ数によって数値が変動します。`requirements`でその値を正規表現でパターンマッチします。

####管理画面・会員登録ページのControllerを探してみる。

管理画面の会員管理、会員登録ページのURLは`https://exsample.com/××××/customer/new`になります。
`src/Eccube/Controller/Admin/Customer`内を見てみると`CustomerController`というファイルがあります。

その中を見ると`customer/new`に一致する`@Route`が見つかりません。
別の`CustomerEditController`というファイルを見てみましょう。

すると、`@Route("/%eccube_admin_route%/customer/new", name="admin_customer_new")`があり、URLの`××××/product`と一緒の部分があります
もう一つ`@Route("/%eccube_admin_route%/customer/{id}/edit", requirements={"id" = "\d+"}, name="admin_customer_edit")`があり、こちらは編集する時のURLになります。

編集と登録は同じ関数を使っている事が多いので、編集ページを探すときは登録ページを探してみても良いかもですね。

#Controllerで使われている他のファイルを探してみる。

**例として、フロント画面のお問合せを見てみます。**
FORMが使われているし、問い合わせ完了時にメールが送信されているので例題にはいいかなと思いました。
（ここではControllerのソース解説はしないです。）

お問合せは`FORM入力画面` `入力内容確認画面` `完了画面`になります。

それでは、お問合せ画面のControllerを探して中を見てみましょう。

お問合せのContorllerは`src/Eccube/Controller/ContactController.php`になります。

内容を見てみると関数が`index()`と`complete()`が実装されていて、`complete`は画面表示だけというのが分かります。
では、`index()`の内容を見てみましょう。

```php
$builder = $this->formFactory->createBuilder(ContactType::class);
```

最初出てくるこの部分、FORMを作成する為のFORMTYPEファイルを読み込んでいます。
ここから分かるのはClass名だけですが、Controller上部にある`use`を見てみましょう。

すると、`ContactType`のパスが記載された行`use Eccube\Form\Type\Front\ContactType;`があり、そのパス通りに`src/Eccube/Form/Type/Front`のフォルダ内を見てみると`ContactType.php`があります。

お問合せのFORMTYPEは`src/Eccube/Form/Type/Front/ContactType.php`が使われているというのが分かりますね。

次に「メール送信」のコメントを見てみましょう。

```php
$this->mailService->sendContactMail($data);
```

`$this->mailService`は`__construct`で`MailService`のオブジェクトが入っているのが分かります。

`ContactType`同様にController上部を見てみると`use Eccube\Service\MailService;`と書かれています。
その階層のフォルダを見てみると`MailService.php`があります。

メール送信は`MailService.php`を見れば、どんな事を行っているのか分かりますね。

#まとめ

すべてのパターンを説明できているかと言われれば、たぶんできていないですが、この記事にような感じで探せば、目的のソースへたどり着けると思います。
慣れてくれば探さずとも直感で見つける事も出来ますよ。

そして、この記事の説明では、関数内からuseを探してって感じで説明してますが、最初からuseされてる物を見るのが一番早いかと思います。

最初の頃はファイルを探すのも苦労してました。
なので、少しでも役に立った記事になる事を願ってます。