- 投稿日:2020-06-04T23:18:25+09:00
テイクアウトしている店舗の掲載、閲覧サービス 『Take Out』
http://xs344052.xsrv.jp/takeout
DB
店舗ユーザーテーブル(usersテーブル)
名前 カラム名 データ型 制約 ユーザーID id integer primary, not null ユーザー名 name string not null メールアドレス 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、詳細情報を新規登録してない場合とすでに登録している場合でボタンの表示を変える。
の方法が良いと思うのでこれから改善していきます。デザイン
掲載する店舗やメニューの写真が主役なので邪魔にならない配色を心がけました。
文字情報は優先順位で文字の大きさや色を変えました。例えば、店名は大きく見やすくし、電話番号は注文する時すぐにわかるように赤色にし、店舗情報の一番下に配置しました。
- 投稿日:2020-06-04T22:07:05+09:00
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'),.envDB_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_tableapp/database/migrationspublic 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/seedsclass 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/factoriesuse 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)
- 投稿日:2020-06-04T17:37:56+09:00
【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だろうが、なんだろうが、値が、そのままセットされるようになります。■おわりに
見ての通り、ミューテタそのものは無効になっておりません(;^ω^)
あくまで疑似的に無効化しているだけのため、少し不格好です。。。
- 投稿日:2020-06-04T14:15:30+09:00
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してたーーーーーー!!
やー、無意識って怖いっすね。今回はいい勉強になりました。
- 投稿日:2020-06-04T14:15:30+09:00
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してたーーーーーー!!
やー、無意識って怖いっすね。今回はいい勉強になりました。
- 投稿日:2020-06-04T12:49:34+09:00
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 }以上
- 投稿日:2020-06-04T12:20:53+09:00
【エラー解決備忘録】[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)参考サイト
- 投稿日:2020-06-04T12:16:03+09:00
【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
という文字列をセットしました。ミューテタを定義する利点としては、
モデル呼び出し元で同じような処理を記述する必要がなくなります。
どんな場合も共通して加工してセットしたいという場合に役に立ちます。
- 投稿日:2020-06-04T12:16:03+09:00
【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
という文字列をセットしました。ミューテタを定義する利点としては、
モデル呼び出し元で同じような処理を記述する必要がなくなります。
どんな場合も共通して加工してセットしたいという場合に役に立ちます。
- 投稿日:2020-06-04T12:07:59+09:00
Laravelのコントローラ をコピって使ってたら死んだ!
Laravelのマイグレーションファイルやコントローラ などは、コマンドで作るのも面倒なのでコピーして作ってました。
作っている内に最適化できることに気づいて、古いコントローラ をコピーして名前を変えてバックアップようとして残し、新しいコントローラ に移管することを試みました。
しかし、なぜか名前を変えたはずの古いコントローラ を読んでしまう。。
「消えろや!」と、いっそ消してしまったら、「見つかりません」エラーが出てサービスが利用不能に。。https://qol-kk.com/wp2/blog/2018/11/23/post-943/
ありがとう先輩方。。
composerにキャッシュ的に記録されていて、それを読んで振り分けている的な動きだったのですね。。
composer dump-autoload
こちらのコマンドで、即解決。
- 投稿日:2020-06-04T10:53:39+09:00
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!」に相当する画面です。このおしゃれな画面を表示させることを達成したい。
手順
プログラミングスクールに通っているので、「Homebrew」のインストールなどは完了しています。よって、あくまで私の環境での手順になりますが、以下のように進めます。
- brewのバーション確認
- Composerのインストール
- PHPのインストール
- Laravelのインストール
- Laravelコマンドを利用するためにPATHを通す
- Laravelプロジェクト用のディレクトリを作成
- Laravelプロジェクトの新規作成
- ローカルサーバーで確認
参考にさせていただいた記事
Laravel公式ドキュメント
Mac用 Laravelをインストールする @S-Masakatsu様
Mac Laravelの環境構築時にエラーが出た話 vol.1 @miriwo様
ターミナル上で「laravel」コマンドを使えるようにパスを通す @m24様brewのバーション確認
スクールのカリキュラムでHomebrewはすでにインストール済みですが、念のため確認を行いました。インストールできているか確認するのには、バーション確認のコマンドを打つのが定番のようですね。私の場合は、バージョンが表示されたのでOKということになりました。
ターミナル$ brew -vComposerのインストール
ComposerはPHPのパッケージ管理ツールと呼ばれるもので、必要なライブラリを一括でインストールできるもののようです。RubyのライブラリはGemと呼ばれ、それらをまとめてインストールするためにBundlerを使用しました。ターミナルで「bundle install」したやつです。実際にBundlerとComposerでは挙動が異なるようですが、大まかな認識としてはそういったものになります。
つまり、Laravelでアプリケーション開発をするのに必須!というわけです。ターミナル$ brew install composer正しくインストールが完了すれば、以下のコマンドでComposerのバージョン確認を行えます。
ターミナル$ composer -vPHPのインストール
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 -vLaravelのインストール
本命である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_profileLaravelプロジェクト用のディレクトリを作成
スクールでは、「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」 にアクセスします。以下の画面が表示されれば成功です。
VSコードでもアプリケーションディレクトリを開くことができます。
次に達成したいこと
laravelの導入が完了したので、次はGit管理やPHPの記述が楽になりそうなVSコードのライブラリを探そうと思います。いつでもコードが書ける状態になったら本格的にPHPの勉強と開発に着手します。ここまで読んでいただきありがとうございました。
- 投稿日:2020-06-04T10:00:57+09:00
laravel 値があった場合のみバリデーション
- 投稿日:2020-06-04T09:32:40+09:00
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.confserver { 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
- 投稿日:2020-06-04T07:32:26+09:00
[mysql,laravel]あるカラムで重複を持つレコードだけをまとめずに全て呼び出す方法
何をした?
operationsテーブルから"第三工種"というカラムで重複するレコードに付随しているデータの塊を作りたいと考えました。
具体的には"第三工種"に"土工"というレコードが複数ある場合、それ以降の”第四工種”以降が"埋め戻し"のものや”掘削"のものなどに分岐します。
それを”第三工種に土工を持つもの全て"で一括りの配列にして、呼び出したいと考えました。失敗した方法
ひとことで言うと、クエリによる処理でなく配列処理で対応しようとしたらドツボにはまりました。
※詳細(分かりにくいので、お急ぎの方は読まなくて大丈夫です)
まずテーブルから全レコードを呼び出し、
distinct()
で重複を絞った後、その"id"を持つ"第三工種"を抜き出します。その"第三工種"のレコードを持つものをforeach
とarray_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でインデックス番号をふって、そのインデックス番号でページを分けて表示しました。
参考
- 投稿日:2020-06-04T02:42:33+09:00
Call to undefined method Illuminate\Database\Eloquent\Builder::toArray() の解決例
エラー文の様子
どんなエラー?
app/Http/Controllers/RecordTimingControllerpublic 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/RecordTimingControllerpublic 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(); }
- 投稿日:2020-06-04T00:29:20+09:00
ローカル環境で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というパッケージ管理ツールをインストールします①スタートメニューを右クリックしてコマンドプロンプトを管理者権限で開く
②コマンドか公式サイトからChocolateyインストール・コマンド C:\>Chocolatey Install Chocolatey v0.10.15C:\>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/backendDockerfileの記述
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/backenddefault.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通信を要求してくるので環境を整えて開発することをおすすめします
お読み頂きましてありがとうございました。
- 投稿日:2020-06-04T00:29:20+09:00
ローカル環境で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というパッケージ管理ツールをインストールします①スタートメニューを右クリックしてコマンドプロンプトを管理者権限で開く
②コマンドか公式サイトからChocolateyインストール・コマンド C:\>Chocolatey Install Chocolatey v0.10.15C:\>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/backendDockerfileの記述
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/backenddefault.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通信を要求してくるので環境を整えて開発することをおすすめします
お読み頂きましてありがとうございました。
- 投稿日:2020-06-04T00:20:13+09:00
【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を使用します。Schooluse Illuminate\Database\Eloquent\SoftDeletes; class School extends Model { use SoftDeletes; }次に子テーブルのモデルのカラムは親のテーブルのIDだけですので、これだけ。
Studentclass Student extends Model { protected $fillable = [ 'school_id' ]; }削除してみる
まずは、外部制約キーが動いているか確認する為に物理削除してみる。
まずはSchoolモデルのSoftDeleteをコメントアウトして、削除してみた。
英語で何て書いてあるかよく分かりませんが、外部制約キーの関係で削除できませんと書いてあるのでしょう。次に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からデータが無くなっている訳ではないんだから論理削除できて当たり前だよね。
また気になることがあれば検証していきますぅ!
ではまた。
- 投稿日:2020-06-04T00:18:25+09:00
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がレスポンスとして帰ってきてしまう。原因
- バリデーションルールが記載されているファイルの継承元である
アプリ名ディレクトリ/vendor/laravel/framework/src/Illuminate/Validation/ValidatesWhenResolvedTrait.php
のpublic function validateResolved()
らへんが悪さをしている様である。- このためバリデーションルールが記載されているファイルは
FormRequest::failedValidation()
でバリデーションで弾かれた際にリダイレクトを行っているらしいのでこの部分の設定をバリデーションルールが記載されているファイルで上書き(オーバーライド)してあげる。解決方法
関数のオーバーライド
下記コマンドを実行してバリデーションルールが記載されたファイルを開く。
$ vi アプリ名ディレクトリ/app/Http/Requests/StoreContentPost.php下記の内容を
class StoreContentPost extends FormRequest
内に記載する。アプリ名ディレクトリ/app/Http/Requests/StoreContentPost.phppublic function failedValidation(Validator $validator) { $response['summary'] = 'バリデーションによりこのリクエストは拒否されました'; $response['errors'] = $validator->errors()->toArray(); throw new HttpResponseException( response()->json($response) ); }確認
付録
バリデーションルールが記載されたファイルの全体を下記に記載する。
アプリ名ディレクトリ/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) ); } }参考文献