Lesson 3

Hello World

Lesson 3 Chapter 1
Laravelの基本

Lesson3ではメッセージをブラウザに表示し、簡単な処理の流れを確認していきましょう。

Laravelの基本

Laravelでは基本的に複数のファイルが関与しあって一つの処理が完成します。 それぞれのファイルがどのように関与し、どのような流れで処理が実行されていくのかを確認しながらメッセージをブラウザに出力していきましょう。

Lesson3で使用するファイル

ページの表示を行うことを前提にLesson3では以下のファイルを準備し、処理を記述していきます。ファイルの準備方法や場所については後ほどご説明します。

  • web.php ・・・ ルーティング
  • HelloController ・・・ コントローラ
  • hello.blade.php ・・・ ビュー

ページを表示するまでのおおまかな流れ

Lesson1で紹介したMVCモデルの例を基に流れを解説していきます。

MCVモデル

①[ユーザー]
表示したいページへアクセスする。

②[web.php]
「Hello World」を表示する処理が書かれているControllerへ処理を渡す。

③[controller.php]
「Hello World」を表示するページへ遷移させる。

④[blade.php]
「Hello World」を表示する。

以上が「Hello World」を表示させるまでの簡単な流れになります。尚、今回はページの表示を行うのみで実際にデータの作成や削除、編集等の機能は発生しない為、モデルを経由しません。データベースの操作はこの先の項目で触れていきますので、現段階では最も基本的な「ページ表示」の処理の流れをイメージしておきましょう。

Lesson 3 Chapter 2
ルーティング

chapter2ではルーティング(web.php)について学習していきます。

ルーティングとは

ルーティングとはユーザーの起こしたアクションに合わせて実行する処理を制御する存在になります。例えばホームページの上部にメニューバーが存在し、その中に複数のメニューが存在しますが、押したメニューに応じて該当するページを表示できるのもLaravelではルーティングの存在によって実現できています。ユーザーがメニューバーにある「お問い合わせ」をクリックした場合、ルーティングでもメニューの「お問い合わせ」がクリックされたことを認識し、お問合せページを表示する処理へ実行を促しているイメージになります。

もう少し身近な例で図をもとに確認してみましょう。

ルーティング図

テレビを見ているユーザーがリモコンでチャンネルの変更を行います。2チャンネルのボタンを押した場合、2チャンネルのボタンを押されたことをルーティングが受け取り、画面を2チャンネルに変更する処理2へと信号を送ります。受け取った処理2は処理を実行し、テレビのチャンネルが2に変わります。この一連の動きの中でのルーティングの存在位置を覚えておきましょう。

ルーティングの解説

ルーティングはweb.phpに記述します。以下がweb.phpの場所です。

routes > web.php

web.php
Route::get('/', function () {
    return view('welcome');
});

こちらはLesson2の最後の講座で表示したwelcomeページを表示する為のルーティングになります。URL「/」へアクセスがあった場合に「return view("welcome")」を実行しています。

return viewについて

return viewの引数には表示させたいblade.phpのファイル名を指定してあげます。上記のwelcomeについてもう少し深掘りしてみましょう。viewを作成しているblade.phpは以下ディレクトリに配置します。

resources > views > welcome.blade.php

ページの表示に関するファイルviewは「blade.php」と命名されています。blade.phpを省略したwelcomeを参照しreturn view("welcome")とすることで、welcome.blade.phpの表示を行うことが可能です。

ルーティングの記述

新たにルーティングを追記してみましょう。上記で紹介したルーティングの記述は最も基本的な形となりますが、web.php内で処理を完結させてしまうことは柔軟性も低く現実的ではありません。ここからはよく利用されている一般的な記述方法をご紹介します。最下行の追加したルーティングに注目してください。

web.php
<?php

use Illuminate\Support\Facades\Route;

Route::get('/', function () {
    return view('welcome');
});

// 追加
Route::get('/hello', [App\Http\Controllers\HelloController::class, 'Hello']);

①Route::get()

getメソッドは、主にページの表示を行う際に使用します。今回はHello Worldとメッセージを出力するblade.phpを表示させたいのでgetメソッドを使用しています。

②/hello

任意のURLを指定できます。今回はHello Worldを表示する為のURLを 「/hello」と定義しました。

③App\Http\Controllers\HelloController::class

実行するメソッドのパスを指定します。ユーザーが「/hello」へアクセスした場合にHelloControllerに定義しているメソッドを呼び出す為の記述となります。

④'Hello'

実行したいメソッドを指定します。HelloControllerに定義しているHelloメソッドを実行します。

まとめ

上記をまとめると、URL「/hello」へアクセスがあった場合に「App\Http\Controllers\HelloController」に定義している「Helloメソッド」を実行します。というところまで定義をすることができました。

(※HelloController等は次のchapterで用意していきます。)

ルーティングに名前をつける

ルーティングには以下のようにname関数を使用して名前をつけることも可能です。

web.php
<?php
Route::get('/hello', [App\Http\Controllers\HelloController::class, 'Hello'])->name('hello');

name関数を使用していない場合

現在指定されている「/hello」から今後、別のURLに変更する際に、web.phpで定義しているルーティングとルーティングを呼び出している各ファイルの複数の場所で「/hello」のURLを変更後のURLに書き換える作業が発生します。探す作業や、変更漏れが起きた場合、エラーに繋がり、サービスとしても不信感へ繋がってしまうリスクも可能性としてあることでしょう。

name関数を使用している場合

URLの変更が必要となった場合にはweb.phpの「/hello」1箇所だけを変更するだけで修正が完了になります。なぜならURLではなくname関数の部分を参照してルーティングを呼び出している為です。書き換える作業は1箇所で済み、変更のリスクを最小限に抑えることが可能となっています。

ルーティングの呼び出し例

処理を実行する際は、まず最初に「どの処理を実行するのか」ルーティングを呼び出す必要があります。下記のようなボタンがあり、クリックすることで任意のルーティングが実行されます。

URLを参照する場合「/hello」

web.php
<a href="/hello">こちらをクリック</a>

ルーティングは「/helloへアクセスがあった」と判断し、/helloが使用されているルーティングが実行されます。

name関数を参照する場合「route('hello')」

web.php
<a href="{{ route('hello') }}">こちらをクリック</a>

ルーティングはname関数の「helloが呼び出された」と判断し、name("hello")と定義されているルーティングが実行されます。

ルーティングで使用するHTTPメソッド

ルーティングには以下のHTTPメソッドが存在し、実行する処理に応じてHTTPメソッドを指定する必要があります。

web.php
<?php
// get
Route::get(URL, [App\Http\Controllers\HelloController::class, メソッド]);
// post
Route::post(URL, [App\Http\Controllers\HelloController::class, メソッド]);
// put
Route::put(URL, [App\Http\Controllers\HelloController::class, メソッド]);
// patch
Route::patch(URL, [App\Http\Controllers\HelloController::class, メソッド]);
// delete
Route::delete(URL, [App\Http\Controllers\HelloController::class, メソッド]);

①getメソッド

get送信やページの表示、データ取得を行う際に使用するメソッドです。

②postメソッド

post送信を行う際に使用するメソッドです。主にデータの作成や削除、更新などを行う際に使用します。

③putメソッド

postでも実装は可能ですが、主にデータの全更新する場合に使用します。

④patchメソッド

postでも実装が可能ですが、主にデータの一部を更新する場合に使用します。

⑤delete

postでも実装可能ですが、主にデータを削除する際に使用します。

ルーティングのおさらい

ルーティングとは、ページの表示やデータの追加、削除、編集等の処理を実行する為に必須な記述になります。ユーザーがどのような処理を実行したのかをURL又は、name関数に指定したnameを基にルーティングから該当の処理が定義されているコントローラのメソッドへ処理の実行を促す為の記述になりますので、必ずルーティングの設定を行いましょう。

又、実行したい処理に応じてHTTPメソッドを指定する必要があります。例えばページの表示処理であればgetメソッド、データの削除処理であればdeleteメソッドのように使い分けが行えるように上記HTTPメソッドの認識も持っておきましょう。厳密にはgetとpostのメソッドのみでwebアプリケーションの作成は可能となっておりますが、プロジェクトの規模が大きくなればルーティングの記述量も増える為、どのルーティングでは何の処理を行なっているのかを分かりやすくするためにも各メソッドについては覚えておき、使用していく必要があります。各メソッドについては今後の学習で触れていきます。

Lesson 3 Chapter 3
コントローラ

続いてはControllerについて学習していきます。

web.php
<?php

use Illuminate\Support\Facades\Route;

Route::get('/', function () {
    return view('welcome');
});

// 追加部分
Route::get('/hello', [App\Http\Controllers\HelloController::class, 'Hello'])->name('hello');

コントローラとは

それでは本題に移ります。コントローラとは実際に処理を記述する場所になります。アーキテクチャ設計次第では制御の方が相応しい場合もありますが、現時点では「処理を記述する場所」と覚えておきましょう。

コントローラを作成する

Laravelではコマンド一つで簡単にコントローラを作成することが可能です。ターミナル、又はコマンドプロンプトからLaravelディレクトリにいる状態で以下コマンドを実行してください。

Controllerの作成
php artisan make:controller HelloController

以下が実行結果です。

実行結果
Controller [app/Http/Controllers/HelloController.php] created successfully.

HelloController部分の命名は任意ですが、今回はHelloControllerとします。

作成されたコントローラを確認する

作成したコントローラは以下に配置されます。HelloControllerを開きましょう。

app > Http > Controllers > HelloController

HelloController
<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;

class HelloController extends Controller
{
    //
}

作成されたコントローラについて解説していきます。

namespace App\Http\Controllers

作成したHelloControllerが存在しているディレクトリを指しています。デフォルトではControllersの配下に作成されますが、プロジェクトの規模も大きくなれば更にディレクトリの階層が深くなるので、その時のディレクトリ構造に合わせてnamespaceも変更してあげましょう。

use ...

外部のファイルに定義されている処理や機能を使用する際にuseを使用して、その外部ファイルを読み込みます。phpので使用していたrequire関数と同じ役割を持っています。デフォルトではRequest.phpをuseしていますが今回は使用しません。他にも外部ファイルを読み込みたい場合は以下のように続けてuseを追加していきます。

HelloController
<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use ...
use ...

class HelloController extends Controller

classの後にはこのコントローラ名が記述されます。そしてextends ControllerとしてController.phpを継承することでHelloControllerではControllerとしての処理を発揮することができます。

コントローラに処理を追記する

作成したコントローラに処理を追記していきましょう。

app > Http > Controllers > HelloController

HelloController
<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;

class HelloController extends Controller
{
    //
}

メソッドの定義

メソッドはclass内に定義していきます。

HelloController
<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;

class HelloController extends Controller
{
    // 追加
    public function Hello(){

    }
}

処理の定義

HelloController
<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;

class HelloController extends Controller
{
    public function Hello(){
      // 追加
      return view("hello");
    }
}

以上でメソッドの定義が完了しました。Helloメソッドはhello.blade.phpを表示する処理となります。後ほどの項目で実際にルーティングを通じてHelloConstollerのHelloメソッドを実行していきます。

(※hello.blade.phpは次のchapterで作成します。)

Lesson 3 Chapter 4
ビュー

続いてはViewについて学習していきます。

HelloController
<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;

class HelloController extends Controller
{
  // 追加
  public function Hello(){
    return view("hello");
  }
}

ビューとは

ビューとは画面に表示する部分を指します。htmlと同じようなイメージですが、拡張子は.phpであることと、Laravelではbladeをファイル名に入れる必要があるので覚えておきましょう。

bladeファイルの作成

bladeファイルを作成するコマンドは存在しません。手動で以下ディレクトリにファイルを作成し、記述を追加してください。

resources > views > hello.blade.php

hello.blade.php
<body>
  <p>Hello World &lt/p>
</body>

bladeファイルの作成は以上になります。今後bladeファイルを追加する場合は以上の手順で作成していきましょう。

Lesson 3 Chapter 5
HelloWorldの表示

最後に問題なくブラウザ表示ができるかを確認していきます。

ブラウザ確認

以下のURLへアクセスし、ブラウザを確認してみましょう。HelloWorldがブラウザに表示されていれば成功です。

http://127.0.0.1:8000/hello

出力結果
Hello World

ページ表示まとめ

①アクセス

http://127.0.0.1:8000は省略されています。「/hello」にアクセスされたことでweb.phpに定義されている該当のルーティングが参照されます。

②ルーティング

/helloに該当するルーティングは以下になります。

web.php
<?php
Route::get('/hello', [App\Http\Controllers\HelloController::class, 'Hello'])->name('hello');

/helloへアクセスがあったことでHelloControllerのHelloメソッドが呼び出されます。

③処理の実行

HelloController内のHelloメソッドが実行されます。処理の内容はhello.blade.phpの表示になります。

HelloController
<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;

class HelloController extends Controller
{
    public function Hello(){
      return view("hello");
    }
}

④ページの表示

hello.blade.php
<body>
  <p>Hello World &lt/p>
</body>

hello.blade.php内で記述されている部分がビューとしてブラウザに出力されました。

このように一つページを表示させるだけでも3つのファイルが関与していることが確認できました。こちらは最も基本的な形となりますので慣れていきましょう。