11
17

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

Laravel基礎(2)コントローラー

Last updated at Posted at 2018-10-14

#コントローラー
コントローラーとは、ブラウザの要求と、ビュー(Bladeのテンプレートファイル)の間の橋渡し的存在のPHPクラスです。
コマンドで作ります。最後のコントローラー名PageControllerは自由ですが、なるべくリソース(目的のサービスで扱うモノ。User,Item,Book,Storeなど)名称に後ろにControllerはつけたほうがクラス名として分かりやすくなります。
今の場合は、ページを司どるので、PageControllerにしました。

php artisan make:controller PageController

app/Http/Controllers/PageController.phpができました。

コントローラーは最初は空ですので、メソッドを書いていきます。
メソッドがコントローラーに対してやるべきアクションとなります。

例えば、

app/Http/Controllers/PageController.php
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;

class PageController extends Controller
{
    //
    public function index() {
        return <<<EOF
<html>
<body>
Demoデモ
</body>
</html>
EOF;
    }
}

index()は簡単なHTMLをヒアドキュメントで文字列として返すだけです。
ルーティング情報はコントローラークラス@メソッドとして定義します。

routes/web.php
Route::get('/','PageController@index');

これでサーバを動かしてみましょう。ブラウザでみると「Demoデモ」という文字がページに表示されたと思います。

そのページにGETパラメータを渡してみましょう。

ルーティング定義でパスの一部からパラメータを受け取るように変更します。

routes/web.php
Route::get('/{str}','PageController@index');

コントローラーのアクションメソッドでその引数を受け取ります。

app/Http/Controllers/PageController.php
<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;

class PageController extends Controller
{
    //
    public function index($str) {
        return <<<EOF
<html>
<body>
Demoデモ:{$str}
</body>
</html>
EOF;
    }
}

サーバを起動し、http://[servername]/a/アイウエオというアドレスでブラウザで確認すると、画面の「Demoデモ」という文字の次にアイウエオと表示されたと思います。

#リクエストとレスポンス

Webアプリケーションではブラウザからサーバに対し「要求」することがリクエスト、その要求に対しサーバがブラウザに結果を返す(「応答」する)ことをレスポンスと呼びます。

これはLaravelに限ったことではなく、全てのWebアプリがそういう通信形態です。

コントローラーでuse Illuminate\Http\Response;を書いてレスポンスクラスを使えるようにし、次のようにrequest/responseの内容を表示させてみましょう。

app/Http/Controllers/PageController.php

<?php

namespace App\Http\Controllers;

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

class PageController extends Controller
{
    //
    public function index($str, Request $request, Response $response) {
        return <<<EOF
<html>
<body>
Demoデモ:{$str}
<br><br>
<b>Request:</b><br>
<pre>{$request}</pre>
<b>Response:</b><br>
<pre>{$response}</pre>
</body>
</html>
EOF;
    }
}

この結果をブラウザで見ると、リクエストの情報とそのレスポンスの情報が確認できると思います。これらの情報がブラウザとサーバ間でやりとりされているのです。
Laravelで興味深いのは、メソッドの引数に受け取りたい型と変数名を一緒に書いておくと注入(DI)してくることです。

#ビューの置き場所

resources/viewsフォルダの下がビューの置き場所ですが、ここはコントローラーごとにフォルダを作ってその中にアクションで使用するBladeファイルを作るのが分かりやすいです。

例えば、前述のコントローラーPageControllerではpageという名前のフォルダを
resources/viewsの下に作りそのpageフォルダの下にindexアクションのためのindex.blade.phpをおきます。

mkdir resources/views/page
resources/views/page/index.blade.php
<!doctype html>
<html lang="{{ app()->getLocale() }}">
    <head>
        <meta charset="utf-8">
        <meta name="viewport" content="width=device-width, initial-scale=1">
        <title>Laravel DemoApp</title>
    </head>
    <body>
        <h1>Page : index</h1>{{$str}}<br>
        <br>
        <b>Request:</b><br>
        <pre>{{$request}}</pre>
        <b>Response:</b><br>
        <pre>{{$response}}</pre>
    </body>
</html>

ルーティングは前述と同じように記述します。

routes/web.php
Route::get('/','PageController@index');

コントローラーでは、

app/Http/Controllers/PageController.php
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use Illuminate\Http\Response;
class PageController extends Controller
{
    public function index($str, Request $request, Response $response) {
        return view('page.index',compact('str','request','response'));
    }
}

コントローラのindexメソッドがview関数でBladeファイルを呼ぶときに、フォルダで切った構成page/index.blade.php が 'page.index' という指定に対応つけられます。

#フォーム送信

次はPOST送信でフォームからの情報を受け取ってみましょう。まず/pageのパスがPOST処理を受け付けるようにルーティングを定義します。

routes/web.php
Route::get('/','PageController@index');//前述の内容
Route::post('/page','PageController@post');

index.blade.phpにフォーム画面を書きます。
csrf_fieldは、Laravelの機能でトークンを設定して正当な送信しか受け付けないようにするセキュリティ上の仕掛けです。

resources/views/page/index.blade.php
ーーー(一部抜粋)ーーー
<form method="POST" action="/page">
{{csrf_field()}}
TITLE:  <input type="text" name="title"><br>
BODY:   <input type="text" name="body">
<input type="submit">
</form>

POSTで受け取った内容を画面出すために新たにpost.blade.php作ります。

resources/views/page/post.blade.php

<html>
TITLE:{{$title}}<br>
BODY:{{$body}}<br>
</html>

コントローラーを書きます。

app/Http/Controllers/PageController.php

<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use Illuminate\Http\Response;
class PageController extends Controller
{
    public function index($str, Request $request, Response $response) {
        return view('page.index',compact('str','request','response'));
    }
    public function post(Request $request) {
        return view('page.post',['title' => $request->title, 'body' => $request->body]);
    }
}

今までcompactで渡していたパラメータは実はハッシュだということがここで分かると思います。
ちなみにcompactは便利な関数で、同スコープの変数をPHP内部の変数テーブルから参照して変数名と変数値をキーと値とするハッシュに変換します。

<?php
$k1 = 'abc';
$k2 = 'xyz';
$h = compact('k1','k2');
var_dump($h);// => ['k1' => 'abc','k2' => 'xyz'] 
?>

ここでサーバを起動し、http://[servername]/というアドレスでブラウザで確認してみましょう。
フォーム画面で適当に入力し送信すると、その入力情報が次の画面に表示されたと思います。

以上はPOSTの例ですが、GETパラメータでも同じです。

例えば次のようなアドレスでGET渡しで年、月をコントローラーに渡すとき、
http://[servername]/hoge?year=2018&month=10

ルーティングは次のように書きます。(ここではyearやmonthは出てきません)

routes/web.php
Route::get('/hoge', 'HogeController@index');

HogeControllerクラスのindexメソッドは次のように書けば$requestオブジェクトからyearやmonthを受け取れます。

public function index(Request $request)
{
  $year = $request->year;
  $month = $request->month;
}

Laravel基礎(3)バリデーション>>

11
17
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
11
17

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?