Laravelを使っていたら、EC-CUBE4系とも仲良くなれた

# はじめに
先日、松戸市内で`Laravel`ドキュメントを読む勉強会を開催しました。この時の開催レポートです。当日は松戸駅近くのイベントスペース[FANCLUB](https://madcity.jp/fanclub/)をお借りしましたー。ありがとうございました。
![会場](https://madcity.jp/main/wp/wp-content/themes/madcity_v9_test/img/fanclub/coworking/02.jpg)

# 趣旨がちょっと変わったぞ・・・？
Laravelのドキュメントを原文で読むことで`Laravel`への理解を深めること英語力を向上させることが目的の一石二鳥イベント。ただ、それだけではなくドキュメントを読んでいくうちに、段々と設計思想の話にもなり、非常に学びの多い会となりました。
特に、私が所属している[Joolen](https://joolen.co.jp)には、EC-CUBEのスペシャリストがおり、その方との会話の中での気づきが大きかったのでこちらを中心に書き残しておきます。

# 今回、話題にできたテーマは以下の通りです。[^1]
1. [installation](https://laravel.com/docs/6.x#installation)
    1. [Server Requirements(サーバの要件)](https://laravel.com/docs/6.x#server-requirements)
    2. [Installing Laravel(インストール方法)](https://laravel.com/docs/6.x#installing-laravel)
    3. [Configuration(設定方法)](https://laravel.com/docs/6.x#configuration)
1. [Web Server Configuration](https://laravel.com/docs/6.x/installation#web-server-configuration)
    2. [Directory Configuration(ディレクトリ設定)](https://laravel.com/docs/6.x#directory-configuration)
    3. [pretty urls(index.phpは隠そうよ、というお話)](https://laravel.com/docs/6.x#pretty-urls)
1. [Directory Structure(ディレクトリ構成)](https://laravel.com/docs/6.x/structure)
2. [Routing(ルーティング設定)](https://laravel.com/docs/6.x/routing)

# 共通点
## `.env`を使っていること
データベースへの接続文字列などは`.env`ファイルに持たせることができます。
本番環境では、`.env`ファイルではなく環境変数から設定を取得できるので、セキュリティの観点から、その様にしましょうという話で盛り上がりました。
もちろん、`APP_ENV`の指定で、参照する　`.env`ファイルを切り替えることができることも同じです。EC-CUBE4系以降でも使えるテクニックです。
[切替え方法が参考になる記事](https://dev-com-matsudo.connpass.com/event/147362/)

## composerを使っていること
共に`composer`を使うことができるので双方ともにパッケージのインストールなどで悩むことはあまりなさそうです。ただ、`composer create-project`で雛形を作れることに、EC-CUBE経験者は驚いていました:smile:(パッケージをインストールする以外にも機能があったんだ！)

## DI(Dependency Injection)が使える
EC-CUBE4系もLaravelもDIを使うことができます。ただし、Laravelはコンストラクタだけではなくメソッドでもインジェクションをすることができます。テストがしやすくて良いですね:+1:

# 相違点
まぁ、全く異なるフレームワークなので相違点ばかりなのは当たり前ですが。。。
## ルーティング方法
EC-CUBE4系では、`Controller`のアノテーションでルーティングや返すテンプレートを定義します。
EC-CUBEの`Controller`(抜粋)

```php
    /**
     * 会員登録画面.
     *
     * @Route("/entry", name="entry")
     * @Template("Entry/index.twig")
     */
    public function index(Request $request)
    {
     ...
    }
```

一方、Laravelではroutes配下の`web.php`など、`Routing`は独立しています。

```php
<?php

/*
|--------------------------------------------------------------------------
| Web Routes
|--------------------------------------------------------------------------
|
| Here is where you can register web routes for your application. These
| routes are loaded by the RouteServiceProvider within a group which
| contains the "web" middleware group. Now create something great!
|
*/

Route::get('/', function () {
    return view('welcome');
})->middleware('auth');
```

コレは双方にとって、少し新鮮だった様です。ちなみに、`Laravel`のルーティングファイルは分割することができます。(質問された)

```php
<?php

namespace App\Providers;

use Illuminate\Foundation\Support\Providers\RouteServiceProvider as ServiceProvider;
use Illuminate\Support\Facades\Route;

class RouteServiceProvider extends ServiceProvider
{
    /*
     * This namespace is applied to your controller routes.
     *
     * In addition, it is set as the URL generator's root namespace.
     *
     * @var string
     */
    protected $namespace = 'App\Http\Controllers';

    /*
     * Define your route model bindings, pattern filters, etc.
     *
     * @return void
     */
    public function boot()
    {
        //

        parent::boot();
    }

    /**
     * Define the routes for the application.
     *
     * @return void
     */
    public function map()
    {
        $this->mapApiRoutes();

        $this->mapWebRoutes();

        //
    }

    /*
     * Define the "web" routes for the application.
     *
     * These routes all receive session state, CSRF protection, etc.
     *
     * @return void
     */
    protected function mapWebRoutes()
    {
        Route::middleware('web')
             ->namespace($this->namespace)
             ->group(base_path('routes/web.php'));
    }

    /*
     * Define the "api" routes for the application.
     *
     * These routes are typically stateless.
     *
     * @return void
     */
    protected function mapApiRoutes()
    {
        Route::prefix('api')
             ->middleware('api')
             ->namespace($this->namespace)
             ->group(base_path('routes/api.php'));
    }
}
```

## ディレクトリ定義の自由さ
よく言われることですが、`Models`ディレクトリが無いことに驚かれました。ただ、一方でこれは`Laravel`を利用する技術者が自らのベストプラクティスを適用できるという意味にもなります。逆にイケてない設計をすると、あとあと苦労するという噂もありますが。。。
EC-CUBEではいわゆる、リポジトリパターンをきっちり採用していますので`Laravel`側でも同じ様な設計をすることで、双方の人材交流はやりやすくなるかなー、と思いました。
[Laravelでリポジトリパターン](https://www.ritolab.com/entry/165)
まぁ、基本的にはその企業やチームの文化やスキルセットに合わせた設計で良いか、というオチでしたが。。。

# まとめ
EC-CUBE経験者とLaravel経験者で意見交換をすることで、思いも寄らない気づきをたくさん得ることができました。参加してくださった方々、本当にありがとうございました。

[^1]: pretty urls以降は、時間の都合でざっと眺めた程度になっちゃいました:sweat_smile: