こんにちは、ブログ管理人のtetsuです。
プログミング初心者ですが、情報共有や学習記録として記事を書いてみます。お手柔らかにお願いします。
今回は「PHPフレームワークLaravel入門(第2版)」という書籍をLaravel最新バージョンの8.xで勉強した記録です。
この記事は2020年12月に勉強したときの内容です。
勉強したときにエラーが出たポイントを書いているだけなので、細かい学習内容は書籍を購入してご確認ください。
【タイトル】PHPフレームワークLaravel入門(第2版)
【著者】掌田 津耶乃
【初版発行】2020年1月
PHPフレームワークであるLaravelの入門書です。
この書籍の対象者は、PHP・HTML/CSS・Linuxコマンドの基礎を勉強済み方だと思います。
ネットで検索すると「青本」とも呼ばれていて、Laravel教材としては人気があるようです。
この書籍はLaravel6.0を前提とされていますが、2020年12月での最新バージョンはLaravel8です。
最新バージョンだと、純粋に書籍の通りに学習を進めることが出来ず、自分でLaravel8の情報を調べながら進める必要がありました。
なお、私が使用したパソコンとPHPのバージョンは次の通りです。
MacOS
PHP 7.3.11
ここからは青本の話ですが、Laravel利用の準備で私がダウンロードしたComposerファイルは2.0.8(2020-12-03)というもの。
次に、Laravelをインストールすることになります。
書籍の通りに進めると最新版がインストールされ、私は次のバージョンを使用することになりました。
Laravel Framework 8.18.1
なお、書籍はLaravel6.0を前提(Laravel7.8でも動作確認済)とされているため、バージョンを指定してインストールするのも良いかもしれません。
Laravelのインストールが終わると、Laravelアプリケーションのトップベージの表示確認をしますが、Laravel8では書籍とは違う次の画面が表示されました。
次に、XAMPPにデプロイすることになります。
私は他の書籍でXAMPPを使用したことがありましたが、今回はエラーを解決することができなかったためXAMPPは使いませんでした。
よって、今回はXAMPPの代わりにMAMPというものを使用することにしました。
インターネットで「MAMP」と検索すると次のようなHPがあります。
ここでは詳しいダウンロード手順は省きますが、基本的にFreeDownloadからどんどん次に進んでいけばOKでした。なお、MAMPとMAMP PROの2つがインストールされますが、使用するのはMAMPの方です。
起動すると右上に電源ボタンがあり、これを押すことで使えるようになります。
更に、書籍で説明されているXAMPPの環境に近づけるために左上の歯車のボタンから少し設定を変えました。
まず、Portsの右下にある「80&3306」というボタンを押します。
次に、Serverの右下にある「Choose…」ボタンを押して、Document root:を初期設定より更にlaravelappのpublicまで指定します。
これでOKを押して設定完了です。
ここからは実際にコードを打ちはじめてエラーが出たポイントです。
P43のルート情報の用意でリスト2-8は次の通りですが、これではエラーになりました。
Route::get('hello', 'HelloController@index');
Laravel8では次のように入力する必要があるようです。
use App\Http\Controllers\HelloController;
Route::get('hello', [HelloController::class, 'index']);
この記述は書籍を進める上で何度も出てきますが、特にP241のリスト6-4、P276のリスト6-34で要注意です。
P50のシングルアクションコントローラのルート情報についても
リスト2-14は次のようになっていますが、これではエラーになりました。
Route::get('hello','HelloController');
Laravel8では次のように入力する必要があるようです。
use App\Http\Controllers\HelloController;
Route::get('hello', HelloController::class);
P299のリスト7-6でも要注意です。
ちなみに、P49でHelloControllerに「__invoke()」というメゾットを入力する際はアンダーバーを2回入力していることに気をつけましょう。
P238に「app」フォルダの中に「Person.php」というファイルが作成されると書かれていますが、Laravel8では「app」フォルダの中の「Models」フォルダの中に「Person.php」ファイルが作成されていました。
よって、P239のリスト6-2の中に次のようなコードがありますが、これではエラーになります。
use App\Person;
次のように\Modelsを追記することで正常に動作します。
use App\Models\Person;
P273のリスト6-31、P295のリスト7-3、P299のリスト7-7、P313のリスト7-20、P344のリスト7-42、P346のリスト7-43でも同じように\Modelsの追記が必要になります。
P242でPersonクラスにリスト6-5を追記してくださいとありますが、これは先程の「Person.php」に追記するという意味です。
このように初心者には分かりにく指示がたまにありましたが、前の処理の流れからだいたい予想できるので大丈夫です。
P278のリスト6-35には次のコードが記載されていますが、Laravel8ではエラーになります。
return $this->hasOne('App\Board');
ここでも\Modelsを追記する必要があります。
return $this->hasOne('App\Models\Board');
P283のリスト6-39でも同じように\Modelsの追記が必要になります。
P320のpaginateメソッドの利用でリスト7-24通りに入力すると、ブラウザでの表示が崩れていました。
これを解決するためにapp/Providers/AppServiceProvider.phpを開きます。
そして、次の2つを入力します。
use Illuminate\Pagination\Paginator; //←1つ目
public function boot()
{
//
Paginator::useBootstrap(); //←2つ目
}
これで崩れずに表示されます。
P328のUserモデルクラスについてで、「app」フォルダ内に「user.php」が保存されていると書かれていますが、Laravel8では「app」フォルダ内の「Models」フォルダの中に「user.php」が保存されていました。
ここから先にはユニットテストについてです。
Laravel8での情報をかなり調べたのですが、ここからは特に私が出した答えが正しいという確信はありません。一旦学習を進めることを優先し、テストについてはまた自分でも調べますが、もし分かる方がいたらコメントやメッセージをいただけると嬉しいです。
私のように途中で諦めたくないけど先に進めず悩んでいる方のために一応ご紹介しますが、もし間違えていたらすみません。
ちなみに色々調べた中ではUdemyの「Larvel テスト実践入門! ~ Laravel8 で始めるTDDテスト入門講座 ~」のプレビュー動画に助けられて、諦めずに先に進むことは出来ました。講師の白岩さんに感謝です。
P338のリスト7-36でphpunit.xmlに次のタグを入力するように書かれています。
<env name="DB_DATABASE" value="database\database_test.sqlite"/>
が、既に次のようなコメントがあります。
<!-- <server name="DB_CONNECTION" value="sqlite"/> -->
<!-- <server name="DB_DATABASE" value=":memory:"/> -->
今回はこのコメントを次のように書き換えました。
<server name="DB_CONNECTION" value="sqlite"/>
<server name="DB_DATABASE" value="database_test.sqlite"/>
リスト7-36とvalueの書き方も少し変えています。
P339のダミーレコードの用意について、「UserFactory.phpファイルにリスト7-37のようなスクリプトが用意されている」と書かれていますが、Laravel8からはFactoryの構造がfunctionを使う形からクラスベースになっているためリスト7-37とは別物でした。
ちなみにLaravel8でUserFactory.phpファイルを開くとこのようになっていました。
<?php
namespace Database\Factories;
use App\Models\User;
use Illuminate\Database\Eloquent\Factories\Factory;
use Illuminate\Support\Str;
class UserFactory extends Factory
{
/**
* The name of the factory's corresponding model.
*
* @var string
*/
protected $model = User::class;
/**
* Define the model's default state.
*
* @return array
*/
public function definition()
{
return [
'name' => $this->faker->name,
'email' => $this->faker->unique()->safeEmail,
'email_verified_at' => now(),
'password' => '$2y$10$92IXUNpkjO0rOQ5byMi.Ye4oKoEa3Ro9llC/.og/at2.uheWG/igi', // password
'remember_token' => Str::random(10),
];
}
}
そして、書籍ではP340にて「Personモデルも利用するためUserFactory.phpにリスト7-38を追記してください」という指示がありますが、UserFactory.phpには何も追記せずにそのまま。
代わりに、ターミナルで次のコマンドを入力してPersonFactory.phpを作成。
php artisan make:factory PersonFactory --model=Person
database\factoriesにPersonFactory.phpファイルができます。
PersonFactory.phpファイルを開くとこのようになっています。
<?php
namespace Database\Factories;
use App\Models\Person;
use Illuminate\Database\Eloquent\Factories\Factory;
class PersonFactory extends Factory
{
/**
* The name of the factory's corresponding model.
*
* @var string
*/
protected $model = Person::class;
/**
* Define the model's default state.
*
* @return array
*/
public function definition()
{
return [
//
];
}
}
ここでリスト7-38でreturnとなっている配列を、PersonFactory.phpにreturnとして追記しました。
public function definition()
{
return [
'name' => $this->faker->name,
'mail' => $this->faker->safeEmail,
'age' => random_int(1,99),
];
}
Laravel8だとリスト7-38とは書き方が少し違うことに気をつけてください。
P344のWebページにアクセスするでHelloTest.phpをリスト7-42通りに修正して「vendor/bin/phpunit」コマンドを実行すると、エラーが出たのでHelloTest.phpを次のように書き直しました。
<?php
namespace Tests\Feature;
use Illuminate\Foundation\Testing\RefreshDatabase;
use Illuminate\Foundation\Testing\WithFaker;
use Tests\TestCase;
use App\Models\User;
use Illuminate\Foundation\Testing\DatabaseMigrations; //←追記
class HelloTest extends TestCase
{
/**
* A basic feature test example.
*
* @return void
*/
use DatabaseMigrations;
public function testHello()
{
$this->assertTrue(true);
$response = $this->get('/');
$response->assertStatus(200);
$response = $this->get('/hello');
$response->assertStatus(302);
$user = User::factory()->create(); //←修正
$response = $this->actingAs($user)->get('/hello');
$response->assertStatus(200);
$response = $this->get('/no_route');
$response->assertStatus(404);
}
}
更に、tests/FeatureにあるExampleTest.phpも次のように追記しときました。
<?php
namespace Tests\Feature;
use Illuminate\Foundation\Testing\RefreshDatabase;
use Tests\TestCase;
class ExampleTest extends TestCase
{
use RefreshDatabase; //←追記
/**
* A basic test example.
*
* @return void
*/
public function testBasicTest()
{
$response = $this->get('/');
$response->assertStatus(200);
}
}
これでエラーなくテストを通過しました。
P346のデータベースをテストするでHelloTest.phpをリスト7-43の通りに修正して「vendor/bin/phpunit」コマンドを実行すると、エラーが出たのでHelloTest.phpを次のように書き直しました。
<?php
namespace Tests\Feature;
use Illuminate\Foundation\Testing\RefreshDatabase;
use Illuminate\Foundation\Testing\WithFaker;
use Tests\TestCase;
use App\Models\User;
use App\Models\Person;
use Illuminate\Foundation\Testing\DatabaseMigrations;
class HelloTest extends TestCase
{
/**
* A basic feature test example.
*
* @return void
*/
use DatabaseMigrations;
public function testHello()
{
//ダミーで利用するデータ
User::factory()->create([ //←修正
'name' => 'AAA',
'email' => 'BBB@CCC.COM',
'password' => 'ABCABC',
]);
User::factory(10)->create(); //←修正
$this->assertDatabaseHas('users',[
'name' => 'AAA',
'email' => 'BBB@CCC.COM',
'password' => 'ABCABC',
]);
//ダミーで利用するデータ
Person::factory()->create([ //←修正
'name' => 'XXX',
'mail' => 'YYY@ZZZ.COM',
'age' => '123',
]);
Person::factory(10)->create(); //←修正
$this->assertDatabaseHas('people',[
'name' => 'XXX',
'mail' => 'YYY@ZZZ.COM',
'age' => '123',
]);
}
}
これでエラーなくテストを通過しました。
ちなみに「vendor/bin/phpunit」コマンドの代わりに「php artisan test」コマンドでもテストを実行することができます。詳細な情報が表示されるようになるためエラーがどこで出たのかも分かりやすかったです。
青本についてはここまでです。
一度勉強しただけでは理解どころか覚えきれていないことも多いと感じました。この先、青本の内容を確認する際はこの記事を参考にしたいと思います。
私と同じように青本で勉強する初心者の役に立てれば嬉しいです。
※プログラミングスクールという近道
人によってはプログラミングスクールで学んだ方が早いかもです。
TechAcademyならPHP/LaravelコースというピンポイントでLaravelを学べるコースもあります。
気になる方は無料体験や無料キャリアカウンセリングも受けることができます。
>> TechAcademyの無料体験はこちら
今回は以上です。
コメント