はじめに
先日、松戸市内でLaravel
ドキュメントを読む勉強会を開催しました。この時の開催レポートです。当日は松戸駅近くのイベントスペースFANCLUBをお借りしましたー。ありがとうございました。
趣旨がちょっと変わったぞ・・・?
Laravelのドキュメントを原文で読むことでLaravel
への理解を深めること英語力を向上させることが目的の一石二鳥イベント。ただ、それだけではなくドキュメントを読んでいくうちに、段々と設計思想の話にもなり、非常に学びの多い会となりました。
特に、私が所属しているJoolenには、EC-CUBEのスペシャリストがおり、その方との会話の中での気づきが大きかったのでこちらを中心に書き残しておきます。
今回、話題にできたテーマは以下の通りです。1
- installation
-
Web Server Configuration
2. Directory Configuration(ディレクトリ設定)
3. pretty urls(index.phpは隠そうよ、というお話) - Directory Structure(ディレクトリ構成)
- Routing(ルーティング設定)
共通点
.env
を使っていること
データベースへの接続文字列などは.env
ファイルに持たせることができます。
本番環境では、.env
ファイルではなく環境変数から設定を取得できるので、セキュリティの観点から、その様にしましょうという話で盛り上がりました。
もちろん、APP_ENV
の指定で、参照する .env
ファイルを切り替えることができることも同じです。EC-CUBE4系以降でも使えるテクニックです。
切替え方法が参考になる記事
composerを使っていること
共にcomposer
を使うことができるので双方ともにパッケージのインストールなどで悩むことはあまりなさそうです。ただ、composer create-project
で雛形を作れることに、EC-CUBE経験者は驚いていました(パッケージをインストールする以外にも機能があったんだ!)
DI(Dependency Injection)が使える
EC-CUBE4系もLaravelもDIを使うことができます。ただし、Laravelはコンストラクタだけではなくメソッドでもインジェクションをすることができます。テストがしやすくて良いですね
相違点
まぁ、全く異なるフレームワークなので相違点ばかりなのは当たり前ですが。。。
ルーティング方法
EC-CUBE4系では、Controller
のアノテーションでルーティングや返すテンプレートを定義します。
EC-CUBEのController
(抜粋)
/**
* 会員登録画面.
*
* @Route("/entry", name="entry")
* @Template("Entry/index.twig")
*/
public function index(Request $request)
{
...
}
一方、Laravelではroutes配下のweb.php
など、Routing
は独立しています。
<?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
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でリポジトリパターン
まぁ、基本的にはその企業やチームの文化やスキルセットに合わせた設計で良いか、というオチでしたが。。。
まとめ
EC-CUBE経験者とLaravel経験者で意見交換をすることで、思いも寄らない気づきをたくさん得ることができました。参加してくださった方々、本当にありがとうございました。
-
pretty urls以降は、時間の都合でざっと眺めた程度になっちゃいました ↩