索引

  • ルーティング
  • コントローラー

ルーティング

「ルーティング」とは、特定のアドレスにアクセスしたとき、どの処理を呼び出して実行するか管理するシステムです。

routes フォルダーについて

ルーティングに関する情報をまとめているのが、「routes」フォルダーです。この中には、デフォルトでいくつかのスクリプトが用意されています。

api.phpAPI のルーティングです。例えば、ユーザー認証などの様に、プログラム内から利用する API の機能を特定のアドレスい割り当てる為に利用されます。
channels.phpブロードキャストチャンネルの為のルーティングです。
console.phpコンソールプログラムの為のルーティングです。
web.php一般的な Web ページとしてアクセスする為のルーティングです。

基本的に、Web ページとして公開するものはすべて web.php にルート情報を記述するものと考えてください。

ルート情報の記述

web.php のスクリプトがどの様になっているのかみていきます。

<?php
Route::get ("/", function () {
  return view ("welcome") ;
}) ;

非常にシンプルなスクリプトが書かれています。これは、トップページにアクセスした時の処理について記述したものです。Laravel アプリケーションでは、デフォルトでトップページの表示が用意されていました。あの画面を表示させる為のスクリプトだと考えればいいです。

ルート情報の基本

Route::get ("<アドレス>", <関数など>) ;

GET アクセスのルート情報は、Route クラスの get という静的メソッドを使って設定します。第一引数に割り当てるアドレスを、第二引数にそこにアクセスすることによって呼び出される処理を用意します。ここには関数を設定する場合もありますし、「コントローラー」というものを設定することもあります。

get メソッドでアドレスと処理を割り当てる、というのがルート情報設定の基本である、ということを理解しておきましょう。

トップページのルート情報

デフォルトで用意されているトップページのルート情報がどの様なものなのかみてみます。

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

第一引数には。”/” というトップページを表すアドレスを。第二引数には関数を指定しています。引数なしのクロージャ(無名関数)になっています。内部では、return で返される値が、そのアドレスにアクセスした際に表示される内容となります。ここでは、view という関数を使って戻り値を用意しています。

view (テンプレート名) ;

上は view メソッドを一般化したものです。指定したテンプレートファイルをロードし、レンダリングして返す働きをします。

デフォルトで用意されているルーティングでは、return で返しているのは、view (“welcome”) という関数の戻り値です。これで、welcome.blade.php というテンプレートファイルをレンダリングして表示しています。

welcome.blade.php と言いうテンプレートファイルは、「resource」フォルダ内の「view」フォルダの中に用意されています。今は場所を覚えておくだけで結構です。

welcome.blade.php の中身がどの様になっているか、確認してみます。ここでは、直接処理に関係のないスタイルシートの記述やレンダリングの表示は省略してます。

<!doctype html>
<html>
<head>
  <meta charset="utf-8" />
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1">

  <title>Laravel</title>

  省略

</head>
<body>
  <div class="flex-center position-ref full-height">
    @if (Route::has('login'))
      <div class="top-right links">
        @auth
          <a href="{{ url('/home') }}">Home</a>
        @else
          <a href="{{ route('login') }}">Login</a>
          <a href="{{ route('register') }}">Register</a>
        @endauth
      </div>
    @endif

    <div class="content">
      <div class="title m-b-md">
        Laravel
      </div>

      <div class="links">

        省略

      </div>
    </div>
  </div>
</body>
</html>
  

基本的に html のコードで書かれている様に思えますが、html のコードではありません。かといって PHP の構文かというとそうでもありません。これは、Laravel に組み込まれているテンプレートエンジンを使って書かれたソースコードです。

Laravel は PHP をそのまま使って Web ページの表示をすることもできますが、内蔵する Blade テンプレートエンジンを使う方が遥かに多いでしょう。ここでは、「view」フォルダの中にテンプレートファイルが用意され、それを view 関数で読み込んで表示するという基本的な仕組みがわかっていれば十分です。

ルート情報を追加する

ルート情報の基本がわかったら、実際にルート情報を追加してみます。「routes」フォルダ内の web.php をテキストエディタなどで開きます。以下のスクリプトを追記していきます。

Route::get ("/hello", function () {
  return "<html><body><p>Hello , This is sample page.</p></body></html>" ;
}) ;

記述したらターミナルから、「php -S 0.0.0.0:8000 -t public」コマンドを実行して Web サーバーを起動させます。ホストマシン側で、http://localhost:4080/hello にアクセスしてみます。追記したビュー情報が表示されます。これが、ルート情報による表示です。

ルートパラメータの利用

Route::get では、アクセスした際にパラメータを設定し、値を渡すことができます。

Route::get ("/.../{パラメータ}", function ($受け取る引数) {...}) ;

第一引数のアドレス部分に、{パラメータ} という形でパラメータを用意しています。これで、この {パラメータ} に指定したテキスト部分がパラメータとして取り出される様になります。

第二引数の関数では、パラメータの値を受け取る変数として用意しておきます。これは、パラメータ名と同じ名前である必要はありません。{パラメータ} で指定したパラメータの値は、そのまま関数の引数に渡されます。実際に利用してみます。

Route::get ("/route/{msg}", function ($msg) {
  $html = <<<EOF
    <html>
    <head>
      <meta charset="utf-8" />
      <title>route</tiitle>
    </head>
    <body>
      <h1>{$msg}</h1>
    </body>
    </html>
  EOF ;
  return $html ;
}) ;

今回はヒアドキュメント内に変数を埋め込んで利用する為、Route::get の第二引数に用意するクロージャ(無名関数)内にヒアドキュメントを移動してあります。

修正できたら、/route/ のアドレスの後にテキストを追記してアクセスしてみてください。アドレスに追記した部分がパラメータとして取り出され、Web ページ内にメッセージとして表示されます。

http://localhost:4080/route/this_is_a_message

必須パラメータと任意パラメータ

任意パラメータは、「任意につけて利用できるパラメータ」です。これは、パラメータ名の末尾に「?」をつけて宣言します。そして、第二引数の関数では、値が渡される仮引数にデフォルト値を指定し、引数が渡されなくとも処理できる様にしておきます。上の例を以下の様に書き換えます。

Route::get ("/route/{msg?}", function ($msg = "no message") {
  ...省略...
}) ;

これによりパラメータ msg は任意パラメータとなります。パラメータを指定せずにアクセスすると、代替テキストとして、no message が表示されます。

コントローラの利用

ルーティングは、アクセスしたアドレスを元に処理を割り振る為の機能です。先ほど。Route::get を使って簡単な Web ページを表示させましたが、ルーティングは Web ページを表示する為のものではありません。具体的に実行すべき処理は別に用意されていいて、それを特定のアドレスに割り振って呼び出す為のものです。

呼び出される「具体的に実行するべき処理」というのは、どういうものか、それを実装する為に用意されているのが「コントローラ」です。

コントローラを知るには、まず「MVC」呼ばれるアーキテクチャについて理解しなければいけません。

MVC は、「Model – View – Controller」の略で、アプリケーションの処理を、MVC の三つの要素の組み合わせとして構築していく考え方です。MVC は、それぞれ以下の様な役割を果たします。

モデル (Model)データ処理全般を担当します。具体的には、データベースアクセスに関する処理全般を扱うものと考えていいです。
ビュー (View)画面表示を担当します。表示に使うテンプレートなどがこれに相当します。
コントローラ (Controller)全体の制御を担当します。必要に応じて Model を使ってデータを取得したり、View を利用して画面表示を作成したりします。

モデル (Model) やビュー (View) は、特定の機能に特化したものです。これに対し、コントローラ (Controller) は処理全体の制御を担当するものであり、プログラムの本体部分と言ってもいいものです。モデルやビューは、不要であれば用意しないでおくことも可能ですが、コントローラはないと動きません。

コントローラの作成

コントローラを作成してみます。コントローラは、PHP のスクリプトファイルとして作成します。テキストエディタ等でファイルを作成することもできますが、ここでは Laravel が用意している artisan コマンドを使って作成していきます。

ターミナルでプロジェクトフォルダに移動し、以下の様なコマンドを実行します。

# cd laravelapp/
# php artisan make:controller HelloController

これで「HelloController」という名前のコントローラが作成されます。

artisan の make:controller について、ここでは、artisan コマンドというものを使いました。これは以下の様な形で実行します。

# php artisan <コマンド>

今回使ったのは、「make:controller」というコマンドです。これは以下の様に実行します。

# php artisan make:controller <コントローラ名>

これで新しいコントローラが作成されます。コントローラを命名する際、通常は「◯◯Controller」という様に命名します。

HelloController

では、作成されたコントローラファイルを見てみます。コントローラは、「app」フォルダの「Http」フォルダ内にある「Controllers」フォルダの中に作成されています。HelloController ファイルをテキストエディタで開きます。

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;

class HelloController extends Controller
{
    //
}

これがコントローラの基本ソースになります。詳しくみていきます。

Controllers 名前空間

コントローラは、クラスとして作成されます。このクラスは、App\Http\Controllers という名前空間の配置されます。名前空間というのは、クラスを階層的に整理する為の仕組みです。フォルダを使って階層的にファイルを整理するのと同じ様なものをイメージすればいいです。

ここでは、App\Http\Controllers という名前空間を使っていますが、これはよく見るとどこかで見覚えのある文字列が並んでいるのが分かります。これは、コントローラファイルの置かれているフォルダ構成に沿って名前空間が指定してあることがわかります。この名前空間を指定しているのが最初の文です。

namespace App\Http\Controllers ;

use によるクラスのインポート

次に記述されているのは、use 文です。これは以下の様に記述されます。

use Illuminate\Http\Request ;

ここでは、Illuminate\Http パッケージ内に用意されている「Request」を使える状態にしています。デフォルトの段階では不要ですが、これから使う機会が増えていくので最初からインポートされています。

クラスの定義

続いてクラスの定義がされています。ここでは、HelloController クラスが以下の様に定義されています。

class HelloController extends Controller
{
    //
}

コントローラクラスは、この様に Controller というクラスを継承して作成されています。これでコントローラクラスは用意できました。あとはここに具体的な処理を追加していきます。

アクションを追加する

コントローラに処理を追加していきます。

コントローラに用意されている処理を「アクション」と呼びます。アクションは、コントローラに用意されている処理を行う為のもので、複数用意することができます。HelloController を以下の様に書き換えていきます。

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;

class HelloController extends Controller
{
    //
  public function index () {
    return <<<EOF
      <html>
      <head>
        <meta charset="utf-8" />
        <title>route</tiitle>
      </head>
      <body>
        <h1>コントローラのアクションです。</h1>
      </body>
      </html>
    EOF ;
  }
}

ここでは、HelloController クラスの中に「index」というメソッドを追加していきます。これがアクションとして使われるメソッドです。

アクションメソッドは、この index の様に引数を持たないメソッドとして用意されます。(ただし、必要に応じて引数を用意する場合もあります。)アクションメソッドでは、return で HTML のソースコードを返しています。この様に返された内容が、アクセスしたブラウザに返され、それが表示されることになります。

これでコントローラにアクションを用意することができましたが、これでは表示されません。アクションを使える様にするには、アクションにルートを割り当てる必要があります。

「routes」フォルダの web.php を開き、先に追加した内容を削除してください。そして改めて以下のスクリプトを追加します。

Route::get ("/hello", "HelloController@index") ;

Route::get を使ってルート情報を追加していきます。ここでは、第二引数には関数を使っていません。代わりに、”HelloController@index” というテキストが入っています。

コントローラを利用する場合は、この様に第二引数に「呼び出すコントローラアクション」を指定します。<コントローラ名@アクション名> という様な記述の仕方をします。これにより第一引数のアドレスにアクセスすると、第二引数に指定したコントローラアクションが実行される様になります。

ルート情報まで記述ができたら、Web ブラウザで /hello にアクセスしてみます。HelloController の index アクションで返した内容によって作成された Web ページが表示されます。

ルートパラメータの利用

HelloController を以下の様に記述し直してみます。

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;

class HelloController extends Controller
{
    //
  public function index ($msg = "no message") {
    return <<<EOF
      <html>
      <head>
        <meta charset="utf-8" />
        <title>route</tiitle>
      </head>
      <body>
        <h1>{$msg}</h1>
      </body>
      </html>
    EOF ;
  }
}

続いて、ルート情報の修正です。web.php を以下の様に書き直してみます。

Route::get ("/hello/{msg?}", "HelloController@index") ;

これで修正完了です。/hello/this_is_a_message という様に /hello の後に一つパラメータを追加してアクセスしてみますと、パラメータの値が表示されます。Route::get でルートパラメータを使ったときの無名関数の書き方と全く同じです。

シングルアクションコントローラ

一つのコントローラに一つのアクションだけしか用意しないという様な設計をすることがあります。この様な場合には、「シングルアクションコントローラ」としてクラスを用意します。

シングルアクションコントローラは、特別なクラスというわけではありません。一般的なアクションメソッドの代わりに、「__invoke」というメソッドを使って処置を実装します。

シングルアクションコントローラの基本形

class SingleActionController extends Controller
{
  public function __invoke () {
    ...アクション処理...
  }
}

これ以外にアクションメソッドは用意しません。メソッドは追加できますが、それらはアクションとしての利用はできません。シングルアクションコントローラとして作成されたコントローラは、ルート情報の設定も少し変わってきます。

Route::get ("/address", "SingleActionController") ;

この様に、コントローラ名だけを指定します。アクションの指定はしません。これにより、指定のアドレスにコントローラが割り当てられます。そしてそのアドレスにアクセスすると、クラスの __invoke アクションが呼び出されます。

リクエストとレスポンス

ここまで作成してきたアクションメソッドを見てみると、引数も特に用意されておらず、非常にあっさりとした構造でしたが、実際の Web アクセスというのは、内部で非常に多くの情報をやり取りしています。

クライアントからサーバーへアクセスをしたとき、クライアントから送られてきた情報は「リクエスト」として扱われます。そしてサーバーからクライアントへ返送する情報は「レスポンス」をして扱います。このリクエストとレスポンスをうまく扱うことが、Web サイトへのアクセス処理にはとてもお重要なことでした。

このリクエストとレスポンスの情報は、Laravel でも利用することができます。これは、Illuminate\Http 名前空間に用意されている「Request」「Response」というクラスとして用意されています。

これらのオブジェクトには、リクエスト、またはレスポンスに関する情報を保管するプロパティや、それらを操作する為のメソッドが用意されています。本格的な利用はもう少し Laravel を使いこなせる様になってから考えるとして、これらオブジェクトがどんなものかは押さえておきます。

Request および Response

では、実際に Request および Response オブジェクトを使ってみます。HelloController.php を以下の様に修正してください。

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request ;
use Illuminate\Http\Response ;

class HelloController extends Controller
{
    //
  public function __invoke (Request $request, Response $response) {
    $html = <<<EOF
      <html>
      <head>
        <title>Hello</title>
      </head>
      <body>
        <h3>Request</h3>
        <pre>{$request}</pre>
        <h3>Response</h3>
        <pre>{$response}</pre>
      </body>
      </html>
    EOF ;
    $response -> setContent ($html) ;
    return $response ;
  }
}

続いてルート情報の設定も変更していきます。web.php を以下の様に書き直していきます。

Route::get ("/hello", "HelloController") ;

これで、/hello にアクセスしたら HelloController の __invoke アクションが実行される様になりました。/hello にアクセスして正しく情報が表示されていることを確認してください。

アクションメソッドの引数定義

ここでは、まず Request と Response を利用する為、use 文を追記してあります。

use Illuminate\Http\Request ;
use Illuminate\Http\Response ;

Request はデフォルトで用意されていましたので、それに Response の use を追加しています。これで両方のクラスが利用できる様になりました。これらの利用は、アクションメソッドで行います。index をみると以下の様な形で定義されています。

public function __invoke (Request $request, Response $response) {...}

引数に、Request と Response が用意されているのがわかります。この様に、これらを引数に追加するだけでインスタンスが用意され、使える様になります。

Request および Response の主なメソッド

Request / Response の利用例として、いくつかのメソッドを紹介します。まず Request からです。

$request -> url () ;

url は、アクセスした URL を返します。ただし、クエリー文字列は省略されます。

$request -> fullUrl () ;

fullUrl は、アクセスした URL を完全な形で返します。

$request -> path () ;

path はドメイン以下のパス部分のみを返します。

続いて Response のメソッドです。こちらは、クライアントへ返送する際のステータスコード、表示コンテンツの設定などがあります。

$this -> status () ;

アクセスに関するステータスコードを返します。これは正常にアクセスが終了していたら 200 になります。

$this -> content () ;
$this -> setContent ($var) ;

コンテンツの取得・設定を行うものです。content はコンテンツを取得し、setContent は引数の値にコンテンツを変更します。

次回

  • ビュー
  • テンプレート

前回


林 裕大Hayashi Yuto
麻雀 / コーディング / 東方 / V-Tuber / 書道 /
  • CentOS
  • AmazonWebServices
  • SQLite
  • Docker
  • Python
  • Ruby
  • PHP
  • Laravel
  • WordPress
  • Nodejs
  • JavaScript
  • Sass
  • HTML5
  • Bootstrap
  • adobe Illustrator
  • adobe Photoshop
お問い合わせ

大変申し訳ありませんが、現在お問い合わせフォームは機能しておりません。お手数ですが、お問い合わせの際は、下記アドレスまでよろしくお願いいたします。

h3yukomah1y1k1m@gmail.com