【AWS】知識ゼロから理解するRDS超入門
AWSのデータベースサービス「Amazon RDS」を初心者にもわかるように解説します。未経験には難しいMultiAZ構成やレプリケーションは、マスター/スレ...
2018-09-26 21:14 2018-09-26 21:14
Laravelを初めて触る人にとっては、
laravel new [プロジェクト名]
このコマンドだけで大量のファイルが作成されて何がなんだかわからなくなってしまいませんか?
ぼくが、はじめ触った時は、laravelがどんな仕組み/フローで動いているのかさっぱりわかりませんでした。
ですので今回は、簡単なブログサイトを例として、どのようなフローでLaravelがWebサイトを構築しているのかを解説していきます。
それでは、Laravelの全体のディレクトリ構造についてゆるーく解説していきたいと思います。
今回は、Laravelのバージョンが5.6を使用していきます。
結論から言うと、今回説明する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では、ルーティングを行います。
アクセスしてきた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公式リファレンス(リソースコントローラーにより処理されるアクション)を参考に。
次にルーティングされたコントローラーからモデルを使ってビューにデータを渡すまでの流れ、いわゆるMVCフレームワークの主軸と言える部分について説明していきます。
コントローラーでは、ビューへとデータベースからのデータを渡す役割があります。
とはいえ、シンプルな仕組みを作るとコードもほんの数行だけで済みます。
複雑なサービスはむしろコントローラーが肥大化してしまうことに注意が必要です。
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('/');
}
}
先に述べたようにモデル(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というディレクトリを作成して、その中にモデルファイルを配置するのも一つの手としてあります。
ビューはフロントサイドの画面を作成する役割があります。
HTMLとコントローラーで運んできたデータを使ってフロントを完成させます。
ビューには、blade(ブレイド)というLaravelのテンプレートエンジンを使用します。
blade(ブレイド)は、ビューの中にPHPを直接記述することができ、
<a href="XXX">{{ $post->title }}</a>
このように中括弧で囲むだけでPHPを埋め込むことができたりもします。
また、blade内で使用するCSSファイルや画像ファイルはassetsフォルダの中に用意しましょう。
これで、無事にクライアントのブラウザへとサイトを表示することができます。
次にLaravelにおけるデータベースについてもう少し詳しくお話ししていきます。
config/app.phpと.envファイル(環境ファイル)には、どのデータベースを使用するか、データベース名やデータベースホスト名、ユーザー名、パスワードなどを記載する箇所があります。
そのため、自分の使用するデータベースに合わせて設定をしておきましょう。
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について解説します。
ここには、ブログを投稿するためのフォームのバリデーションなどのルールを記載することができます。
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がサイトを構築しているのかを解説してきました。
まとめると、このような大まかな流れです。
今回は、かなりざっくりと大まかな解説でしたが、全体的にLaravelはどのような構造をしているかが理解してもらえれば大いに嬉しいです。
これをベースに実際に簡単なCRUDなWebサービスを作ってみると、さらに理解が深まると思います。
学生Webエンジニア PLANインターン生 PHP Laravel Python HTML CSS JS
【名前】 "ゆざ"
【関連】 株式会社PLAN / MIYABI Lab / Tmeet(twitterユーザーマッチングサービス) /
【MIYABI Lab運営】23歳/同期がト◯タやMicr◯softに就職する中、ベンチャーに未経験でWebエンジニアになるのを選んだ脳科学専攻の理系院生◆人見知り日本縦断◆機械学習/Web歴5ヶ月
【AWS】知識ゼロから理解するRDS超入門
AWSのデータベースサービス「Amazon RDS」を初心者にもわかるように解説します。未経験には難しいMultiAZ構成やレプリケーションは、マスター/スレ...
【AWS】Auto Scalingする前に知っておくべき7つのこと
Amazon EC2 Auto Scaling(オートスケール)を使用すると、CPU使用率等に応じてEC2の台数を自動的に増減できます。ここでは、初心者の持つ疑問を通し...
WordPressの基本構造を理解してオリジナルテーマを作ろう(後半)
WordPressのテーマを自作するために必要なテンプレートファイル(functions.phpやstyle.css)の役割やファイル構造を理解して、どのようにオリジナ...
WordPressの基本構造を理解してオリジナルテーマを作ろう(前半)
WordPressのテーマを自作するために必要なテンプレートファイル(functions.phpやfront-page.php)の役割やファイル構造を理解して、どのようにオ...
【Heroku入門】無料枠サーバーを24時間スリープさせない方法
フリープランのHerokuサーバーでは、30分以上アクセスがないと自動的にスリープしてしまいます。ここでは、Herokuサーバーを寝かせない方法につい...
【入門編】Laravelのディレクトリ構造とMVCの処理の流れを理解する
Laravel初心者が学習する際にわかりにくいLaravelのディレクトリ構造を具体的な例を交えて解説します。MVCの基本であるビュー、モデル、コントロー...
【初心者向け】PythonによるHeroku環境で簡単LINEBot開発
誰でも簡単にLINEBotをpythonを使ってHeroku環境で開発できる方法を解説します。ここでは、LINE Messaging APIを用いることでおうむ返しをするBot...
AWSでWebサーバー構築!踏み台サーバーでセキュアなネットワークを構築する(第5回)
連載の第5回です。メインEC2に対して直接SSH接続できる状態というのは、セキュリティの観点からあまり望ましくありません。MySQLやEBSが紐づいたメ...
AnacondaでのTensorFlow環境構築と基礎的な使い方
Anaconda(アナコンダ)のインストールからJupyter notebook(ジュピターノートブック)とTensorFlow(テンサーフロー)の基本的な使い方を初心者...
脱初心者!MNIST beginnerに隠れ層を加えたニューラルネット解説
TensorFlowのチュートリアルであるMNIST beginnerの応用して、隠れ層と活性化関数を加えたニューラルネットワークで手書き文字識別を解説します。...
AWSでWebサーバー構築!Apache2.4, PHP7, MySQLの導入と初期設定(第4回)
連載の第4回です。今回は作成したEC2インスタンスにWebサーバーとしての機能を持たせるため、Apache2.4のインストールおよびhttpd.conf等の各種設...
AWSでWebサーバー構築!EC2を作成してSSH接続する(第3回)
連載の第3回です。前回作成したVPC・サブネットにおいて、セキュリティーグループに保護されたEC2インスタンスの作成・設定およびSSH接続の確立ま...
初心者必読!MNIST実行環境の準備から手書き文字識別までを徹底解説!
Pythonによる機械学習をプログラミング初心者にもわかりやすいように、TensorFlowチュートリアルのMNIST beginnerを使って、手書き文字(MNIST)識別...
AWSでWebサーバー構築!専門用語の解説とVPC環境を構築する手順(第2回)
連載の第2回です。AWSにてVPCネットワークを構築してWebサーバーを設置・運用するためには、AWS内で利用される重要単語について正しく理解しておく...
知識ゼロで機械学習・AIを理解するために必要なニューラルネットワークの基礎知識
機械学習・AIを理解するために必要なニューラルネットワークの基礎について、これから機械学習を勉強したい人、プログラミング未経験の人にもわか...
Canvaで簡単におしゃれなアイキャッチ画像を作ろう!使い方を徹底解説!
PhotoshopやIllustratorを使えなくてもCanvaなら誰でも簡単におしゃれなアイキャッチ画像が作れます。豊富なデザインテンプレートを組み合わせるだ...
プレビュー機能付きの記事編集画面の作り方(Laravel5)
記事編集フォームにはプレビュー機能の実装が必須です。記事を保存する処理とプレビューを表示する処理を共存させるにあたり、ボタンをクリックし...
AWSでWebサーバー構築!VPC設計に必要なIPアドレスとサブネットの基礎知識(第1回)
連載の第1回です。AWSのVPCネットワークを設計して実際に構築するためには、IPアドレスの基礎を理解することが非常に大切です。EC2 Webサーバーを...
MIYABI Labホームページを製作しました
様々な理由でプログラミングの勉強を困難だと感じてしまっている方のお役に立てれば嬉しいです。これからも小さなWebサービスを作り続けていき、技...
ゆざ、株式会社PLANを卒業します。
2年間インターンとしてお世話になった株式会社PLANを卒業します。AWS,Laravel,Pythonなどの技術的なことだけではなく、エンジニアとして、社会人と...