Help us understand the problem. What is going on with this article?

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

More than 1 year has passed since last update.

前置き

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

Why do not you register as a user and use Qiita more conveniently?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away