山傘のプログラミング勉強日記

プログラミングに関する日記とどうでもよい雑記からなるブログです。

Laravel 学習 Part. 4

PHP フレームワーク Laravel 入門

PHPフレームワーク Laravel入門 第2版

PHPフレームワーク Laravel入門 第2版

GitHub - YamaKasa3/laravelapp

パーフェクトPHPの8章はミニブログアプリケーションを作るというものでしたが、Laravelもブログ作れるよな?と思ったので、投げ出していたLaravelをやります。

レンタルサーバーにLaravelを導入してから作りたいものが思い浮かばず、それっきりとなっていたので実質初見です。

Chapter 1 Laravel を準備する

Composer を入れてLaravelを導入します。本ではLaravelのバージョンは5ですが、6でやろうと思います。本当は5でやった方がいいですが、多分投げ出すので問題ないです。

Laravelの公式にあるとおり、6系をインストールするには、

composer create-project --prefer-dist laravel/laravel blog "6.*"

とします。このとき、"blog" がフォルダ名になります。本ではxamppを進めていましたが、問題がでるまではphp artisan serveでもいいと思います。

ルート情報の追加

routes/web.php

下のアドレスにアクセスすると、web.phpに記述した'hello'ページが表示されます。

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

vscodeでweb.phpを開いたとき、Routeがundefinedとなったので、

PHP - php intelephense(VScode)でLaravelのコードがUndefined typeになる|teratail

を参考にしました。

ヒアドキュメントを使うと次のようになります。

// ヒアドキュメント
$html = <<<EOF
<html>
<head>
<title>Hello</title>
<style>
body { font-size:16px; color:#999; }
h1 { font-size:100px; text-align:right; color:#eee; margin:-40px 0px -50px 0px; }
</style>
<body>
    <h1>Hello</h1>
    <p>This is sample page.</p>
    <p>これは、サンプルで作ったページです。</p>
</body>
</html>
EOF;

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

useは無明関数で使われる構文です。

PHP: 無名関数 - Manual

URLにパラメータを含ませてアクセスすると次のようなことができます。

Route::get('hello/{msg}', function ($msg) {
    $html = <<< EOF
    <html>
    <head>
    <title>Hello</title>
    <style>
    body { font-size:16px; color:#999; }
    h1 { font-size:100px; text-align:right; color:#eee; margin:-40px 0px -50px 0px; }
    </style>
    <body>
        <h1>Hello</h1>
        <p>{$msg}</p>
        <p>これは、サンプルで作ったページです。</p>
    </body>
    </html>
EOF;

    return $html;

});

ヒアドキュメント内に変数が埋め込まれているので、パラーメータを渡してアクセスするとそのパラメータがmsgとなって表示されます。

コントローラ

app/Http/HelloController

Controllerを実装します。

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;

// 複数アクション利用
global $head, $style, $body, $end;
$head = '<html><head>';
$style = <<<EOF
<style>
body { font-size:16px; color:#999; }
h1 { font-size:100px; text-align:right; color:#eee; margin:-40px 0px -50px 0px; }
</style>
EOF;
$body = '</head></body>';
$end = '</body></html>';

function tag($tag, $txt) {
    return "<{$tag}>" . $txt . "</{$tag}>";
}

class HelloController extends Controller{
    public function index() {
        global $head, $style, $body, $end;

        $html = $head . tag('title', 'Hello/Index') . $style . $body . tag('h1', 'Index')
                . tag('p', 'This is Index page.') . '<a href="/hello/other">goto other page</a>'
                . $end;
        
        return $html;
    }

    public function other() {
        global $head, $style, $body, $end;

        $html = $head . tag('title', 'Hello/Other') . $style . $body . tag('h1', 'Other')
        . tag('p', 'This is Other page.') . $end;

        return $html;
    }
}

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

__invoke() メソッドにすることでシングルアクションコントローラになります。

Request Response

クライアントとサーバ間のやりとりを利用します。