#0022

【入門編】Laravelのディレクトリ構造とMVCの処理の流れを理解する

2018-09-26 21:14 2018-09-26 12:14 "ゆざ"

Laravelを初めて触る人にとっては、

laravel new [プロジェクト名]

このコマンドだけで大量のファイルが作成されて何がなんだかわからなくなってしまいませんか?

ぼくが、はじめ触った時は、laravelがどんな仕組み/フローで動いているのかさっぱりわかりませんでした。

ですので今回は、簡単なブログサイトを例として、どのようなフローでLaravelがWebサイトを構築しているのかを解説していきます。

スポンサーリンク

【Laravelの全体構造】画面がクライアントに届くまで

それでは、Laravelの全体のディレクトリ構造についてゆるーく解説していきたいと思います。

今回は、Laravelのバージョンが5.6を使用していきます。

結論から言うと、今回説明するLaravel全体構造は以下のようになります。

Laravelディレクトリ構造

これは、Laravelを使って簡単なブログサイトを作成する際にどのようなフローでWebサイトを構築しているのかを示しています。

この図は今回のキーとなる図解です。じっくり見ていきましょう。

これから、ブラウザにサイト画面がクライアントに表示されるまでを青い矢印にそって説明します。

まず、クライアントがURLを叩いて、サーバーにアクセスするところからスタートします。(図左の青い矢印)

次に、URLのルーティングを行い(web.php)、URLごとにどのような処理を行うかの制御をしているコントローラー(PostsContorller.php)へと移ります。

ここでは、ブログのトップページへと移動するという想定で、ページを完成させるためにモデル(Post.php)を使って必要なデータをデータベースから持ってきて、ビュー(index.blade.php)へとデータを渡します。

ビューではHTMLを生成するテンプレートであるため、HTMLやCSSを用いてWebデザインをして、実際にクライアントの目に触れる画面を作ります。

ビューがなぜ拡張子.htmlではなく、.blade.phpなのかはあとで詳しく説明しますので、ここでの説明は割愛します。

ここで使用する画像データやCSSファイルはassetsというフォルダの中に作成します。

そして、画面が完成したらそれが実際にクライアントのブラウザ上に表示されるというのが一連の流れです。

今の説明で、触れなかった部分は、後述に説明するので、とりあえずは気にしないでください。

それと、ミドルウェア(middleware)についての解説は別記事で説明しますので、ここでは省きます。

次にそれぞれの役割を少しだけ深掘りしてきましょう。

ルーティングの設定(web.php)

web.phpでは、ルーティングを行います。

アクセスしてきたURLに応じて、どのようにアクセスを処理していこうを決めていく役割があります。

例えば、こんな感じです。

Route::get('/', 'PostsController@index');

これは、GETルートパスでアクセスしてきた時の処理が書かれています。

PostsControllerというコントローラーのindexというメソッドにルーティングがされています。

つまり、web.php➡︎PostsController.phpのindexメソッドというようにファイルは繋がっていきます。

ちなみに余談ですが、実際に簡単なブログをCRUDな仕組みで作ると、以下のようにルーティングになります。

Route::get('/', 'PostsController@index');
Route::get('/posts/{post}', 'PostsController@show')->where('post', '[1-9][0-9]*');
Route::get('/posts/create', 'PostsController@create');
Route::post('/posts', 'PostsController@store');
Route::get('/posts/{post}/edit', 'PostsController@edit');
Route::patch('/posts/{post}', 'PostsController@update');
Route::delete('/posts/{post}', 'PostsController@destroy');

ここでは、詳しくは説明しませんが、今度別の記事で詳しく説明していく予定ですので、簡単に目を通しておく程度で結構です。

Laravel公式リファレンス(リソースコントローラーにより処理されるアクション)を参考に。

Laravelディレクトリ構造

MVC構造の流れ

次にルーティングされたコントローラーからモデルを使ってビューにデータを渡すまでの流れ、いわゆるMVCフレームワークの主軸と言える部分について説明していきます。

【コントローラー】フロントとDBの架け橋(Postscontroller.php)

コントローラーでは、ビューへとデータベースからのデータを渡す役割があります。

とはいえ、シンプルな仕組みを作るとコードもほんの数行だけで済みます。

複雑なサービスはむしろコントローラーが肥大化してしまうことに注意が必要です。

class PostsController extends Controller
{
//	====index====
	public function index() {
		$posts = Post::latest()->get();
		return view('posts.index')->with('posts', $posts);
	}
}

これは、Postというモデルを使ってデータベースからデータを取得して、そのデータをビュー(index.blade.php)へと渡してます。

ちなみにこれも簡単なブログをCRUDな仕組みで作ると、以下のようになります。

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use App\Post;
use App\Http\Requests\PostRequest;

class PostsController extends Controller
{
//	====index======================================================
	public function index() {
		$posts = Post::latest()->get();
		return view('posts.index')->with('posts', $posts);
	}

//	====show======================================================
	public function show(Post $post) {
		return view('posts.show')->with('post', $post);
	}

//	====create======================================================
	public function create() {
		return view('posts.create');
	}

//	====store======================================================
	public function store(PostRequest $request) {
		$post = new Post();
		$post->title = $request->title;
		$post->body = $request->body;
		$post->save();
		return redirect('/');
	}

//	====edit======================================================
	public function edit(Post $post) {
		return view('posts.edit')->with('post', $post);
	}
//	====edit======================================================
	public function update(PostRequest $request, Post $post) {
		$post->title = $request->title;
		$post->body = $request->body;
		$post->save();
		return redirect('/');
	}

//	====destroy======================================================
	public function destroy(Post $post) {
		$post->delete();
		return redirect('/');
	}
}

【モデル】DBからデータを取得(Post.php)

先に述べたようにモデル(Post.php)ではデータベースからデータを取得する役割があります。

$posts = Post::latest()->get();

これで、データベースのデータを最新順(latest)に取得する(get)ことができます。

Modelを継承してモデルを作成するので、またもコードはシンプルです。

class Post extends Model
{
    //
	protected $fillable = ['title', 'body'];
}

初期設定のままだと、insertやcreateメソッドでテーブルのカラムに値を挿入する事ができてしまいます。

そのため、複数代入をする時、製作者が意図していない代入が起こることを防ぐために、モデルにはfillable(または、guarded)を設定する必要があります。

$fillableプロパティには、複数代入したいモデルの属性を指定してください。

今回ですと、titleとbodyはブログを投稿する際に複数代入したい値なので、ここで$fillableプロパティ指定しています。

また、補足ですが、Laravelではmodelというディレクトリがなく、どこにmodelを配置して良いのかわかりにくいです。

実際は/appの下に配置するのですが、/app/modelsというディレクトリを作成して、その中にモデルファイルを配置するのも一つの手としてあります。

【ビュー】フロントを作成(index.blade.php)

ビューフロントサイドの画面を作成する役割があります。

HTMLとコントローラーで運んできたデータを使ってフロントを完成させます。

ビューには、blade(ブレイド)というLaravelのテンプレートエンジンを使用します。

blade(ブレイド)は、ビューの中にPHPを直接記述することができ、

<a href="XXX">{{ $post->title }}</a>

このように中括弧で囲むだけでPHPを埋め込むことができたりもします。

また、blade内で使用するCSSファイルや画像ファイルはassetsフォルダの中に用意しましょう。

これで、無事にクライアントのブラウザへとサイトを表示することができます。

Laravelディレクトリ構造

Laravelでのデータベース

次にLaravelにおけるデータベースについてもう少し詳しくお話ししていきます。

環境ファイルで設定(app.php/.env)

config/app.phpと.envファイル(環境ファイル)には、どのデータベースを使用するか、データベース名やデータベースホスト名、ユーザー名、パスワードなどを記載する箇所があります。

そのため、自分の使用するデータベースに合わせて設定をしておきましょう。

【マイグレーション】データテーブルを作成(create_posts_table.php)

Laravelでは、SQLコマンドを打つことなく、データベーステーブルを自動生成してくれるマイグレーションファイルというものがあります。

    public function up()
    {
        Schema::create('posts', function (Blueprint $table) {
            $table->increments('id');
            $table->string('title');
            $table->text('body');
            $table->timestamps();
        });
    }

マイグレーションファイルには、このようにテーブルに必要なカラムの設定を記載します。

カラム名 内容
id 主キーとなるID
title ブログのタイトル
body ブログの本文
created_at ブログ執筆開始日
updated_at ブログ更新日

また、コマンドからマイグレーションファイルを作成することも可能です。

php artisan migrate:make [ファイル名] 

バリデーションを設定(PostRequest.php)

最後に、PostRequest.phpについて解説します。

ここには、ブログを投稿するためのフォームのバリデーションなどのルールを記載することができます。

class PostRequest extends FormRequest
{
    public function authorize()
    {
        return true;
    }

    public function rules()
    {
        return [
	        'title' => 'required|min:3',
	        'body' => 'required',
        ];
    }

    public function messages() {
    	return [
    		'title.required' => 'please enter title!',
    		'title.required' => 'please enter body!'
	    ];
    }
}

rules()の中にバリデーションのルールが書かれています。

今回は、titleは必須項目かつ最低3文字以上、bodyは必須項目というルールです。

また、messages()には、titleが入力されていないときに出るエラーメッセージを指定しています(日本語も指定できます)。

今回のまとめ

簡単なブログサイトをLaravelを使って作成する際にどのようなフローでLaravelがサイトを構築しているのかを解説してきました。

まとめると、このような大まかな流れです。

  1. URLによって処理のルーティングを行う
  2. コントローラーでDBからの情報をフロントへ
  3. モデルでDBからデータを取得
  4. ビューでフロントを表示

Laravelディレクトリ構造

今回は、かなりざっくりと大まかな解説でしたが、全体的にLaravelはどのような構造をしているかが理解してもらえれば大いに嬉しいです。

これをベースに実際に簡単なCRUDなWebサービスを作ってみると、さらに理解が深まると思います。

この記事を書いた人

学生Webエンジニア PLANインターン生 PHP Laravel Python HTML CSS JS

【名前】 "ゆざ"

【関連】 株式会社PLAN / MIYABI Lab / Tmeet(twitterユーザーマッチングサービス) /

【MIYABI Lab運営】23歳/同期がト◯タやMicr◯softに就職する中、ベンチャーに未経験でWebエンジニアになるのを選んだ脳科学専攻の理系院生◆人見知り日本縦断◆機械学習/Web歴5ヶ月

Twitterやってます

最新の技術ブログはこちら