20200322のlaravelに関する記事は10件です。

Laravel 6.Xで新しくなったログイン認証を導入した話

こちらは、
KPI 項目B:「Laravelの勉強をする」
のアウトプット記事です。

本編

今回はLarave 6.0で新しくなった認証機能を試しました。

準備

Laradockで環境の用意。
今回は以下の環境。

パッケージ バージョン
Ubuntu 16.04.6
PHP 7.3.15
PostgreSQL 9.6.17
Laravel 7.2.2

Node.jsのインストール

Dockerのコンテナ内でnpmが使えるようにNode.jsをインストールします。

Laradockの環境設定を変更し

.env
WORKSPACE_INSTALL_NODE=true # DockerへNode.jsをインストールする。

コンテナの再ビルド

docker-compose build stop
docker-compose build workspace
docker-compose up -d --build workspace

認証機能のコマンド実行

何はともあれWorkspaceコンテナへログイン。

docker-compose exec --user=laradock workspace bash

先にUsersテーブルのマイグレーション。

php artisan migrate:refresh --seed

composerを使って、laravel/uiライブラリをインストール後、Artisanコマンドを実行。

composer require laravel/ui
php artisan ui vue --auth

NPMでモジュールのインストール

npm install 
npm run dev

登録画面

ベースデザインは以前と変わらないよう。
SCSSやVUEといった要素が使われるようになっていた。

image.png

参考

Authentication(Laravel - Official)
Laravel 7.x 認証

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

【Laravel】投稿日時を「X秒前」「X分前」「X時間前」というように相対表示させたい

はじめに

TwitterなどのSNSのように投稿日時が下記のように相対表示するように、日時を変換する処理を記述していたのですが、Carbonライブラリでは既にdiffForFumans()メソッドが用意されていたので、ご紹介します。

0秒 ≦ X < 60秒 の場合 => 「X秒前」
60秒 ≦ X < 3600秒 の場合 => 「X分前」
3600秒 ≦ X < 86400秒 => 「X時間前」
86400秒 ≦ X < 604800秒 => 「X日前」
604800秒 ≦ X < 2764800秒 => 「X週間前」
2764800秒 ≦ X < 31536000秒 => 「Xケ月前」
31536000秒 ≦ X => 「X年前」

実装

$content->created_at->diffForHumans();

最後に

以上です。
プライベート関数でcreated_atを引数にとって、条件分岐で経過時間を相対表示できるように処理を記述していたのですが、diffForFumans()で代用できるなんて便利ですね!!

他にも色々とカスタマイズできるので、詳しくは公式ドキュメントを確認してみてください。

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

laravel 7.xでmake:authの代わりに打つコマンド

結論:代わりに↓をコマンドラインに打ってください

composer require laravel/ui

php artisan ui vue --auth

laravel new blog --auth

ソース

laravel公式ドキュメント-該当ページ

きっかけ:php artisan make:authと入力したら「そんなコマンド無いよ」とlaravelがエラーメッセージを返した

今まで使ってたのが5系で、初めて7系で認証機能付けようとしたら↓のエラーが出ました。

 Command "make:auth" is not defined.

「あれ」と思って公式ドキュメント見たらmake:auth機能なくなってたことに気付きました。

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

Laravelのbladeにて、多重のforeachを使って複数の配列を元にhtmlを表示する

実現したいこと

例えば不動産システムを例にした時に、複数の配列の情報を元に、
「物件情報のjsonを参考にリストで表示し、isLivedがtrueのものだけ 背景の色をグレーにしたい」
に近いことがしたいと思った時、$loopがとても便利だったのでメモ。

sample.json
                "price": [{
                    "place_1": 60000,
                    "place_2": 85000,
                    "place_3": 90000,
                    "place_4": 80000,
                    "place_5": 80000,
                    "place_6": 100000
                }],
                "isLived": [{
                    "place_1": null,
                    "place_2": null,
                    "place_3": null,
                    "place_4": null,
                    "place_5": null,
                    "place_6": true
                }]

実装例

sample.blade.php
        @foreach ( $sample['rental_apartments'] as $rental_apartment )
          <div class="h40 w-100 border">
              <div class="d-flex flex-wrap">
                @foreach ($rental_apartment["isLived"][0] as $rental_apartment_isLived)
                  @if ($rental_apartment_isLived !== null)
                  <div class="bg-grey">
                    @foreach ($rental_apartment["depth"][0] as $rental_apartment_price )
                      @if ($loop->parent->index === $loop->index)
                          {{ $rental_apartment_price }}
                      @endif
                    @endforeach
                  </div>
                  @elseif($rental_apartment_isLived === true)
                  <div>
                    @foreach ($rental_apartment["price"][0] as $rental_apartment_price )
                      @if ($loop->parent->index === $loop->index)
                          {{ $rental_apartment_price }}
                      @endif
                    @endforeach
                  </div>
                  @endif
                @endforeach
              </div>
          </div>
        @endforeach

アプローチとしては、
多重のforeachの中で、
$loop->parent->index === $loop->index

を突き合わせることで、同じ順番の要素の時だけが判定されるようにしている。

そもそもjson構造はこうあるべきでないとか、書き方が冗長なんじゃないかとか、、もっとループの計算量は少なくできるんじゃないかとか、色々と余地がありそうだが一旦公開してみる。

参考記事

【Laravel】foreach文における$loop変数に感動した

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

Laravel セッションを使って一時的に値を保存しよう!

目的

  • Larvelでセッションを使う方法は理解したらとても便利だったため忘れない様にまとめる
  • DBは使用せずとにかくセッションを開く部分だけを紹介する

考え方

  • 「値に名前をつけて保存する」と「値が必要な時に名前を指定して取得する」の処理を利用するだ毛である。
  • 各クライアントのセッションIDという物と値の名前がそれぞれリンクして保存される。(これは値保存の概念として知っておいて欲しいが、セッションIDがクライアントに勝手に割り振られるため知らなくても実装できる)

書き方の例

  • 値に名前をつけて保存する方法を下記に記載する。

    session()->put('セッションに入れる値の名前', セッションに入れる値);
    
  • セッションに入れた値を取り出す方法を下記に記載する。

    取り出した値を格納する変数 = session()->get('セッションに入れた値の名前')
    

より具体的な例

  • 「Hello world」という文字列のセッションに入れてみる。
  • セッションに入れる際の値につける名前はstrとする。
  • セッションから値を受け取る時に格納する変数は$out_putとする。
  • 任意のコントローラに下記を記載する。

    session()->put('str', 'Hello world');
    
  • 別のコントローラに下記を記載する。

    $out_put = session()->get('str');
    
  • 上記の実行後、$out_putには文字列「Hello world」が入っている。

    • コントローラの変数をビューで表示する方法はこちら
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Laravel リレーションの取得 withメソッド

withでeagerloadする

紐づいたテーブルから大量にデータ取得する場合、何度もDBアクセスしてデータを取得するとレスポンスがわるくなるので、リレーションを取得するときはwithを使う。

使い方

下記のようにするとwithメソッドが利用可能

Model::with('リレーション名')->get();

実際の例

1対多の関係(Personが複数のBoardを持っている)
親:person
 ・[id, name, email, age]
子:Board
 ・[id, person_id, title, message]
withを使うと下記のような流れで値を取得できる。
※hasMany, belongsTo等、正しく設定されていること前提
①Boardだけを取得
②取得したBoardのperson_idの値をまとめ、それらのIDのPersonを取得

Board.php
$boards = Board::with('person')->get();
return view('boards.index', ['boards' => $boards])
Boards/index.blade.php
# こうすると親の値も取得できる
@foreach($boards as $board)
  <p>{{ $board->message }}</p>
  <p>{{ $board->person->name }}</p>
@endforeach

上記は子から親を取得しているが、これの逆パターンをすれば親から子の取得も可能

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

Laravel7 消えたpassword_resetsテーブルを追え

Laravel7がリリースされまして初記事です。

事件発生

事件はLaravel7をインストールした時、起こりました。

$ composer create-project --prefer-dist laravel/laravel .
$ php artisan -V
Laravel Framework 7.2.2

$ ls -1 ./database/migrations
2014_10_12_000000_create_users_table.php
2019_08_19_000000_create_failed_jobs_table.php

password_resets ファアイルが消えた...!?

失踪したファイル

ファイルが削除されてしまっていた...!

転がり込んだファイル

laravel/ui ライブラリに移動されました。

検証

laravel/ui インストール

$ composer require laravel/ui

$ composer show laravel/ui
name     : laravel/ui
descrip. : Laravel UI utilities and presets.
keywords : laravel, ui
versions : * v2.0.1
type     : library
license  : MIT License (MIT) (OSI approved) https://spdx.org/licenses/MIT.html#licenseText
source   : [git] https://github.com/laravel/ui.git 47a0a1dac76f5e73803c86e1f38b2c7e0ae7fa83
dist     : [zip] https://api.github.com/repos/laravel/ui/zipball/47a0a1dac76f5e73803c86e1f38b2c7e0ae7fa83 47a0a1dac76f5e73803c86e1f38b2c7e0ae7fa83
path     : /work/vendor/laravel/ui
names    : laravel/ui
$ php artisan ui vue --auth

$ ls -1 ./database/migrations
2014_10_12_000000_create_users_table.php
2014_10_12_100000_create_password_resets_table.php
2019_08_19_000000_create_failed_jobs_table.php

--auth オプションを付けて実行した際に認証系のファイルが生成されますが、その際に 2014_10_12_100000_create_password_resets_table.php ファイルも生成されました。

謎はすべて解けた!

補足

ui vue で生成されるファイル一覧

$ php artisan ui vue
package.json
resources/js/app.js
resources/js/bootstrap.js
resources/js/components/ExampleComponent.vue
resources/sass/_variables.scss
resources/sass/app.scss
webpack.mix.js

ui vue --auth で生成されるファイル一覧

$ php artisan ui vue --auth
app/Http/Controllers/Auth/ConfirmPasswordController.php
app/Http/Controllers/Auth/ForgotPasswordController.php
app/Http/Controllers/Auth/LoginController.php
app/Http/Controllers/Auth/RegisterController.php
app/Http/Controllers/Auth/ResetPasswordController.php
app/Http/Controllers/Auth/VerificationController.php
app/Http/Controllers/HomeController.php
database/migrations/2014_10_12_100000_create_password_resets_table.php
resources/views/auth/login.blade.php
resources/views/auth/passwords/confirm.blade.php
resources/views/auth/passwords/email.blade.php
resources/views/auth/passwords/reset.blade.php
resources/views/auth/register.blade.php
resources/views/auth/verify.blade.php
resources/views/home.blade.php
resources/views/layouts/app.blade.php
routes/web.php
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Laravel7 password_resetsテーブルはどこに消えた?

Laravel7がリリースされまして初記事です。

事件発生

事件はLaravel7をインストールした時、起こりました。

$ composer create-project --prefer-dist laravel/laravel .
$ php artisan -V
Laravel Framework 7.2.2

$ ls -1 ./database/migrations
2014_10_12_000000_create_users_table.php
2019_08_19_000000_create_failed_jobs_table.php

password_resets ファアイルが消えた...!?

失踪したファイル

ファイルが削除されてしまっていた...!

転がり込んだファイル

laravel/ui ライブラリに移動されました。

検証

laravel/ui インストール

$ composer require laravel/ui

$ composer show laravel/ui
name     : laravel/ui
descrip. : Laravel UI utilities and presets.
keywords : laravel, ui
versions : * v2.0.1
type     : library
license  : MIT License (MIT) (OSI approved) https://spdx.org/licenses/MIT.html#licenseText
source   : [git] https://github.com/laravel/ui.git 47a0a1dac76f5e73803c86e1f38b2c7e0ae7fa83
dist     : [zip] https://api.github.com/repos/laravel/ui/zipball/47a0a1dac76f5e73803c86e1f38b2c7e0ae7fa83 47a0a1dac76f5e73803c86e1f38b2c7e0ae7fa83
path     : /work/vendor/laravel/ui
names    : laravel/ui
$ php artisan ui vue --auth

$ ls -1 ./database/migrations
2014_10_12_000000_create_users_table.php
2014_10_12_100000_create_password_resets_table.php
2019_08_19_000000_create_failed_jobs_table.php

--auth オプションを付けて実行した際に認証系のファイルが生成されますが、その際に 2014_10_12_100000_create_password_resets_table.php ファイルも生成されました。

謎はすべて解けた!

補足

ui vue で生成されるファイル一覧

$ php artisan ui vue
package.json
resources/js/app.js
resources/js/bootstrap.js
resources/js/components/ExampleComponent.vue
resources/sass/_variables.scss
resources/sass/app.scss
webpack.mix.js

ui vue --auth で生成されるファイル一覧

$ php artisan ui vue --auth
app/Http/Controllers/Auth/ConfirmPasswordController.php
app/Http/Controllers/Auth/ForgotPasswordController.php
app/Http/Controllers/Auth/LoginController.php
app/Http/Controllers/Auth/RegisterController.php
app/Http/Controllers/Auth/ResetPasswordController.php
app/Http/Controllers/Auth/VerificationController.php
app/Http/Controllers/HomeController.php
database/migrations/2014_10_12_100000_create_password_resets_table.php
resources/views/auth/login.blade.php
resources/views/auth/passwords/confirm.blade.php
resources/views/auth/passwords/email.blade.php
resources/views/auth/passwords/reset.blade.php
resources/views/auth/register.blade.php
resources/views/auth/verify.blade.php
resources/views/home.blade.php
resources/views/layouts/app.blade.php
routes/web.php
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

laravel-ide-helperの"Str"と"Arr"がphpstormでコード補完されない

起きたこと

laravel-ide-helperを入れてvscodeで開発していたが、気分でphpstormに切り替えたら全然コード補完してくれない。phpstormでも使いたいので直し方を記す。拡張機能はそれぞれ、vscodeにintelephense、phpstormにはlaravelくらいしか入れていない。

phpstorm
1dfd7b29247b1751db1488f624b49485.gif

vscode
7ae9a559dba30c7b58d1289161bf4762.gif

原因

大体の流れはこれ
Laravel added aliases for 'Arr' and 'Str' no autocomplete from helper #784
昨年2月にlaravel本体でマージされたalias追加でide-helperに不具合が生じた。対応は誰か試みたらしいがテストが通らないっぽくて放置されてる。

直し方

生成した"_ide_helper.php"のnamespaceをコメントアウト(または削除)する。
ba063115db4811efd422820b212549f9.png

コメントアウトすると補完される。
59cdfa7915b72c54394f910e2c7f6b03.gif

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

久しぶりのvagrant upでつまづいた話

はじめに

Laravelを少し触ったことがある程度の初心者なので,ガッツリ開発をしている方々は”それって当たり前だよね?”と思うかもしれませんが,ご了承ください.

問題発生

久しぶりにLaravelを触ってみようと思い,Homesteadの設定をしていたところ,
vagrant up
させたところで…

エラー
/opt/vagrant/embedded/lib/ruby/2.4.0/psych.rb:377:in `parse': (<unknown>): mapping values are not allowed in this context at line 14 column 9 (Psych::SyntaxError)

というエラーが発生しました.

このエラー,よく見るとrubyがどうのこうのって書いてあります.
あれ?rubyなんて使ったことないし,これLaravelの環境構築なんだけどな…

原因

エラー文をググってみると,同じように困っている方がいました.
この記事によると,map:の後に半角スペースが足りないことが原因でした.

間違い
folders:
    - map:/Users/code 
      to: /home/vagrant/code
正しい
folders:
    - map: /Users/code 
      to: /home/vagrant/code

え?そこのスペース大事だったんだ…
と気づかされました.

map:の後ろに半角スペースを追加したところ,無事vagrant upが実行出来ました!

参考文献

homestead laravel vagrant not allowed windows

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