20201018のlaravelに関する記事は4件です。

エラーバンドリングの表示

【概要】

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.php
class 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の記載を忘れないでください。セキュリティ対策になります。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

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/.envDATA_PATH_HOSTを変更する
  • laradock
  • env-exampleファイル
    • サブモジュールは特定コミットをCloneする
    • laradockのenvファイル共通化のため、カスタマイズされたものを配置している

使用方法

  1. リポジトリにアクセス
  2. Use This Templateをクリック image.png
  3. 必要な情報を入力してCreate repository from templateをクリック image.png
  4. ちょっと待つと、リポジトリが作成される image.pngimage.png
  5. あとは、CloneするところからREADMEの流れに沿って作業すれば完了

こだわりポイント

Laradockリポジトリをサブモジュール化

Laradockを単にCloneしたものをリポジトリに含めるのではなく、サブモジュールとしてリポジトリに定義しました。
それによって、Laradockリポジトリの更新が反映しやすくなったかと思います。

Laradockのenvファイルをカスタマイズして、自前のリポジトリにて管理

Laradockをサブモジュール化したことによって、Cloneする際に、Laradockのenv-exampleファイルが直接管理できなくなりました。
なので、env-exampleを外出しして、カスタマイズできるような構成にしました。

XDebugの設定

今回はとりあえず、Laradockを使用したLaravelのボイラープレートの作成が目的でしたので、気が向いたら今後追記します。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

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の記事の内容が完了していること。

前提情報

概要

  1. ルーティング情報の記載
  2. コントローラファイルの作成と記載
  3. ビューファイルの作成と記載
  4. 確認

詳細

  1. ルーティング情報の記載

    1. laravel8_crudディレクトリで下記コマンドを実行してルーティングファイルを開く。

      $ vi routes/web.php
      
    2. 開いたファイルに下記の2行を追記する。(Laravel8からルーティング情報の記載方法が異なっているので注意する。)

      laravel8_crud/routes/web.php
      use App\Http\Controllers\ContentController;
      // -----------省略-----------
      Route::get('/input', [ContentController::class, 'input'])->name('input');
      
    3. 追記後のルーティングファイルの内容を下記に記載する。

      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');
      
  2. コントローラファイルの作成と記載

    1. laravel8_crudディレクトリで下記コマンドを実行してコントローラファイルを作成する。

      $ php artisan make:controller ContentController
      
    2. laravel8_crudディレクトリで下記コマンドを実行してコントローラファイルを開く。

      $ vi app/Http/Controllers/ContentController.php
      
    3. 開いたコントローラファイルに下記の内容を追記する。

      app/Http/Controllers/ContentController.php
      public function input()
      {
          return view('contents.input');
      }
      
    4. 追記後のコントローラファイルの内容を下記に記載する。

      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');
          }
      }
      
  3. ビューファイルの作成と記載

    1. laravel8_crudディレクトリで下記コマンドを実行してビューファイルを格納するディレクトリを作成する。

      $ mkdir resources/views/contents
      
    2. laravel8_crudディレクトリで下記コマンドを実行してビューファイルを作成する。

      vi resources/views/contents/input.blade.php
      
    3. 作成して開いたビューファイルに下記の内容を追記する。

      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>
      
  4. 確認

    1. laravel8_crudディレクトリで下記コマンドを実行してローカルサーバを起動する。

      $ php artisan serve
      
    2. ブラウザで下記にアクセスする。

    3. 下記の様に表示されれば本記事の作業は完了である。

      127_0_0_1_8000_input.png

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

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.0

Homestead: v10.12.0
OS: Ubuntu18.04 LTS

Illuminate\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リポジトリです.


  1. 果たして現れるのか??? 

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む