LoginSignup
18
17

More than 5 years have passed since last update.

続・Laravelでバックエンドとフロントエンドを分離したい

Last updated at Posted at 2018-04-26

前置き

この記事は以前書いた以下の記事から再調査、色々考え直した結果です。
併せて読む必要はまったくありませんが、一応リンクだけ貼っときます。
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の設定をします。

composer.json
    "autoload": {
        "psr-4": {
            "App\\": "app/",
            "Front\\": "front/",
            "Admin\\": "admin/"
        }   
    },

composer dump-autoload を忘れずに。

ルーティング周り

Controllerの配置場所がデフォルトのネームスペースとは違うので、ルーティングに少し影響があります。デフォルトですとroute/web.phpではapp/Http/Controllers以下のコントローラー(正確にはApp\Http\Controllersネームスペースのコントローラー)しか探してくれませんでした。なのでRouteServiceProviderクラスを少し書き換える必要があります。

app/Providers/RouteServiceProvider.php
    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をつくってみた

18
17
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
18
17