ルーティング

ルーティング

特定のアドレスにアクセスしたとき、どの処理を呼び出して実行するか。

それを管理するのが「ルーティング」です。

「app」フォルダ

Laravelに用意されているフォルダの中で、最も重要で利用頻度が高い。

「app」フォルダは、Laravelアプリケーションの「アプリケーション」部分のプログラムが配置される。「app」フォルダを開いてみると、いくものファルダがある。

図「app」ファルダ

f:id:mkyosuke:20200106145437p:plain

■Console

コンソールプログラムを配置

■Exceptions

例外に関する処理を配置

■Http

Webアプリケーションにアクセスしたときの処理をまとめておくところ。

アプリケーションの基本的なプログラムはここに作成。

■Providers

プロバイダと呼ばれるプログラムを配置

■User.php

ユーザー認証に関するスクリプト。使うことはない。

最も重要なのは、「Http」というフォルダ。

この中に、アプリケーションの基本的なプログラムとなるものが作成される。

それ以外は、「必要に応じて利用」といった感じ。

 

ルーティングと「routes」フォルダ

一般的なWebサイトは、Webサーバーの公開ファルダの中にファイルを用意しておくと、ファイルにアクセス可。

(例)

「Webapp」というフォルダに「sample.html」を用意。

http://〇〇/webapp/sample.htmlにアクセスすると自動的にファイルが読まれ、表示。

 

Laravelは特定のアドレスにアクセスすると、そのアドレスに割り付けられたプログラムが実行。それによって必要な処理や画面表示が作られる。

 

「〇〇というアドレスにアクセスをしたら、✕✕という処理を呼び出す」という関連付けを行っているのが

「ルーティング」という機能。

ルーティングは、アクセスを設定している情報を管理する機能。

 

特定のアドレスにアクセスすると、それに対応する処理が呼び出される。その関連付けを行っているのが「ルーティング」

f:id:mkyosuke:20200106161439p:plain

 

「routes」フォルダ

 ルーティングに関する情報をまとめているのが、「routes」フォルダ。

この中には、デフォルトでいくつかのスクリプトファイルが用意されている。

f:id:mkyosuke:20200106161756p:plain

api.php

APIのルーティング。ユーザー認証などで、プログラム内から利用するAPIの機能を特定のアドレスに割り当てるのに利用。

■channels.php

ブロードキャストチャンネルのためのルーティング

■console.php

コンソールプログラムのためのルーティング

■web.php

一般的なWebページとしてアクセスするためのルーティング

 

基本的に、Webページとして公開するものは全てWeb.phpにルート情報を記述する、

と考える。それ以外のファイルは基本使用しない。

 

ルート情報の記述

 web.phpスクリプト

 

<?php

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

■ルート情報の基本(GETアクセス)

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

GETアクセスのルート情報は、Routeクラスの「get」という静的メソッドを使って設定。

第一引数に割り当てるアドレス、第二引数にはアドレスによって呼び出される処理を用意。

第二引数は関数を指定することもあるし、「コントローラ」と呼ばれるものを指定することもある。

getメソッドでアドレスと処理を割り当てる。

 

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

 デフォルトで用意されているトップページのルート情報。

第一引数に「'/'」というトップページを示すアドレス。

第二引数に関数を指定。

Route::get('/', function () {

関数は以下のようになっている。

function(){

              return 値;

}

引数なしのクロージャ(無名関数)。returnで戻り値を指定。returnで返される値が、そのアドレスにアクセスした際に表示される。

ここでは、「view」という関数を使って戻り値を用意。

view(テンプレート名)

このviewは、指定したテンプレートファイルをロードし、レンダリングして返す。

viewで引数にテンプレート指定すると、レンダリングされて返され、プラウザに表示。

 

f:id:mkyosuke:20200106174611p:plain

 

 welcomeテンプレートについて

 returnで返しているのは、view('welcome')という関数の戻り値。

これで、welcome.blade.phpというテンプレートファイルをレンダリングして表示。

welcome.blade.phpというテンプレートファイルは

「resources」フォルダ内の「views」フォルダの中に用意されている。

f:id:mkyosuke:20200106175156p:plain

 

 welcome.blade.php

 

<!DOCTYPE html>
<html lang="{{ str_replace('_', '-', app()->getLocale()) }}">
    <head>
        <meta charset="utf-8">
        <meta name="viewport" content="width=device-width, initial-scale=1">

        <title>Laravel</title>

        <!-- Fonts -->
        <link 省略>

        <!-- Styles -->
        <style>
            省略
        </style>
    </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>

                        @if (Route::has('register'))
                            <a href="{{ route('register') }}">Register</a>
                        @endif
                    @endauth
                </div>
            @endif

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

                <div class="links">
                    <a href="https://laravel.com/docs">Docs</a>
                    <a href="https://laracasts.com">Laracasts</a>
                    <a href="https://laravel-news.com">News</a>
                    <a href="https://blog.laravel.com">Blog</a>
                    <a href="https://nova.laravel.com">Nova</a>
                    <a href="https://forge.laravel.com">Forge</a>
                    <a href="https://github.com/laravel/laravel">GitHub</a>
                </div>
            </div>
        </div>
    </body>
</html>

基本的にHTMLで書かれている。
@で始まる文は、HTMLではなくPHPでもない。
これは、「Blade」という、Laravelに組み込まれているテンプレートエンジンを使って書かれたソースコード
Laravelでは、PHPをそのまま使ってWebページの表示を作成することもできるが、Bladeテンプレートエンジンを使う方が多い。
ここでは、「vies」フォルダの中にテンプレートファイルが用意され、view関数で読み込んで表示している
 
ルート情報を追加する

 「routes」フォルダ内のWeb.phpテキストエディタで開き編集。

一般的なWebページへのアクセスは、この中にルート情報を記述。

以下を追記

<?php

Route::get('hello'function () {
    return '<html><body><h1>Hello</h1><p>sample</p></body></html>';
});
記述後、以下のアドレスにアクセス

f:id:mkyosuke:20200107113100p:plain

Webブラウザでアクセスすると、「Hello」と表示される。
これが、追加したルート情報による表示。
 
HTMLを出力する

 ここでは、Route::getの第2引数に以下のような関数を用意

function () {
    return '----htmlのソースコード----';
});
returnで、HTMLのソースコードを直接返すことで、そのソースコードがそのままWebブラウザへ送られていることがわかる。テンプレートを使わず、テキストで出力内容を作成してそのまま送信するなら簡単。
 
ヒアドキュメントを使う

 ヒアドキュメントというのは、PHPで長文テキストを記述するのにつかわれる。

<<<演算子を使い、リスト内に記述されたテキストをまとめて変数などに代入できます。

長い文字列を変数に代入する場合は以下のような書式で記述

<?php
$変数 = <<<終了の文字列

「文字列を記述」

終了の文字列;
?>

※ 終了の文字列には大文字のアルファベットを使う。よく見かけるのは「EOM」「EOF」「EOD」ですが、「ABC」でも何でも構わない。
ちなみに「EOM」は End Of Message、「EOF」は End Of File、「EOD」は End Of Document の略。

 

先ほどのRoute::get文を削除し、以下のリストを追記

<?php

 
$html = <<<EOF
<html>
<head>
<title>Hello</title>
</head>
<body>
<h1>hello</h1>
<p>sample page</p>
</body>
</html>
EOF;

Route::get('hello'function () use ($html) {
    return $html;
});

 /helloにアクセス

f:id:mkyosuke:20200107132611p:plain

ヒアドキュメントなどを利用してHTMLのソースコードを用意して入れば、Route::getだけである程度作り込んだWebページを表示させることができる。

今回はこういうことができることであり、本格的には別の方法が用意される。

Route::getの働きとして、「HTMLコードをreturnする関数を用意すればWebページが表示される」という仕組み。

 

ルートパラメータの利用

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

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

 

第1引数のアドレス部分に、{パラメータ}という形でバラメータを用意。

第2引数の関数では、パラメータの値を受け取る変数を引数として用意。

パラメータ名と同じ名前である必要なし。

{パラメータ}で指定したパラメータの値は、そのまま関数の引数に渡される。

パラメータは複数用意可能。関数の引数を複数用意することで、これらの値を受け取る。

 

f:id:mkyosuke:20200107135125p:plain

 

パラメータを利用する

 実際にルートパラメータを利用。先程追加したリスト部分を以下のように編集。

<?php

 
Route::get('hello/{msg}',function ($msg){

$html = <<<EOF
<html>
<head>
<title>Hello</title>
</head>
<body>
<h1>hello</h1>
<p>{$msg}</p>
</body>
</html>
EOF;

    return $html;
});

 今回は、ヒアドキュメント内に変数を埋め込んで利用するため、

Route::getの第2引数に用意するクロージャ(無名関数)内にヒアドキュメントを移動。

修正完了後、/hello/のアドレスの後にテキストを追記してアクセス。

http://127.0.0.1:10080/hello/sample

 とアクセスすると、「sample」の部分がパラメータとして取り出され、Webページにメッセージとして表示される。

f:id:mkyosuke:20200107141306p:plain



Route::getのパラメータについて

 ここでは、Route::getメソッドの引数を以下のようにしている。

第1引数 'hello/{msg}'

第2引数 function($msg){....}

第1引数では、hello/の後に{msg}というパラメータを用意。

第2引数では、クロージャの引数に$msgというパラメータを用意。

これに、{msg}の値が$msg引数に渡される。

 

複数のパラメータになっても同じ。

(例)

Route::get('hello/{id}/{pass}',function ($id,$pass){....省略....});

上記のようならば、$idと$passという2つのパラメータ引数を利用できる。

 

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

 今までのパラメータは、基本的に「必須パラメータであり、パラメータを指定せずにアクセスするとエラーになる。

 http://127.0.0.1:10080/hello/

f:id:mkyosuke:20200107144430p:plain

 しかし、パラメータを付けなくてもアクセスできる。

それには、「任意パラメータ」を使う。

任意パラメータは「任意に付けて利用できるパラメータ」。

これは、パラメータ名の末尾に「?」を付けて宣言。第2引数の関数では、値が渡される仮引数にデフォルト値にを指定し、引数が渡されなくとも処理できるようにしておく。

 

先程の記述したRoute::getの行を以下のように編集

Route::get('hello/{msg?}',function ($msg='no message.'){

これで、msgパラメータは任意パラメータとなる。

パラメータを付けずにアクセス。メッセージとして「no message」と表示。

f:id:mkyosuke:20200107145557p:plain