前置き
色々と考え直した結果、違う方法に行き着きました。以下にまとめてあります。
続・Laravelでバックエンドとフロントエンドを分離したい
以下の古い記事も残しますが、基本的に上記の方法の方ががいいと思います。
本稿のテーマ(=問題意識)
開発する際にバックエンドとフロントエンドを分離しておきたい。
けれどもバックエンドとフロントエンドで2つWebアプリ開発するには予算と工数(とやる気)が足りない。
上記のようなケースは稀によくある気がします。
こういう時は「とりあえずディレクトリだけでも分けとくか」という形に落ち着くかと思いますが、「じゃあどういう風にディレクトリに分けようか」というのが本稿のテーマになります。
結論
以下のような形にしてみました。
Front/frontがフロントエンド、Admin/adminがバックエンドのつもりです。
Multi-Auth前提です。
base_path
├ app
│ ├ Console
│ ├ Exceptions
│ ├ Providers
│ ├ Http
| │ ├ Kernel.php
│ │ └ Controllers
│ │ └ Controller.php
│ ├ Models
│ │ ├ Car.php
│ │ ├ Admin.php
│ │ └ User.php
│ ├ Admin
│ │ ├ Policies
│ │ │ └ CarPolicy.php
│ │ └ Http
│ │ └ Controllers
│ │ ├ Controller.php
│ │ ├ HomeController.php
│ │ ├ CarController.php
│ │ └ Auth
│ │ ├ LoginController.php
│ │ ├ ForgetController.php
│ │ ├ RegisterController.php
│ │ └ ResetController.php
│ └ Front
│ ├ Policies
│ │ └ CarPolicy.php
│ └ Http
│ └ Controllers
│ ├ Controller.php
│ ├ HomeController.php
│ ├ CarController.php
│ └ Auth
│ ├ LoginController.php
│ ├ ForgetController.php
│ ├ RegisterController.php
│ └ ResetController.php
│
├ resources
│ └ views
│ ├ admin
│ │ ├ home.blade.php
│ │ ├ layouts
│ │ │ └ app.blade.php
│ │ ├ cars
│ │ │ └ index.blade.php
│ │ └ auth
│ │ ├ login.blade.php
│ │ ├ register.blade.php
│ │ └ passwords
│ │ ├ reset.blade.php
│ │ └ email.blade.php
│ └ front
│ ├ home.blade.php
│ ├ layouts
│ │ └ app.blade.php
│ └ cars
│ │ └ index.blade.php
│ └ auth
│ ├ login.blade.php
│ ├ register.blade.php
│ └ passwords
│ ├ reset.blade.php
│ └ email.blade.php
└ routes
├ admin.php
└ front.php
解説(?)と意図
モデル
Modelはフロントエンドもバックエンドも基本的に共通になるはずなのでapp/Modelsに置いていきます。バックエンドのみで利用する集計用のテーブルとかはよくあるかと思いますが、app/Modelsに配置してあってもフロントエンド側から利用しなければいいだけの話なので、モデルについてはapp/Modelsに全部配置しとけばいいんじゃないかと思います。どうしても分けたい場合は、app/Front/Modelsを作って配置していけばいいんじゃないでしょうか。
コントローラー
一番重要なのはおそらくコントローラーの配置。共通処理を記述する親クラスなんかはapp/Http/Controllers以下に配置でいいと思います。あとはそれぞれフロントエンド側はapp/Front/Http/Controllers、バックエンド側はapp/Admin/Http/Controllersに配置していけばいいんじゃないでしょうか。
Controllerの配置場所はルーティングに少し影響あります。デフォルトですとroute/web.phpではapp/Http/Controllers以下のコントローラー(正確にはApp\Http\Controllersネームスペースのコントローラー)しか探してくれません。なのでRouteServiceProviderクラスを少し書き換える必要があります。
protected function mapWebRoutes()
{
Route::middleware('web')
->namespace('App\Front\Http\Controllers')
->group(base_path('routes/front.php'));
Route::middleware('web')
->namespace('App\Admin\Http\Controllers')
->group(base_path('routes/admin.php'));
}
こうすると、App\Front\Http\ControllersネームスペースとApp\Admin\Http\Controllersネームスペースにあるコントローラーを探してくれるはずです。
ちなみに、routes/admin.phpにバックエンド側のルーティングを、routes/front.phpにフロントエンド側のルーティングを、それぞれ記述するようにします。
ミドルウェア
ミドルウェアについてもControllerと同じ扱いでいいかと思います。即ち、共通のものはapp/Http/Middleware、フロントエンド側はapp/Front/Http/Middleware、バックエンド側はapp/Admin/Http/Middlewareに配置していきます。
その他、app直下のもの
app以下の他の要素(Exceptions/Providers/Policiesなど)についても基本的にはコントローラーやミドルウェアと同じ方針で問題ないように思えます。例えばポリシーだったら、共通のものはapp/Policies、フロントエンド側はapp/Front/Policies、バックエンド側はapp/Admin/Policiesといった具合です。
リソース
viewsについてだけ分けてみました。見ての通りです。普通に各コントローラーのアクションメソッドに対応させていく感じで問題ないかと思います。
他の候補
appと同じ改装にfrontとadminディレクトリつくっちゃえばいいんじゃないの?
フロントエンド用app、バックエンド用appみたいに、複数あるイメージなんで、こっちの方が個人的にはしっくりくる。
けど、色々と調査不足。
appの下にFrontとAdminを配置する形でも個人的には特に違和感がないので調査するかどうかは謎。そのうちな?
(2018/04/26 追記)
以下で調査してまとめました。
続・Laravelでバックエンドとフロントエンドを分離したい
コントローラーだけ分けたら? app/Http/Controller/Frontとapp/Http/Controller/Adminみたいに。
フロントエンドとバックエンド両方から利用されるモデルがあった場合、普通はフロントエンドとバックエンドでポリシーが違うかと思います。Policies配下もFrontとAdminに分離したら、これもうワケわかんねぇな?
感想
正解はないとは思いますが、これが妥当かどうかはよくわかりません。反応できるかどうかはわかりませんが、ツッコミあったらどうぞオナシャス。