「PHPフレームワークLaravel入門」の手引き

「PHPフレームワークLaravel入門 第2版」には多くのサンプルコードが示されています。ただ、バージョンの違い等から、そのままでは動作しないコードが多々あります。コードはお互いに関連しているので、一度つまづくとその先に進めなくなってしまいます。
本記事は、そのようなコードへの対応方法を示しました。
(付箋紙に書いたメモを転記しているため、記憶がほとんどないところもあります。多分、質問されても答えらえませんので、ご容赦下さい)

はじめに

用いた本は、掌田津耶乃著、PHPフレームワークLaravel入門 第2版、第1版第5刷です。
第2版なのになぜ第1版なのだろう?
それは置いておいて、僕のWindows PCにインストールしたLaravel(Artisan) Frameworkのバージョンは、11.21.0です。

Chapter 1の手引き

P.7 Composerについて

・ComposerをダウンロードするにはPHPがインストールされていることが必要
・XAMPPのPHPはスレッドセーフ

P.9 Installation Options

・Install for all users(recommended)を選ぶべき
→ Install for me onlyを選ぶと管理者権限でないためか、インストールできない

P.12 Laravelをインストールする

・gitがないと怒られる(git was not found in your PATH, shipping source download)
→ php.iniの「;extensions=zip」のセミコロンを取る

P.17 プロジェクトの作成

・「laravel new laravelapp」を打つといろいろ聞かれるが、全てEnterでなんとかなった

P.19 http://localhost:8000/

・そのままだとエラーが出る
→ php.iniの「;extension=pdo_sqlite」のセミコロンを外す
→ General errorが出るので、「php artisan migrate」を実行する

P.20 XAMPPにデプロイする

・XAMPPを「C:\Program files」にインストールするとウィルス対策ソフトが邪魔する
→ 「C:\XAMPTT」を作り、そこにインストールする

・「xampp_control.exe」を実行すると、443ポートが、あるプロセスによって使われているらしいので、コマンドプロンプトから「taskkill /pid PID番号 /f」でPIDを停止させて再実行する

・XAMPPのコントロールパネルで、Apachをスタートするとポート443、80が使われるので、「http://localhost/laravelapp/public」が実行できる

P.21 指定のアドレスで公開する

・「httpd.conf」は、「C:\XAMPP\apache\conf」にある

・エクスプローラで「C:\XAMPP\htdocs\laravelapp」を開いた状態で、アドレス欄に「cmd」と打って「Enter」
→ 現れたコマンドプロンプトに「php artisan serve」と打って「Enter」
→ そうすると、ChromeやEdgeから「http://localhost:8000/」で、Laravelが表示される

Chapter 2の手引き

P.34 1行目

・「先ほどのRoute::get分を削除」ではなく、「return」の中身を書き換える

P.43 リスト2-8~P.44 図2-17あたり

・/helloにアクセスすると、「Target class[○○○ Controller]does not exist」が表示される
→「routes\web.php」の2行目くらいに「use App\Http\Controllers\HelloController;」を追記する
→ リスト2-8の「Route::get(‘hello/index’, ’HelloController@index’]);」の代わりに、「Route::get(‘hello/index’, [HelloController::class, ‘index’]);」とする

P.50 リスト2-14

・リスト2-14の代わりに、「Route::get(‘hello’, HelloController::class);」とする

P.51Column l.4

・誤「マジックメソッドは、予め特別な役割を与えられているメソッドのことで、一般に半角マイナス2つで始まる名前をしています」
→正「マジックメソッドは、予め特別な役割を与えられているメソッドのことで、一般に半角アンダースコア2つで始まる名前をしています」

P.111 HelloMiddlewareを修正する

・「app」内の「Http」内にあるKernel.phpを開き・・・
→ このKernel.phpは、「bootstrap/app.php」に変更になった
→ app.phpの内容は以下の通り

<?php

use Illuminate\Foundation\Application;
use Illuminate\Foundation\Configuration\Exceptions;
use Illuminate\Foundation\Configuration\Middleware;
use App\Http\Middleware\HelloMiddleware;

return Application::configure(basePath: dirname(__DIR__))
    ->withRouting(
        web: __DIR__.'/../routes/web.php',
        commands: __DIR__.'/../routes/console.php',
        health: '/up',
    )
    ->withMiddleware(function (Middleware $middleware) {
        $middleware->appendToGroup('hello', [
            HelloMiddleware::class,
        ]);
    })
    ->withExceptions(function (Exceptions $exceptions) {
        //
    })->create();

P.123 リスト4-15

・下から4行目
・「$this->validate($request, $validate_rule);」のままだとエラーが出る
→ 「$validated = $request->validate($validate_rule);」に変更する

P.159 リスト4-34

・passesとmessageを合わせたvalidateメソッドで書き換えました
・具体的なコードは次の通りです

<?php
/* 4-34 */
namespace App\Rules;

use Closure;
use Illuminate\Contracts\Validation\ValidationRule;

class Myrule implements ValidationRule
{
    /**
     * Run the validation rule.
     *
     * @param  \Closure(string): \Illuminate\Translation\PotentiallyTranslatedString  $fail
     */

    public function validate(string $attribute, mixed $value, Closure $fail): void
    {
        if($value % $this->num != 0)
            { $fail($this->num . 'で割り切れる値が必要です。'); }
    }

    public function __construct($n)
    {
        $this->num = $n;
    }
}

P.162 $exceptに追記する

・読み進めていた時は、図4-21を見て「ValidateCsrfToken.php」が「app\Http\Middleware」フォルダにあると思っていて、それが見つからなかった
・そのため、次のURLを見て、「routes\web.php」を書き換えて対応した

Laravel 今更ながら(今後も見据えた) CSRF チェックの外し方

・ただ、今、ファイルを検索すると、「vendor\laravel\framework\src\Illuminate\Foundation\Http\Middleware」フォルダに「ValidateCsrfToken.php」がある。これを書き換えれば動作するかもしれない

P.165 リスト4-38下から9行目

・$this->…の行を次のように変更する
$validate = $request->validate($validate_rule);

P.183

・「sqlite3 database.sqlite」が効かなかった
→sqlite3をインストールていなかったし、Pathも切れていなかった
→対応方法をよく覚えていないが、sqlite3のサイトから「sqlite-tools-win-x64-3490100」をダウンロードして展開し、「c:」直下に「sqlite3」として置いた
→エクスプローラで「laravelapp\database」フォルダを開き、ファイル表示ウィンドにカーソルを置き、「cmd」と打つと、「laravelapp\database」フォルダでコマンドプロンプトが開く
→そこで、「c:\sqlite3\sqlite3 database.sqlite」と打ってdatabase.sqliteファイルを開いたような気がします。うろ覚えなので、正確ではないかもしれません

P.193 図5-21

・/helloにアクセスすると、「SQLSTATE[HY000]:Generalerror:|no such table :sessions(Connection:sqlite, SQL:select * from “sessions” where “id” = … limit1)」というエラーが出ます
→「.env」ファイルで「SESSION_DRIVER=database」が有効であることが原因
→「SESSION_DRIVER=file」とすれば動く

P.198 リスト5-10

・@マーク付近の書式が下記のように変わった

Route::get('hello/add', [HelloController::class, 'add']);
Route::post('hello/add', [HelloController::class, 'create']);

P.228 1行目

・touchは、Linuxのコマンドです。Windowsの場合は、
 copy nul database\database.sqlite
 又は、
 type nul > database\database.sqlite
 とする

P.239 リスト6-2 3行目

・「use App\Person;」では動かないので、
 「use App\Models\Person;」とする

P.241 リスト6-4

・次の1行も追記のこと
「use App\Http\Controllers\PersonController;」

P.259 リスト6-20

・次の1行を変更
変更前:$this->validate($request, Person::$rules);
変更後:$validate = $request->validate(Person::$rules);

P.273 リスト6-31

・リスト6-31には変更点が2か所ある

変更前1:use App\Board;
変更後1:use App\Models\Board;

変更前2:$this->validate($request, Board::$rules);
変更後2:$validate = $request->validate(Board::$rules);

P.276 リスト6-34

・次の1行を追記する必要がある
use App\Http\Controllers\BoardController;

P.278 リスト6-35

・次のように変更
変更前:return $this->hasOne(‘App\Board’);
変更後:return $this->hasOne(‘App\Models\Board’);

P.295 リスト7-3

・以下1行を追記する
use App\Models\Restdata;

P.299 リスト7-6

・以下を追記
use App\Http\Controllers\RestappController;
・次のように変更
変更前:Route::resource(‘rest’, ‘RestappController’);
変更後:Route::resource(‘rest’, RestappController::class);

P.299 リスト7-7

・次のように変更
変更前:use App\Restdata;
変更後:use App\Models\Restdata;

P.311 1行目

・僕の場合だけかもしれないが、php artisan session:tableを実行するとき、「migration」フォルダの下にあった「0001_01_01_000000_create_users_table.php」を別のフォルダに移さないと、「sessionあり」のエラーになった

P.312 phpコマンド

・既にsessionsテーブルが存在していたので、以下のphpコマンドは実行しなかった
php artisan migrate

P.127 リスト7-22

・次の1行を追加する
use App\Models\Person;

P.328 3行目

・user.phpがあるフォルダ名が違っている
誤:Laravelプロジェクトでは、「app」フォルダ内に「usr.php」という…
正:Laravelプロジェクトでは、「app\Models」フォルダ内に「usr.php」という…

P.331 認証ページ

・「登録」リンクをクリックするときに、P.327の「npm run dev」が実行状態でないと、「Internal Server Error」で、「Vite manifest not found」が出る

P.339 リスト7-37

内容がだいぶ違っているので、びっくりしないように

P.341 Windowsの場合

最近は、以下のコマンドに変更になった
php artisan test

p.344 リスト7-42

・リスト7-42には変更点が2か所ある

変更前1:use App\User;
変更後1:use App\Models\User;

変更前2:$user = factory(User::class)->create();
変更後2:$user = User::factory()->create();

まとめ

この記事を参照していただいた方々が、順調に読み終えられることを祈念しております。
続きものなので、一度分からなくなると先に進めなくなってしまいますが、本が高価なので、挫折して欲しくありません。

ちなみに、僕が全体を読み終えた感想を一言で述べると、「これだけ苦労して、できることはこれだけか」です。でも、これだけの知識を持つ著者の方はすごいなと思いました。

コメント

タイトルとURLをコピーしました