- 投稿日:2020-10-18T20:02:47+09:00
エラーバンドリングの表示
【概要】
1.結論
2.どのようにコーディングするか
3.開発環境
補足
1.結論
@if (count($errors) > 0) と、@foreachを使用する!
2.どのようにコーディングするか
@if や @foreach の使い方は自分のこちらの記事にて説明しているので、よかったらご覧ください!
blade構文resorces/views/hoge/index.blade.php<p>{{$msg}}</p> @if (count($errors) > 0) <div> <ul> @foreach ($errors->all() as $error) <li>{{$error}}</li> @endforeach </ul> </div> @endifエラーメッセージあれば、そのエラーの全てをそれぞれ取り出すようにしています。そしてそれを変数を用いて表示しています。
ただ、バリデーションがかかっていることが前提なので下記のようにコーディングしています。
app/Http/Controllers/HogeController.phpclass HogeController extends Controller { public function index(Request $request) { return view('hoge.index', ['msg'=>'入力してください:']); } public function post(Request $request) { $validate_rule = [ 'name' => 'required' , 'mail' => 'email' , 'age' => 'numeric|between:0,150' , ]; $this->validate($request , $validate_rule); return view('hoge.index' , ['msg'=>'正しく入力してください']); } }
3.開発環境
Mac catalina 10.15.4
Vscode
PHP 7.4.10
Laravel 8.9.0
Apache 2.4.41
補足
エラーバンドリングを表示させるということは2.のあとにform要素を付け加えると思います。その際に@csrfの記載を忘れないでください。セキュリティ対策になります。
- 投稿日:2020-10-18T19:28:28+09:00
LaradockをベースにしたLaravelのボイラープレートを作りました!
自己紹介
皆さん、はじめまして!
記事の内容に入る前に、簡単な挨拶を。人生初の記事投稿です。
これまでは気が向いた時に勉強して自己満足してたのですが
これからは、学習した内容とか日々の気付きなどを、せっかくなのでアウトプットしていけたらと思います!(メモとしても)
至らない点もあるかと思いますが、よろしくお願いします!※2020/10/19 追記
記事を投稿して早々、GitHubにTemplateRepositoryというオプションがあることに気づいたので、そちらのやり方で使用方法の項目を修正しました。概要
Laradockをベースにした、Laravelのボイラープレートを作ったので、
それの紹介と簡単なイントロダクションをします。ボイラープレートだけ欲しい方は、下記のリンクからどうぞ!
https://github.com/ryuyaF/LaravelBoilerplateOfLaradockなぜ作ったのか
前から気になっていたLaradockを触ってみた際に、結構使い勝手が良かったのと
勉強も兼ねて、自前のLaravelのボイラープレートを作ってみたいな〜と思っていたからです。自前のボイラープレートっておいしいの?
Laradockのボイラープレート自体は、探せばいくらでも有用なものがあるので、ぶっちゃけ作る意味はそこまでないです。
ですが、今回自前で用意したメリットとしては、下記のようなものがあるかなと思います。Laradockのインストール方法をいつまでも覚えていられない
Laradockに限った話ではないですが、
私の場合はプロジェクトを作る際、大抵は作り方がうろ覚えです。なんとなくの流れを覚えている程度です。
その度に、公式ページを見て、細かい設定方法やルールを確認し、作ってもいいのですが、、、面倒ですよね。
作りたい時にパッと用意する。
そういう点に魅力を感じる方にはおすすめです。好みの構成に出来る
自分好みって良いですよね。作業しやすいです。
簡単なイントロダクション
ディレクトリ構成と解説
YourProjectName/ └App/ └data/ └laradock/ ※サブモジュール └env-example ※laradockのenv-example
- App
- Laravelのインストールディレクトリ
- data
- mysqlのdataディレクトリ
DATA_PATH_HOST=../data
- 初期設定では、laradockディレクトリの直上(=プロジェクトディレクトリの直下)に設定されている
- ※Volumeディレクトリを変えたい場合は、
laradock/.env
のDATA_PATH_HOST
を変更する- laradock
- Laradockリポジトリのこの時点のコミットがサブモジュール化されている
- 必要があれば、適宜Updateしていく
- env-exampleファイル
- サブモジュールは特定コミットをCloneする
- laradockのenvファイル共通化のため、カスタマイズされたものを配置している
使用方法
- リポジトリにアクセス
Use This Template
をクリック- 必要な情報を入力して
Create repository from template
をクリック- ちょっと待つと、リポジトリが作成される ↓
- あとは、CloneするところからREADMEの流れに沿って作業すれば完了
こだわりポイント
Laradockリポジトリをサブモジュール化
Laradockを単にCloneしたものをリポジトリに含めるのではなく、サブモジュールとしてリポジトリに定義しました。
それによって、Laradockリポジトリの更新が反映しやすくなったかと思います。Laradockのenvファイルをカスタマイズして、自前のリポジトリにて管理
Laradockをサブモジュール化したことによって、Cloneする際に、Laradockの
env-example
ファイルが直接管理できなくなりました。
なので、env-example
を外出しして、カスタマイズできるような構成にしました。XDebugの設定
今回はとりあえず、Laradockを使用したLaravelのボイラープレートの作成が目的でしたので、気が向いたら今後追記します。
- 投稿日:2020-10-18T10:44:24+09:00
Laravel8 CRUD処理を使った投稿アプリを作成する その2 投稿入力画面の作成
目的
- 投稿アプリの投稿入力画面の作成を行う
実施環境
- 筆者の実施環境を記載する。
- ハードウェア環境
項目 情報 OS macOS Catalina(10.15.5) ハードウェア MacBook Pro (13-inch, 2020, Four Thunderbolt 3 ports) プロセッサ 2 GHz クアッドコアIntel Core i5 メモリ 32 GB 3733 MHz LPDDR4 グラフィックス Intel Iris Plus Graphics 1536 MB
- ソフトウェア環境
項目 情報 備考 PHP バージョン 7.4.8 Homebrewを用いてこちらの方法で導入→Mac HomebrewでPHPをインストールする Laravel バージョン 8.6.0 commposerを用いてこちらの方法で導入→Mac Laravelの環境構築を行う MySQLバージョン 8.0.19 for osx10.13 on x86_64 Homwbrewを用いてこちらの方法で導入→Mac HomebrewでMySQLをインストールする 前提条件
- その1の記事の内容が完了していること。
前提情報
- 作成するアプリ名は「laravel8_crud」とする。
- 作成するMySQLのデータベース名は「laravel8_crud_DB」とする。
- 下記に今回の作業のあとのソースコードのリモートリポジトリのリンクを記載する。
- 作成する投稿アプリのURLはhttp://127.0.0.1:8000/inputとする。
概要
- ルーティング情報の記載
- コントローラファイルの作成と記載
- ビューファイルの作成と記載
- 確認
詳細
ルーティング情報の記載
laravel8_crudディレクトリで下記コマンドを実行してルーティングファイルを開く。
$ vi routes/web.php開いたファイルに下記の2行を追記する。(Laravel8からルーティング情報の記載方法が異なっているので注意する。)
laravel8_crud/routes/web.phpuse App\Http\Controllers\ContentController; // -----------省略----------- Route::get('/input', [ContentController::class, 'input'])->name('input');追記後のルーティングファイルの内容を下記に記載する。
laravel8_crud/routes/web.php<?php use Illuminate\Support\Facades\Route; // 下記を追記する use App\Http\Controllers\ContentController; /* |-------------------------------------------------------------------------- | Web Routes |-------------------------------------------------------------------------- | | Here is where you can register web routes for your application. These | routes are loaded by the RouteServiceProvider within a group which | contains the "web" middleware group. Now create something great! | */ Route::get('/', function () { return view('welcome'); }); Auth::routes(); Route::get('/home', [App\Http\Controllers\HomeController::class, 'index'])->name('home'); // 下記を追記する Route::get('/input', [ContentController::class, 'input'])->name('input');コントローラファイルの作成と記載
laravel8_crudディレクトリで下記コマンドを実行してコントローラファイルを作成する。
$ php artisan make:controller ContentControllerlaravel8_crudディレクトリで下記コマンドを実行してコントローラファイルを開く。
$ vi app/Http/Controllers/ContentController.php開いたコントローラファイルに下記の内容を追記する。
app/Http/Controllers/ContentController.phppublic function input() { return view('contents.input'); }追記後のコントローラファイルの内容を下記に記載する。
app/Http/Controllers/ContentController.php<?php namespace App\Http\Controllers; use Illuminate\Http\Request; class ContentController extends Controller { // 下記を追記する public function input() { return view('contents.input'); } }ビューファイルの作成と記載
laravel8_crudディレクトリで下記コマンドを実行してビューファイルを格納するディレクトリを作成する。
$ mkdir resources/views/contentslaravel8_crudディレクトリで下記コマンドを実行してビューファイルを作成する。
vi resources/views/contents/input.blade.php
作成して開いたビューファイルに下記の内容を追記する。
laravel8_crud/resources/views/contents/input.blade.php<h1>input</h1> <form action="" method="post"> @csrf <textarea name="content" cols="30" rows="10"></textarea> <input type="submit" value="送信"> </form>確認
laravel8_crudディレクトリで下記コマンドを実行してローカルサーバを起動する。
$ php artisan serveブラウザで下記にアクセスする。
下記の様に表示されれば本記事の作業は完了である。
- 投稿日:2020-10-18T09:46:05+09:00
Laravelで,Illuminate\Database\Eloquent\Modelクラスのメソッドをモックする
環境情報
https://github.com/tarohida/laravel-models-mocking-example#enviroment
$ php --version PHP 7.4.5 (cli) (built: Apr 19 2020 07:36:30) ( NTS )$ composer info laravel/framework name : laravel/framework descrip. : The Laravel Framework. keywords : framework, laravel versions : * v8.10.0Homestead: v10.12.0
OS: Ubuntu18.04 LTSIlluminate\Database\Eloquent\Modelのテスト
Laravelの
Illuminate\Database\Eloquent\Model
を継承したクラスに,publicメソッドを生やすことがあります.
このテスト設計が果たして正しいのかについては模索中ですが,ひとまず呼び出し元の関数をテストしないといけないのでモックすることにしました.
しかし,これが凄まじく理解し難く,そもそも実装するにたどり着くまでが非常に難しかったので,ここに共有しようと思います.とりあえず動かす
https://github.com/tarohida/laravel-models-mocking-example
cloneして動かせるサンプルを用意しました.これを動作させると,とりあえずモックのコードが試せます.
$ vendor/bin/phpunit tests/Unit/ExampleTest.php PHPUnit 9.4.1 by Sebastian Bergmann and contributors. . 1 / 1 (100%) ---- $mock の中身を出力 ---- /home/vagrant/blog/laravel-models-mocking-example/tests/Unit/ExampleTest.php:29: class App\Models\ExampleModel#419 (20) { protected $_mockery_expectations => ...(略)... } ------------------------------- Time: 00:00.096, Memory: 20.00 MB OK (1 test, 2 assertions)何を変更したのか
このコミットでの変更内容が全てです.
https://github.com/tarohida/laravel-models-mocking-example/commit/e351eb15ae5187b0c7d895cf87e10d2a0fc6e307構成ファイル
App\Models\ExampleModel
今回モックする対象のモデルクラスです.artisanコマンドで生成してから変更を加えていません.
app/Models/ExampleModel.php<?php namespace App\Models; use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Model; class ExampleModel extends Model { use HasFactory; }App\Models\ExampleModelUse
モック対象の
ExampleModel
クラスを呼び出すクラスです.今回のテスト対象となるクラスです.
artisanコマンドで生成した後,static関数をひとつ定義しています.本当は,このクラスはModelクラスにする必要はないですし,Modelクラスでない方が一般的なケースかなと思うのですが,実際に
laravel new
から変更内容を再現する利用者1のことを考え,artisanコマンドで簡単に作成できるModelクラスとしましたapp/Models/ExampleModelUse.php<?php namespace App\Models; use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Model; class ExampleModelUse extends Model { use HasFactory; public static function method_to_be_tested() { return ExampleModel::method_do_not_exists(); } }Tests\Unit\ExampleTest
テストケースです.laravelがデフォルトで作成するExampleTestクラスを書き換えています.
上記コミットの変更差分を確認いただければ,Mockに必要な箇所がよりわかりやすいかと思います.tests/Unit/ExampleTest.php<?php namespace Tests\Unit; use Tests\TestCase; use Mockery; use App\Models\ExampleModelUse; class ExampleTest extends TestCase { public function setUp(): void { parent::setUp(); } /** * A basic test example. * * @return void */ public function testBasicTest() { // ExampleModelのmethod_do_not_exists()メソッドをモックする $mock = Mockery::mock('overload:App\Models\ExampleModel'); $mock->shouldReceive('method_do_not_exists') ->once()->andReturn('mocked_value'); echo "---- \$mock の中身を出力 ----\n"; var_dump($mock); echo "-------------------------------"; // テスト対象のメソッドを呼び出して,assertする $example_ret_value = ExampleModelUse::method_to_be_tested(); $this->assertSame('mocked_value', $example_ret_value); } }参考元記事
https://stackoverflow.com/questions/26304009/mocking-an-eloquent-model
この記事が全てです.リポジトリ
この記事の内容を手元のコードに取り込んで,無事モックが動作しました.動いたコードを新しいプロジェクトに切り出して作成したのが,今回のGitリポジトリです.
果たして現れるのか??? ↩