前置き
この記事は以前書いた以下の記事から再調査、色々考え直した結果です。
併せて読む必要はまったくありませんが、一応リンクだけ貼っときます。
Laravelでバックエンドとフロントエンドを分離したい
本稿のテーマ(=問題意識)
開発する際にバックエンドとフロントエンドを分離しておきたい。
けれどもバックエンドとフロントエンドで2つWebアプリ開発するには予算と工数(とやる気)が足りない。
上記のようなケースは稀によくある気がします。
こういう時は「とりあえずディレクトリだけでも分けとくか」という形に落ち着くかと思いますが、「じゃあどういう風にディレクトリに分けようか」というのが本稿のテーマになります。
結論
以下のような形にしてみました。Multi-Auth前提です。
ちなみにこちらの方法はまだ実戦投入したことがありませんので、開発が進んで何かしらの問題が発生する場合もあるかと思います。随時情報は更新するつもりですが、あらかじめご了承ください。
appと同じ構成のフロントエンド用のfrontディレクトリとバックエンド用のadminディレクトリを用意する形です。
front配下はFrontネームスペースに、admin配下はAdminネームスペースに、app配下は当然Appネームスペースという形にしますです。
モデルをModelsディレクトリに格納してるのは単なる趣味です。
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
この構成にするために必要なこと
ネームスペースの設定
composer.jsonにautoloadの設定をします。
"autoload": {
"psr-4": {
"App\\": "app/",
"Front\\": "front/",
"Admin\\": "admin/"
}
},
composer dump-autoload
を忘れずに。
ルーティング周り
Controllerの配置場所がデフォルトのネームスペースとは違うので、ルーティングに少し影響があります。デフォルトですとroute/web.phpではapp/Http/Controllers以下のコントローラー(正確にはApp\Http\Controllersネームスペースのコントローラー)しか探してくれませんでした。なのでRouteServiceProviderクラスを少し書き換える必要があります。
protected function mapWebRoutes()
{
Route::middleware('web')
->namespace('Front\Http\Controllers')
->group(base_path('routes/front.php'));
Route::middleware('web')
->namespace('Admin\Http\Controllers')
->group(base_path('routes/admin.php'));
}
こうすると、Front\Http\ControllersネームスペースとAdmin\Http\Controllersネームスペースにあるコントローラーを探してくれるはずです。
ルーティングの設定はroutes/web.phpではなく、routes/front.phpとroutes/admin.phpにそれぞれ記述していきます。
ちゃんとAuth::routes()だったりRoute::resource()だったりも使えます。きっと。
解説(?)と意図
ソースコード
- 共通のものはapp配下に。
- バックエンドのものはadmin配下に。
- フロントエンドのものはfront配下に。
スッキリ。
リソース
本稿の結論ではresourcesについてはviews以下でfrontとadminに分けてます。assets以下を分けていない理由は単純で、mixでcompileした結果がfront.cssとadmin.cssみたいに別れてれば問題ないだろうと考えたからです(安易)
但し、このへんはデザイナーさんとの作業の兼ね合いとかも踏まえて考えた方がよさそうな気がします。
感想
1日で前言覆す感じがいきあたりばったり感がパないですが、ツッコミあったらどうぞオナシャス。
2018/05/10 追記
scaffoldつくってみました。
こちらにまとめましたので、よければどうぞ。
Laravelでバックエンドとフロントエンドを分離するためのscaffoldをつくってみた