20200604のlaravelに関する記事は19件です。

テイクアウトしている店舗の掲載、閲覧サービス 『Take Out』

http://xs344052.xsrv.jp/takeout

DB

店舗ユーザーテーブル(usersテーブル)

名前 カラム名 データ型 制約
ユーザーID id integer primary, not null
ユーザー名 name string not null
メールアドレス email string unique, not null
メールアドレス確認日時 email_verified_at timestamp
パスワード password string not null
ログイン保持トークン remember_token string
作成日時 created_at datetime
更新日時 updated_at timestamp

店舗詳細テーブル(informationsテーブル)

名前 カラム名 データ型 制約
店舗詳細ID id integer primary, not null
店舗ユーザーID user_id integer not null
ジャンル category string not null
住所(都道府県) address string not null
住所(詳細) addr_detail string not null
電話番号 tell string not null
営業時間 open_hours string not null
写真(パス) pic string not null
作成日時 created_at datetime
更新日時 updated_at timestamp

メニューテーブル(productsテーブル)

名前 カラム名 データ型 制約
メニューID id integer primary, not null
店舗ユーザーID user_id integer not null
商品名 name string not null
値段 price string not null
写真(パス) pic string not null
作成日時 created_at datetime
更新日時 updated_at timestamp

使用する技術

バックエンド:laravel 5.8(phpフレームワーク)。
BD:MySQL。 サーバー:Xserver。
フロントエンド:vue.js(jsフレームワーク)を一部使用。
CSS:sass(SCSS)記法。FLOCSS(CSS設計)。

悩んだ箇所と内容

店舗情報は店舗ユーザーテーブルと店舗詳細テーブルに分けたので、店舗詳細を登録する時と編集する時のボタンの設置に悩みました。
1、詳細情報を新規登録してない場合とすでに登録している場合でボタンの表示を変える。
2、ユーザー登録が済んだらすぐに詳細情報の新規登録ページに遷移させ、マイページには編集ボタンのみ設置。
上記の2つのパターンを考え、今回は簡単な2を選びました。

しかし、2つ問題がある。
①詳細情報の新規登録ページで登録せず他のページへ飛んだ時に前のページに戻るしか詳細情報の新規登録ページに戻ることができない。
②詳細情報の新規登録ページで登録せずマイページに飛ぶとエラーになる。

なので
1、詳細情報を新規登録してない場合とすでに登録している場合でボタンの表示を変える。
の方法が良いと思うのでこれから改善していきます。

デザイン

掲載する店舗やメニューの写真が主役なので邪魔にならない配色を心がけました。
文字情報は優先順位で文字の大きさや色を変えました。例えば、店名は大きく見やすくし、電話番号は注文する時すぐにわかるように赤色にし、店舗情報の一番下に配置しました。

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

Lalavelのseeding

laravelのFakerクラスのseedeing

seedingの流れ

1)DB接続
2)seedの日本語化
3)modelファイル作成
4)migrateファイル作成
5)DBテーブル作成
6)seedファイル作成
7)factoryファイル作成
8)seeding実行

DBの設定(postgres)

config/database.php
    'default' => env('DB_CONNECTION', 'pgsql'),
.env
DB_CONNECTION=pgsql
DB_HOST=127.0.0.1
DB_PORT=5432
DB_DATABASE=laravel
DB_USERNAME=postgres
DB_PASSWORD=

seedデータの日本語化

app/config/app.php
    'faker_locale' => 'ja_JP',

modelファイルを作成する

$ php artisan make:model hoge

Model created successfully.

migrateファイルの作成

$ php artisan make:migration create_hoge_table

Created Migration: 2020_06_04_211755_create_hoge_table
app/database/migrations
    public function up()
    {
        Schema::create('hoge', function (Blueprint $table) {
            $table->bigIncrements('id');
            $table->string('last_name');
            $table->string('first_name');
            $table->integer('age')->nullable();
            $table->string('postal')->nullable();
            $table->string('address')->nullable();
            $table->string('tel')->nullable();
            $table->timestamps();
            $table->softDeletes();
        });
    }

DBテーブルの作成

$php artisan migrate

Migrating: 2020_06_04_122729_create_hoge_table
Migrated:  2020_06_04_122729_create_hoge_table (0.01 seconds)

seederファイルの作成

$ php artisan make:seeder HogeTableSeeder

Seeder created successfully.
app/database/seeds
class HogeTableSeeder extends Seeder
{
    /**
     * Run the database seeds.
     *
     * @return void
     */
    public function run()
    {
        factory(App/HogeTableSeeder::class, 50)->create();
    }
}

factoryファイルを作成する

$ php artisan make:factory HogeFactory

actory created successfully.
app/database/factories
use App\Hoge;

$factory->define(Hoge::class, function (Faker $faker) {
    return [
        'last_name' => $faker->lastName,
        'first_name' => $faker->firstName,
        'age' => $faker->numberBetween(8, 80),
        'postal' => $faker->postcode,
        'address' =>  $faker->address,
        'tel' =>  $faker->phoneNumber,
    ];
});

seedingでダミーデータを、DBに挿入する。

$ php artisan db:seed

Seeding: HogeTableSeeder
Seeded:  HogeTableSeeder (0.15 seconds)
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【Laravel】ミューテタを一時的に無効にする。

メモとして残します。

以前ミューテタについての記事を投稿しました。
非常に便利なミューテタですが時には、一時的に無効にして生の値をセットしてほしいということもあります。
いろいろ調べてはみましたが、どうやらEloquentORMで一時的にミューテタを無効にするメソッドは用意されていないようです。

そのため、疑似的にミューテタを無効にする方法を記述します。

■やり方

ミューテタについての例に付け加えます。

<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Model;

class Hoge extends Model
{
    public $isIgnoreMutator = false;
    public function setカラム名Attribute($value)
    {
        //isIgnoreMutatorをTrueにすれば値をそのままセット
        if( $this->isIgnoreMutator ){
            $this->attributes['カラム名'] = $value;
        }else{
            $this->attributes['カラム名'] = $value ?? 'hogehoge';
        }
    }
}

コントローラ等で生成したこのモデルのオブジェクトの
メンバ変数$isIgnoreMutatorにtrueをセットすることで、以降の処理でfillだろうが、なんだろうが、値が、そのままセットされるようになります。

■おわりに

見ての通り、ミューテタそのものは無効になっておりません(;^ω^)
あくまで疑似的に無効化しているだけのため、少し不格好です。。。

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

LaravelさんはどうやってAJAXかどうか区別してResponseでJSON返してくるの?

我らがBOOM TECH CAFEの若きエース、 @miriwo さんの最新記事「Laravel API データポスト時のバリデーションで弾かれた後、http://127.0.0.1:8000/にリダイレクトしてしまう」を読んで、「おや? ワイのLaravelちゃんはAJAXでアクセスすると普通にエラーのJSON返してくるんやが……?」と思って、調べてみました。

そもそもAJAXかどうかどうやって判定しているの?

Laravelの公式ドキュメント日本語訳にはこんなふうに書かれてるわけですよ。
https://readouble.com/laravel/5.5/ja/validation.html

※一応、Laravel5.5での話をしていますが、後方バージョンでもだいたい同じだと思います。

伝統的なHTTPリクエストの場合は、リダイレクトレスポンスが生成され、一方でAJAXリクエストにはJSONレスポンスが返されます。

ほうほう、そうなんすね。
んで、AJAXリクエストか伝統的なHTTPリクエストかどうかはどこで判別してるねんと言うと、ここなわけです。

vendor/laravel/framework/src/Illuminate/Http/Request.php(226-234)
    /**
     * Determine if the request is the result of an AJAX call.
     *
     * @return bool
     */
    public function ajax()
    {
        return $this->isXmlHttpRequest();
    }
vendor/symfony/http-foundation/Request.php(1820-1833)
    /**
     * Returns true if the request is a XMLHttpRequest.
     *
     * It works if your JavaScript library sets an X-Requested-With HTTP header.
     * It is known to work with common JavaScript frameworks:
     *
     * @see http://en.wikipedia.org/wiki/List_of_Ajax_frameworks#JavaScript
     *
     * @return bool true if the request is an XMLHttpRequest, false otherwise
     */
    public function isXmlHttpRequest()
    {
        return 'XMLHttpRequest' == $this->headers->get('X-Requested-With');
    }

なるほど、つまりRequest Headerに X-Requested-With: XMLHttpRequest ってのが入ってたらAJAXリクエストとして扱うってわけね……え、そんなHeaderどこで入れてたっけ……?

そして我々は X-Requested-With を求めて旅に出た

ソースグレップするとこんなところにいるのを見つけます。

resources/assets/js/bootstrap.js(16-24)
/**
 * We'll load the axios HTTP library which allows us to easily issue requests
 * to our Laravel back-end. This library automatically handles sending the
 * CSRF token as a header based on the value of the "XSRF" token cookie.
 */

window.axios = require('axios');

window.axios.defaults.headers.common['X-Requested-With'] = 'XMLHttpRequest';

なるほど、axiosのHeaderにデフォルトで入るようにしてるのね……え、でもBootstrap使ってないんやが……
そこで、肝心のAJAXしてるjsをのぞいてみると……

require('./bootstrap');

バッチリrequireしてたーーーーーー!!

やー、無意識って怖いっすね。今回はいい勉強になりました。

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

LaravelさんはどうやってAJAXかどうか区別してバリデーションエラーレスポンスでJSONを返してくるの?

我らがBOOM TECH CAFEの若きエース、 @miriwo さんの最新記事「Laravel API データポスト時のバリデーションで弾かれた後、http://127.0.0.1:8000/にリダイレクトしてしまう」を読んで、「おや? ワイのLaravelちゃんはAJAXでアクセスすると普通にバリデーションエラーのJSON返してくるんやが……?」と思って、調べてみました。

そもそもAJAXかどうかどうやって判定しているの?

Laravelの公式ドキュメント日本語訳にはこんなふうに書かれてるわけですよ。
https://readouble.com/laravel/5.5/ja/validation.html

※一応、Laravel5.5での話をしていますが、後方バージョンでもだいたい同じだと思います。

伝統的なHTTPリクエストの場合は、リダイレクトレスポンスが生成され、一方でAJAXリクエストにはJSONレスポンスが返されます。

ほうほう、そうなんすね。
んで、AJAXリクエストか伝統的なHTTPリクエストかどうかはどこで判別してるねんと言うと、ここなわけです。

vendor/laravel/framework/src/Illuminate/Http/Request.php(226-234)
    /**
     * Determine if the request is the result of an AJAX call.
     *
     * @return bool
     */
    public function ajax()
    {
        return $this->isXmlHttpRequest();
    }
vendor/symfony/http-foundation/Request.php(1820-1833)
    /**
     * Returns true if the request is a XMLHttpRequest.
     *
     * It works if your JavaScript library sets an X-Requested-With HTTP header.
     * It is known to work with common JavaScript frameworks:
     *
     * @see http://en.wikipedia.org/wiki/List_of_Ajax_frameworks#JavaScript
     *
     * @return bool true if the request is an XMLHttpRequest, false otherwise
     */
    public function isXmlHttpRequest()
    {
        return 'XMLHttpRequest' == $this->headers->get('X-Requested-With');
    }

なるほど、つまりRequest Headerに X-Requested-With: XMLHttpRequest ってのが入ってたらAJAXリクエストとして扱うってわけね……え、そんなHeaderどこで入れてたっけ……?

そして我々は X-Requested-With を求めて旅に出た

ソースグレップするとこんなところにいるのを見つけます。

resources/assets/js/bootstrap.js(16-24)
/**
 * We'll load the axios HTTP library which allows us to easily issue requests
 * to our Laravel back-end. This library automatically handles sending the
 * CSRF token as a header based on the value of the "XSRF" token cookie.
 */

window.axios = require('axios');

window.axios.defaults.headers.common['X-Requested-With'] = 'XMLHttpRequest';

なるほど、axiosのHeaderにデフォルトで入るようにしてるのね……え、でもBootstrap使ってないんやが……
そこで、肝心のAJAXしてるjsをのぞいてみると……

require('./bootstrap');

バッチリrequireしてたーーーーーー!!

やー、無意識って怖いっすね。今回はいい勉強になりました。

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

laravel フォルダの中身を一覧取得

laravelを使って、指定したフォルダの一覧を表示したい。
ファイルを resources 以下に置けば非公開になる。

今回は /resources/sass/ のファイル一覧を取得する。

HogeController.php
$path= resource_path('sass');///var/www/html/mama-rich.net/resources/sass

$files = \File::files($path);

foreach ($files as $v) {

    print_r($v->getfileName());//app.scss
    print_r($v->getpathName());///var/www/html/mama-rich.net/resources/sass/app.scss


}

以上

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

【エラー解決備忘録】[Laravel6.0]migrate時のエラー解決方法の巻き

本記事の目的

 Laravel勉強中の筆者がmigrate時に経験したエラーと解決方法をまとめました。
筆者と同様に勉強中の方やエラーで悩まれている方の参考になればと思い投稿いたしました。
 なお勉強中のため内容が足りなかったり、誤った記載があるかもしれません。
その際は指摘をビシバシしてもらえると嬉しいです!
宜しくお願いいたします。

環境

  • macOS Catalina(バージョン10.15.4)
  • Laravel Framework 6.18.18
  • MAMP

遭遇したエラー

事前にphpMyAdminで作成したデータベースにファイルを追加するため、
ターミナルで%php artisan migrateを実行すると
「DBサーバーに接続できないよ!」「そのようなファイルまたはディレクトリはないよ!」
下記エラーメッセージで指摘を受けました。

   Illuminate\Database\QueryException:
SQLSTATE[HY000] [2002] No such file or directory 
(SQL: select * from information_schema.tables where table_schema 
= laravel_task and table_name = migrations and table_type = 'BASE TABLE')

  at・・・・/vendor/laravel/framework/src/Illuminate/Database/Connection.php:669
    665| // If an exception occurs when attempting to run a query, we'll format the error
    666| // message to include the bindings with SQL, which will make this exception a
    667| // lot more helpful to the developer instead of just the database's errors.
    668|         catch (Exception $e) {
  > 669|             throw new QueryException(
    670|                 $query, $this->prepareBindings($bindings), $e
    671|             );
    672|         }
    673| 

  Exception trace:

  1   PDOException::("SQLSTATE[HY000] [2002] No such file or directory")
     ・・・・/vendor/laravel/framework/src/Illuminate/Database/Connectors/Connector.php:70

  2   PDO::__construct("mysql:unix_socket=/Applications/MAMP/tmp/mysql/mysql.sock;dbname=〜省略〜[])
     ・・・・/vendorvendor/laravel/framework/src/Illuminate/Database/Connectors/Connector.php:70

  Please use the argument -v to see more details.

解決方法

結論、DB_HOSTを「127.0.0.1」から「localhost」に修正するとエラーが解消されマイグレーションができました。

※ターミナル
%php artisan migrate
Migrating: 2020_06_04_****_create_名称_table
Migrated:  2020_06_04_****_create_名称_table (0.04 seconds)
(before)config>database.php
省略
'mysql' => [
            'driver' => 'mysql',
            'url' => env('DATABASE_URL'),
            'host' => env('DB_HOST', '127.0.0.1'),
            'port' => env('DB_PORT', '3306'),
省略
(after)config>database.php
省略
'mysql' => [
            'driver' => 'mysql',
            'url' => env('DATABASE_URL'),
            'host' => env('DB_HOST', 'localhost'),
            'port' => env('DB_PORT', '3306'),
省略

解決に至るまでのステップ

今回、下記ステップで作業を行いエラーの解消とphpMyAdminへのデータ登録が実現できました。

①.evファイルの確認
まず、.evファイルの中身を確認してみると以下の記載でした。

〜省略〜
DB_CONNECTION=mysql
DB_HOST=localhost
DB_PORT=3306
DB_DATABASE=データベースの名前
DB_USERNAME=ユーザーネーム
DB_PASSWORD=パスワード
〜以下省略〜

②次に、phpMyAdmiでMySQLの設定を確認
Hostの指定が「localhost」であることを確認。

MySQL can be administered with phpMyAdmin.
To connect to the MySQL server from your own scripts use the following connection parameters:

Host    localhost
Port    3306
〜省略〜

③config>database.phpを確認

(before)config>database.php
'mysql' => [
            'driver' => 'mysql',
            'url' => env('DATABASE_URL'),
            'host' => env('DB_HOST', '127.0.0.1'),
            'port' => env('DB_PORT', '3306'),
            以下省略

とHostの指定が.evとphpMyAdminで異なっていることがわかりました。
エラーの原因としてHostの指定が異なっていたと考え、
Hostの指定を統一するとエラーが解消されmigrateを無事に行うことができました。

※ターミナル
%php artisan migrate
Migrating: 2020_06_04_****_create_名称_table
Migrated:  2020_06_04_****_create_名称_table (0.04 seconds)

参考サイト

Laravel6.0でmigrateできなかった時の対処方法

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

【Laravel】eroquentORMで任意のカラム(要素)にセットした際に自動的に加工&セットする。(ミューテタ)

メモとして残します。

LaravelのEroquentORMを用いてデータの取得、保存をすると思います。
今回は保存する際に任意のカラムをセットしたら、その際に自動的に値の加工してもらうようにプログラムします。(=ミューテタの定義)

■やり方

任意のカラム(要素)にミューテタを仕込みたいモデルに下記の例のようにメソッドを追記。

<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Model;

class Hoge extends Model
{
    public function setカラム名Attribute($value)
    {
        //$valueにセットしたときの値が入っている。
        $this->attributes['カラム名'] = $value ?? 'hogehoge'; 
    }
}

上記の例では要素にセットされた値がNullの場合は、hogehogeという文字列をセットしました。

ミューテタを定義する利点としては、
モデル呼び出し元で同じような処理を記述する必要がなくなります。
どんな場合も共通して加工してセットしたいという場合に役に立ちます。

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

【Laravel】EloquentORMで任意のカラム(要素)にセットした際に自動的に加工&セットする。(ミューテタ)

メモとして残します。

LaravelのEloquentORMを用いてデータの取得、保存をすると思います。
今回は保存する際に任意のカラムをセットしたら、その際に自動的に値の加工してもらうようにプログラムします。(=ミューテタの定義)

■やり方

任意のカラム(要素)にミューテタを仕込みたいモデルに下記の例のようにメソッドを追記。

<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Model;

class Hoge extends Model
{
    public function setカラム名Attribute($value)
    {
        //$valueにセットしたときの値が入っている。
        $this->attributes['カラム名'] = $value ?? 'hogehoge'; 
    }
}

上記の例では要素にセットされた値がNullの場合は、hogehogeという文字列をセットしました。

ミューテタを定義する利点としては、
モデル呼び出し元で同じような処理を記述する必要がなくなります。
どんな場合も共通して加工してセットしたいという場合に役に立ちます。

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

Laravelのコントローラ をコピって使ってたら死んだ!

Laravelのマイグレーションファイルやコントローラ などは、コマンドで作るのも面倒なのでコピーして作ってました。

作っている内に最適化できることに気づいて、古いコントローラ をコピーして名前を変えてバックアップようとして残し、新しいコントローラ に移管することを試みました。

しかし、なぜか名前を変えたはずの古いコントローラ を読んでしまう。。
「消えろや!」と、いっそ消してしまったら、「見つかりません」エラーが出てサービスが利用不能に。。

https://qol-kk.com/wp2/blog/2018/11/23/post-943/

ありがとう先輩方。。

composerにキャッシュ的に記録されていて、それを読んで振り分けている的な動きだったのですね。。

composer dump-autoload

こちらのコマンドで、即解決。

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

macにLaravelを導入

はじめに

現在通っているプログラミングスクールTECH CAMPでは、Ruby on Railsを用いたアプリケーションの開発を行ってきました。スクールも終盤になり、新しいプログラミング言語、フレームワークを使用してみたいと思って今回「laravel」を導入してみました。

PHPとLaravel

PHPとLaravelについては、現在、書籍やドキュメントで勉強中です。見聞きした範囲で書くとPHPはプログラミング言語の一つで、サーバーサイドで動的なウェブページを作成することが得意なので、Webアプリケーションに特化している、という感じ。
そしてLaravelは、PHPを使用して作成するWebアプリケーション用のフレームワークの一つ。PHPのフレームワークにはコレ!!という定番はまだなく、いくつか選択肢があるようです。Laravelは、他に比べて歴史は浅いものの人気のフレームワークの一つで、コードをスッキリ書けるらしい。Rubyに対してRails、PHPに対してLaravel、そういう認識です。

達成したいこと

Laravelで新しいプロジェクトを立ち上げ、ローカルから確認すると以下のようなトップ画像が表示されます。Railsで言うところの「Yay! You're on Rails!」に相当する画面です。このおしゃれな画面を表示させることを達成したい。
image.png

手順

プログラミングスクールに通っているので、「Homebrew」のインストールなどは完了しています。よって、あくまで私の環境での手順になりますが、以下のように進めます。

  1. brewのバーション確認
  2. Composerのインストール
  3. PHPのインストール
  4. Laravelのインストール
  5. Laravelコマンドを利用するためにPATHを通す
  6. Laravelプロジェクト用のディレクトリを作成
  7. Laravelプロジェクトの新規作成
  8. ローカルサーバーで確認

参考にさせていただいた記事

Laravel公式ドキュメント
Mac用 Laravelをインストールする @S-Masakatsu
Mac Laravelの環境構築時にエラーが出た話 vol.1 @miriwo
ターミナル上で「laravel」コマンドを使えるようにパスを通す @m24

brewのバーション確認

スクールのカリキュラムでHomebrewはすでにインストール済みですが、念のため確認を行いました。インストールできているか確認するのには、バーション確認のコマンドを打つのが定番のようですね。私の場合は、バージョンが表示されたのでOKということになりました。

ターミナル
$ brew -v

Composerのインストール

ComposerはPHPのパッケージ管理ツールと呼ばれるもので、必要なライブラリを一括でインストールできるもののようです。RubyのライブラリはGemと呼ばれ、それらをまとめてインストールするためにBundlerを使用しました。ターミナルで「bundle install」したやつです。実際にBundlerとComposerでは挙動が異なるようですが、大まかな認識としてはそういったものになります。
つまり、Laravelでアプリケーション開発をするのに必須!というわけです。

ターミナル
$ brew install composer

正しくインストールが完了すれば、以下のコマンドでComposerのバージョン確認を行えます。

ターミナル
$ composer -v

PHPのインストール

PHPはmacには標準で入っているので、この手順は飛ばしてLaravelをインストールしてもOKだとは思います。
しかし、私のmacに入っていたPHPのバージョンが古かったのか、Laravelをインストールしようとすると以下のようなエラーが発生しました。

ターミナル
こちらのエラー文はイメージです。実際のエラー文は残し忘れてしまいました。。。

$ composer global require laravel/installer
Changed current directory to /Users/shun/.composer
Using version ^3.0 for laravel/installer
./composer.json has been created
Loading composer repositories with package information
Updating dependencies (including require-dev)
Your requirements could not be resolved to an installable set of packages.

  Problem 1
    - laravel/installer v3.0.1 requires ext-zip * -> the requested PHP extension zip is missing from your system.
    - laravel/installer v3.0.0 requires ext-zip * -> the requested PHP extension zip is missing from your system.
    - Installation request for laravel/installer ^3.0 -> satisfiable by laravel/installer[v3.0.0, v3.0.1].

Installation failed, deleting ./composer.json.

そこで、参考記事を元にPHP7.4をインストールすることにしました。

ターミナル
$ brew install php@7.4

同じく正しくインストールされているか、バージョン確認を行っておきます。

ターミナル
$ php -v

Laravelのインストール

本命であるLaravelをインストールします。

ターミナル
$ composer global require "laravel/installer"

同じくダウンロードできたかバージョン確認を行うとLaravelについては以下のように表示されてうまくバージョン確認ができません。

ターミナル
$ laravel -v
zsh: command not found: laravel

これは、Laravelコマンドを使用するためのPATHが通っていないことを表しているようです。ComposerやPHPと違って、インストールしただけでは動いてくれません。これまでバージョン確認はインストールが完了したかの確認という認識でしたが、コマンドが扱えるようになっているかの確認でもあったのですね。

Laravelコマンドを利用するためにPATHを通す

PATHを通すのもターミナル操作となります。

ターミナル
$ export PATH=$HOME/.composer/vendor/bin:$PATH

上のようにターミナルに入力するだけで「.bash_profile」に書き込まれた状態になるようです。スクールでは、「vim -i」で直接編集する方法を学んでいましたが、ターミナルに打ち込むだけで完了するのは便利ですね。とはいえ変更状態を反映させるには以下のコマンドも必要になります。

ターミナル
$ source ~/.bash_profile

Laravelプロジェクト用のディレクトリを作成

スクールでは、「Projects」というディレクトリにRailsアプリケーションを保存していました。そこでLaravelアプリケーション用のローカルディレクトリを作ります。これは人によってディレクトリの場所や名前は異なると思います。
私は、Userディレクトリ内に「laravel」という名前のディレクトリを作りました。

Laravelプロジェクトの新規作成

Laravelアプリケーションを新規作成します。まずはアプリケーションの保存先へディレクトリを移動します。私の場合は、先ほど作成した「Laravel」ディレクトリへ移動します。

ターミナル
$ cd laravel

新規作成コマンドは、Railsとよく似ています。今回はオプション等は付けずに名前だけ付けます。laravel newに続けて任意のアプリケーション名を書きますが、今回は「sample_laravel」としました。

ターミナル
$ laravel new laravel_sample

ローカルサーバーで確認

作成が完了したら、ローカルサーバーを起動してブラウザからトップ画面を確認します。ローカルサーバーの起動コマンドはRailsとは異なります。

ターミナル
$ php artisan serve
Laravel development server started: <http://127.0.0.1:8000>

ローカルサーバー起動時にターミナルに出力されているURL「http://127.0.0.1:8000」 にアクセスします。以下の画面が表示されれば成功です。
image.png

VSコードでもアプリケーションディレクトリを開くことができます。
image.png

次に達成したいこと

laravelの導入が完了したので、次はGit管理やPHPの記述が楽になりそうなVSコードのライブラリを探そうと思います。いつでもコードが書ける状態になったら本格的にPHPの勉強と開発に着手します。ここまで読んでいただきありがとうございました。

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

laravel 値があった場合のみバリデーション

例: urlは 必須ではなく、入力された場合のみ実行したい

方法: nullableをつける

public function rules()
{
    return [
        ....
        'url' => 'nullable|url|max:255',
    ];
}

public function messages()
{
    return [
        ....
        'url.max'  => ':urlの形式で入力してください',
    ];
}
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

laravel nginxでroot以外のページがNot Foundになってしまうとき、これをconfに書く。

dockerでngixを追加してやってみたときの話。
rootのいつものLaravelの画面は出るが、追加したURLでNot Foundになってしまう。

404 Not Found
nginx/1.19.0

解決策

try_files $uri $uri/ /index.php?$query_string;を書く

nginx/default.conf
server {
  listen 80;
    index index.php index.html;
    root /var/www/public;

  location / {
    root /var/www/public;
    index  index.html index.php;
    try_files $uri $uri/ /index.php?$query_string; # <==
  }

nginxのconfにこれがないと/以外のときNot foundになる。

dockerでnginxでやろうと思ってやるとはまる。
"Docker Laravel"で検索したページでもここを強調して書かれているところはないと思うので書きました。

公式に書いてました。

参考
Installation - Laravel - The PHP Framework For Web Artisans

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

[mysql,laravel]あるカラムで重複を持つレコードだけをまとめずに全て呼び出す方法

何をした?

operationsテーブルから"第三工種"というカラムで重複するレコードに付随しているデータの塊を作りたいと考えました。

具体的には"第三工種"に"土工"というレコードが複数ある場合、それ以降の”第四工種”以降が"埋め戻し"のものや”掘削"のものなどに分岐します。
それを”第三工種に土工を持つもの全て"で一括りの配列にして、呼び出したいと考えました。

(参考)ER図
v4.png

失敗した方法

ひとことで言うと、クエリによる処理でなく配列処理で対応しようとしたらドツボにはまりました。

※詳細(分かりにくいので、お急ぎの方は読まなくて大丈夫です)

まずテーブルから全レコードを呼び出し、distinct()で重複を絞った後、その"id"を持つ"第三工種"を抜き出します。その"第三工種"のレコードを持つものをforeacharray_keys()により、distinct()してないものと比較することで新しい1次配列を作り、そこからviewに呼び出そうとしました。

array_key()はオブジェクトに対して使えないというエラーで挫折しました。
コレクションを使えばいけるかもしれなかったですが、1次配列にしてしまうと呼び出しも厄介なので中断しました。

→代案で"id"を抽出した後、全て入ったデータからarray_column()でそれぞれのカラムを抜き出して、呼び出しの時に該当のidを使って呼び出すことを考えましたが、array_column()もオブジェクトに対して使えないというエラーが出たので中断しました。

解決方法

下記のsqlをコントローラで書き出して、”第三工種”が同じものだけの配列にまとめることで対応しました。

sequelproのクエリで実行した記述
SELECT
    operations.id,
    operations.third_operation_class
FROM
    -- サブクエリで件数を取得
    (
    SELECT
        third_operation_class,
        COUNT(third_operation_class) AS CNT
    FROM
        operations
    GROUP BY
        third_operation_class
    ) AS third_operation_class_CNT
-- 自己結合
INNER JOIN
    operations
ON
    third_operation_class_CNT.third_operation_class = operations.third_operation_class
AND
    third_operation_class_CNT.CNT > 0;

#上記の結果
id  third_operation_class
8   お試し3
9   河川土工
16  土工
17  土工
18  土工
19  土工
20  土工
21  土工
22  土工

その後

この記述で他のカラムも呼び出して、"third_operation_class"が同じものだけでまとめることで、欲しい値だけの配列ができるので、そこにforeachでインデックス番号をふって、そのインデックス番号でページを分けて表示しました。

参考

https://johobase.com/extracts-duplicate-records-sql/

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

Call to undefined method Illuminate\Database\Eloquent\Builder::toArray() の解決例

エラー文の様子

スクリーンショット 2020-06-04 2.43.24.png

どんなエラー?

app/Http/Controllers/RecordTimingController
public function syousai_matome($id)
     {
       $third_operation_class_id = Operation::query()->where('record_timing_id',$id)->distinct()->select('third_operation_class');
       return $third_operation_class_id->toArray();
      }

上記のように、コントローラで構文的に問題なくデータベースから情報を取得しようとしたら出てきたものです。

原因

データベースの情報をクエリ(今回は抽出)した状態で止まっており、その抽出したものをコントローラに呼び出していなかったため起きました。

※クエリとは:データベース上で特定の条件に合致したデータを検索したり、置換や削除などを行ったりすること。

解決策

下記のように、クエリ(今回は抽出)した状態のものを->get()で取得すればエラーが解消されました。

app/Http/Controllers/RecordTimingController
public function syousai_matome($id)
     {
       $third_operation_class_id = Operation::query()->where('record_timing_id',$id)->distinct()->select('third_operation_class')->get();
       return $third_operation_class_id->toArray();
      }
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

ローカル環境でnginxをhttps通信をする方法

はじめに

 就活中の選考課題でGeolocation apiを使って、位置情報を利用するサイトを作る際に
Google chromeのブラウザでは、https通信しないと位置情報を取得できないので、
https通信をできるようにしました。
 この記事は、ゆうきゃんさんの記事である最強のLaravel開発環境をDockerを使って構築する【新編集版】をベースにhttps通信を構築しています。1から環境を用意したい方は、この記事はじめに参照してから記事をご覧ください。

開発環境

開発環境
Windows10 Home
docker tool box 19.03.1
docker-compose 1.24.1
Mysql 8.0.20
Nginx 1.18.0

https通信する手順

Chocolateyのインストール

https通信に必要なssl証明書を簡単に発行することができるmkcertツールインストールするために
Chocolateyというパッケージ管理ツールをインストールします

①スタートメニューを右クリックしてコマンドプロンプトを管理者権限で開く
スクリーンショット (37).png
②コマンドか公式サイトからChocolateyインストール

・コマンド
C:\>Chocolatey Install
Chocolatey v0.10.15

公式サイト
スクリーンショット (39).png

C:\>Set-ExecutionPolicy Bypass -Scope Process -Force; [System.Net.ServicePointManager]::SecurityProtocol = [System.Net.ServicePointManager]::SecurityProtocol -bor 3072; iex ((New-Object System.Net.WebClient).DownloadString('https://chocolatey.org/install.ps1'))`

mkcertのインストールしてSSL証明書発行

C:\>choco install mkcert
C:\>mkcert localhost 196.168.99.101(ご自身のIPアドレスを入力)
mkcert localhost 196.168.99.101
Using the local CA at "C:\Users\ユーザ名\AppData\Local\mkcert" 

Created a new certificate valid for the following names 
 - "localhost"
 - "196.168.99.101(ご自身のIPアドレス)"

The certificate is at "./localhost+1.pem" and the key at "./localhost+1-key.pem" 

発行したら今いるディレクトリに発行させるので
localhost+1.pem localhost+1-key.pemの+1を消して
docker-laravel\infrastructure\docker\nginxのディレクトリに移動します

⚠もし、mkcert localhost 196.168.99.101(ご自身のIPアドレスを入力)と打って
システムリソース不足のため...と言われたら、
セキュリティーソフトのリアルタイムスキャンの停止や再起動をして見てください

docker-compose.ymlの記述

web:
    build: ./docker/nginx
    ports:
      - 196.168.99.101:80:80
      - 196.168.99.101:443:443(ここを追加で記述する)
    volumes:
      - php-fpm-socket:/var/run/php-fpm
      - ../backend:/work/backend

Dockerfileの記述

FROM node:14.2-alpine as node
FROM nginx:1.18-alpine
SHELL ["/bin/ash", "-oeux", "pipefail", "-c"]

ENV TZ=UTC

RUN apk update && \
  apk add --update --no-cache --virtual=.build-dependencies g++

  COPY --from=node /usr/local/bin /usr/local/bin
  COPY --from=node /opt /opt
  COPY ./default.conf /etc/nginx/conf.d/default.conf
  ADD ./localhost.pem /etc/certs/localhost.pem(ここを追加で記述する)
  ADD ./localhost-key.pem /etc/certs/localhost-key.pem(ここを追加で記述する)

  WORKDIR /work/backend

default.confの記述

access_log /dev/stdout main;
error_log /dev/stderr warn;

  server {
    listen 80;
    root /work/backend/public;

    add_header X-Frame-Options "SAMEORIGIN";
    add_header X-XSS-Protection "1; mode=block";
    add_header X-Content-Type-Options "nosniff";

    index index.html index.htm index.php;

    charset utf-8;

    location / {
        try_files $uri $uri/ /index.php?$query_string;
    }

    location = /favicon.ico { access_log off; log_not_found off; }
    location = /robots.txt  { access_log off; log_not_found off; }

    error_page 404 /index.php;

    location ~ \.php$ {
        fastcgi_pass unix:/var/run/php-fpm/php-fpm.sock;
        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;
        include fastcgi_params;
    }

    location ~ /\.(?!well-known).* {
        deny all;
    }
  }

  server {(ここから追加で記述する)
    listen 443 ssl;
    root /work/backend/public;
    ssl_certificate /etc/certs/localhost.pem;
    ssl_certificate_key /etc/certs/localhost-key.pem;

    add_header X-Frame-Options "SAMEORIGIN";
    add_header X-XSS-Protection "1; mode=block";
    add_header X-Content-Type-Options "nosniff";

    index index.html index.htm index.php;

    charset utf-8;

    location / {
        try_files $uri $uri/ /index.php?$query_string;
    }

    location = /favicon.ico { access_log off; log_not_found off; }
    location = /robots.txt  { access_log off; log_not_found off; }

    error_page 404 /index.php;

    location ~ \.php$ {
        fastcgi_pass unix:/var/run/php-fpm/php-fpm.sock;
        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;
        include fastcgi_params;
    }

    location ~ /\.(?!well-known).* {
        deny all;
    }
  }

docker-compose の起動

//コンテナをビルド
make build = docker-compose build --no-cache --force-rm
//コンテナを作成する
make up = docker-compose up -d
//全コンテナを起動する
docker start $(dokcer ps -a -q)
⚠makefileがない場合はdockerコマンドを入力してください

結果

下記のようにhttps通信ができました!
最近のブラウザはhttps通信を要求してくるので環境を整えて開発することをおすすめします
お読み頂きましてありがとうございました。
スクリーンショット (41).png

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

ローカル環境でnginxをhttps通信にする方法

はじめに

 就活中の選考課題でGeolocation apiを使って、位置情報を利用するサイトを作る際に
Google chromeのブラウザでは、https通信しないと位置情報を取得できないので、
https通信をできるようにしました。
 この記事は、ゆうきゃんさんの記事である最強のLaravel開発環境をDockerを使って構築する【新編集版】をベースにhttps通信を構築しています。1から環境を用意したい方は、上記の記事をはじめに参照してから本記事をご覧ください。

開発環境

開発環境
Windows10 Home
docker tool box 19.03.1
docker-compose 1.24.1
Mysql 8.0.20
Nginx 1.18.0

https通信する手順

Chocolateyのインストール

https通信に必要なSSL証明書を簡単に発行することができるmkcertというツールをインストールするために
Chocolateyというパッケージ管理ツールをインストールします

①スタートメニューを右クリックしてコマンドプロンプトを管理者権限で開く
スクリーンショット (37).png
②コマンドか公式サイトからChocolateyインストール

・コマンド
C:\>Chocolatey Install
Chocolatey v0.10.15

公式サイト
スクリーンショット (39).png

C:\>Set-ExecutionPolicy Bypass -Scope Process -Force; [System.Net.ServicePointManager]::SecurityProtocol = [System.Net.ServicePointManager]::SecurityProtocol -bor 3072; iex ((New-Object System.Net.WebClient).DownloadString('https://chocolatey.org/install.ps1'))`

mkcertをインストールしてSSL証明書を発行

C:\>choco install mkcert
C:\>mkcert localhost 196.168.99.101(ご自身のIPアドレスを入力)
mkcert localhost 196.168.99.101
Using the local CA at "C:\Users\ユーザ名\AppData\Local\mkcert" 

Created a new certificate valid for the following names 
 - "localhost"
 - "196.168.99.101(ご自身のIPアドレス)"

The certificate is at "./localhost+1.pem" and the key at "./localhost+1-key.pem" 

発行したら今いるディレクトリに発行させるので
localhost+1.pem localhost+1-key.pemの+1を消して
docker-laravel\infrastructure\docker\nginxのディレクトリにファイルを移動します

⚠もし、mkcert localhost 196.168.99.101(ご自身のIPアドレスを入力)と打って
システムリソース不足のため...と言われたら、
セキュリティーソフトのリアルタイムスキャンの停止や再起動をして見てください

docker-compose.ymlの記述

web:
    build: ./docker/nginx
    ports:
      - 196.168.99.101:80:80
      - 196.168.99.101:443:443(ここを追加で記述する)
    volumes:
      - php-fpm-socket:/var/run/php-fpm
      - ../backend:/work/backend

Dockerfileの記述

FROM node:14.2-alpine as node
FROM nginx:1.18-alpine
SHELL ["/bin/ash", "-oeux", "pipefail", "-c"]

ENV TZ=UTC

RUN apk update && \
  apk add --update --no-cache --virtual=.build-dependencies g++

  COPY --from=node /usr/local/bin /usr/local/bin
  COPY --from=node /opt /opt
  COPY ./default.conf /etc/nginx/conf.d/default.conf
  ADD ./localhost.pem /etc/certs/localhost.pem(ここを追加で記述する)
  ADD ./localhost-key.pem /etc/certs/localhost-key.pem(ここを追加で記述する)

  WORKDIR /work/backend

default.confの記述

access_log /dev/stdout main;
error_log /dev/stderr warn;

  server {
    listen 80;
    root /work/backend/public;

    add_header X-Frame-Options "SAMEORIGIN";
    add_header X-XSS-Protection "1; mode=block";
    add_header X-Content-Type-Options "nosniff";

    index index.html index.htm index.php;

    charset utf-8;

    location / {
        try_files $uri $uri/ /index.php?$query_string;
    }

    location = /favicon.ico { access_log off; log_not_found off; }
    location = /robots.txt  { access_log off; log_not_found off; }

    error_page 404 /index.php;

    location ~ \.php$ {
        fastcgi_pass unix:/var/run/php-fpm/php-fpm.sock;
        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;
        include fastcgi_params;
    }

    location ~ /\.(?!well-known).* {
        deny all;
    }
  }

  server {(ここから追加で記述する)
    listen 443 ssl;
    root /work/backend/public;
    ssl_certificate /etc/certs/localhost.pem;
    ssl_certificate_key /etc/certs/localhost-key.pem;

    add_header X-Frame-Options "SAMEORIGIN";
    add_header X-XSS-Protection "1; mode=block";
    add_header X-Content-Type-Options "nosniff";

    index index.html index.htm index.php;

    charset utf-8;

    location / {
        try_files $uri $uri/ /index.php?$query_string;
    }

    location = /favicon.ico { access_log off; log_not_found off; }
    location = /robots.txt  { access_log off; log_not_found off; }

    error_page 404 /index.php;

    location ~ \.php$ {
        fastcgi_pass unix:/var/run/php-fpm/php-fpm.sock;
        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;
        include fastcgi_params;
    }

    location ~ /\.(?!well-known).* {
        deny all;
    }
  }

docker-compose の起動

//コンテナをビルド
make build = docker-compose build --no-cache --force-rm
//コンテナを作成する
make up = docker-compose up -d
//全コンテナを起動する
docker start $(dokcer ps -a -q)
⚠makefileがない場合はdockerコマンドを入力してください

結果

https://(ご自身のアドレス)を入力して接続すると下記のようにhttps通信ができました!
最近のブラウザはhttps通信を要求してくるので環境を整えて開発することをおすすめします
お読み頂きましてありがとうございました。
スクリーンショット (41).png

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

【Laravel】外部制約キーを設定しているデータを論理削除してみた

はじめに

外部制約キーを設定しているデータは、通常テーブルから削除する事ができない。
ただ、DBのテーブルからデータを削除には論理削除物理削除の2種類ある。
先ほど挙げた通常の削除とは物理削除の事を指します。
では、物理削除の場合はどうなるのか、検証していくぅ!

マイグレーション作成

外部制約キーを使用するために、まずテーブルを2つ用意しましょう。
親テーブルには論理削除の為に、deleted_atカラムを用意しましょう。

CreateSchoolsTable
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('schools', function (Blueprint $table) {
            $table->id();
            $table->timestamps();
            $table->softDeletes('deleted_at', 0);
        });
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::dropIfExists('parent');
    }

子テーブルにはForeignKeyを指定しましょう。

CreateStudentsTable
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('students', function (Blueprint $table) {
            $table->id();
            $table->foreignId('school_id')->constrained();
            $table->timestamps();
        });
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::dropIfExists('child');
    }

はいこれでおけい。

Model作成

はい次ぃー、Modelの作成をしていきましょう。
親テーブルのモデルは論理削除を行いたいので、SoftDeleteを使用します。

School
use Illuminate\Database\Eloquent\SoftDeletes;

class School extends Model
{
    use SoftDeletes;
}

次に子テーブルのモデルのカラムは親のテーブルのIDだけですので、これだけ。

Student
class Student extends Model
{
    protected $fillable = [
        'school_id'
    ];
}

削除してみる

まずは、外部制約キーが動いているか確認する為に物理削除してみる。
まずはSchoolモデルのSoftDeleteをコメントアウトして、削除してみた。
スクリーンショット 2020-06-03 23.53.27.png
英語で何て書いてあるかよく分かりませんが、外部制約キーの関係で削除できませんと書いてあるのでしょう。

次にSchoolモデルのSoftDeleteをコメントアウトを解錠して論理削除して見ましょう。

School
{
    "id":1,
    "created_at":null,
    "updated_at":"2020-06-03T14:59:17.000000Z",
    "deleted_at":"2020-06-03T14:59:17.000000Z"
}

deleted_atに論理削除された時刻が挿入されています、論理削除成功ですね。
ちなみに、Schoolのidが1のデータはDB上には残っていますが、取得をしようとするとnullで返ってきます。
しっかりしていますね。

結果

DBからデータが無くなっている訳ではないんだから論理削除できて当たり前だよね。
また気になることがあれば検証していきますぅ!
ではまた。

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

Laravel API データポスト時のバリデーションで弾かれた後、http://127.0.0.1:8000/にリダイレクトしてしまう

目的

  • Laravel APIのバリデーションでpostデータが弾かれた時に初期画面にリダイレクトしてしまう問題を解決した話をまとめる

実施環境

  • ハードウェア環境
項目 情報
OS macOS Catalina(10.15.3)
ハードウェア MacBook Pro (16-inch ,2019)
プロセッサ 2.6 GHz 6コアIntel Core i7
メモリ 16 GB 2667 MHz DDR4
グラフィックス AMD Radeon Pro 5300M 4 GB Intel UHD Graphics 630 1536 MB
  • ソフトウェア環境
項目 情報 備考
PHP バージョン 7.4.3 Homwbrewを用いて導入
Laravel バージョン 7.0.8 commposerを用いて導入
MySQLバージョン 8.0.19 for osx10.13 on x86_64 Homwbrewを用いて導入

前提情報

  • LaravelをAPIサーバとして使用してる。
  • http://127.0.0.1:8000/api/infomationにDBに格納して欲しいデータを持たせてpostした時にバリデーションチェックを行う実装をした。
  • バリデーションにより弾かれた時はJSONで下記の様なレスポンスが欲しい。

    {
        "summary": "バリデーションによりこのリクエストは拒否されました",
        "errors": {
            "infomation_title": [
                "infomation title は必須です"
            ]
        }
    }
    

問題

  • バリデーションで弾かれた際にhttp://127.0.0.1:8000/のhtmlがレスポンスとして帰ってきてしまう。

    • 下記にレスポンスとして得られたhttp://127.0.0.1:8000/のコードの一部を記載する。

      スクリーンショット 2020-05-26 12.47.45.png

原因

  • バリデーションルールが記載されているファイルの継承元であるアプリ名ディレクトリ/vendor/laravel/framework/src/Illuminate/Validation/ValidatesWhenResolvedTrait.phppublic function validateResolved()らへんが悪さをしている様である。
  • このためバリデーションルールが記載されているファイルはFormRequest::failedValidation()でバリデーションで弾かれた際にリダイレクトを行っているらしいのでこの部分の設定をバリデーションルールが記載されているファイルで上書き(オーバーライド)してあげる。

解決方法

  1. 関数のオーバーライド

    1. 下記コマンドを実行してバリデーションルールが記載されたファイルを開く。

      $ vi アプリ名ディレクトリ/app/Http/Requests/StoreContentPost.php
      
    2. 下記の内容をclass StoreContentPost extends FormRequest内に記載する。

      アプリ名ディレクトリ/app/Http/Requests/StoreContentPost.php
      public function failedValidation(Validator $validator)
      {
          $response['summary'] = 'バリデーションによりこのリクエストは拒否されました';
          $response['errors']  = $validator->errors()->toArray();
      
          throw new HttpResponseException(
              response()->json($response)
          );
      }
      
  2. 確認

    1. あえてバリデーションで弾かれるデータを付与し、外部アプリからhttp://127.0.0.1:8000/api/infomationにpostする。
    2. 下記の様に期待値のレスポンスが帰ってくる事を確認する。

      スクリーンショット 2020-05-26 13.34.45.png

付録

  1. バリデーションルールが記載されたファイルの全体を下記に記載する。

    アプリ名ディレクトリ/app/Http/Requests/StoreContentPost.php
    <?php
    
    namespace App\Http\Requests;
    
    use Illuminate\Foundation\Http\FormRequest;
    
    //下記を追加する
    use Illuminate\Contracts\Validation\Validator;
    use Illuminate\Http\Exceptions\HttpResponseException;
    //上記までを追加する    
    
    j
    class StoreContentPost extends FormRequest
    {
        /**
         * Determine if the user is authorized to make this request.
         *
         * @return bool
         */
        public function authorize()
        {
            return true;
        }
    
        /**
         * Get the validation rules that apply to the request.
         *
         * @return array
         */
        public function rules()
        {
            return [
                'infomation_title' => 'required',
                'infomation_content' => 'required',
                'infomation_period_start_date' => 'required|max:8',
                'infomation_period_end_date' => 'required|max:8',
            ];
        }
    
        public function failedValidation(Validator $validator)
        {
            $response['summary'] = 'バリデーションによりこのリクエストは拒否されました';
            $response['errors']  = $validator->errors()->toArray();
    
            throw new HttpResponseException(
                response()->json($response)
            );
        }
    }
    

参考文献

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