20210909のlaravelに関する記事は8件です。

PHPの業務経験6ヶ月で初めてOSSにContributeした話

注) これはポエムです。 背景 エンジニアとして働き始めてから、OSSへのContributionに強いあこがれがあったが ヨワヨワエンジニアの自分がOSSのコードなんていじれるのだろうか そもそもOSSのコードに自分が介入する余地なんてないんじゃないか なんて考えていた。 しかしやってみたら心配は杞憂だった。 OSSにContributionしたいと思っている人の参考になればと、自分がやったことをメモ。 筆者のスペック (当時) エンジニア歴 1年半 PHP, Laravelの業務経験 半年 Contributeまでの軌跡 業務でとあるOSSを使う LaravelにはExcelファイルをインポート、エクスポートできるLaravel Excelというライブラリがある。 業務で開発中のプロジェクトでこれを使う機会があったのだが、これが結構よくできたライブラリで1、とても簡単にExcelエクスポート機能等を実装できる。2 キャッチアップを兼ねてサンプルアプリを作成する よくできたライブラリなので使いまくったら学びがあると思い、Qiitaの記事等に使用方法をまとめた。 記事を書く際は、サンプルプロジェクトを作ってGithubにコードをアップし、手を動かすことを心がけた。 おや?バグか? ドキュメントに従って実装しテストコードを書いていると、仕様を満たしているのにエラーになるアサーションメソッドを発見 該当のアサーション // 何故か正しくアサーションしてくれない Excel::assertQueuedWithChain([ new NotifyUserOfCompletedImport($user, $file->getClientOriginalName()) ]); Maintainerに質問する いくらコードを見直しても正しくアサーションしてくれないので、GithubのdiscussionでOSSのメンテナに質問。 4〜5時間程度で回答がありました。 え? その方法ではアサーションしてくれないんすか??? 誰も直さないので直す。 簡単にいうとテスト用アサーションメソッドの実装漏れで、誰が気にすんねん的な機能だった3が、 もしかして今がOSSにContributionする絶好のチャンスなのでは?と感じて直す。 ちなみに修正自体は決して難しいものではなく20行程度のもの。 より細かい手順はこんなかんじ。 対象のリポジトリをforkしてclone Contributingガイドラインの確認 テストが動くように環境構築 テストコードの追加 修正 phpunitで確認 念の為、手動でも確認 テスト用DBの用意や古い依存関係の解決など、テストコードを動かすための環境構築が結構大変だった。 またContributingガイドラインではContributionのルール等が細かく書かれており コミュニケーションを取る上でのエチケット 機能追加時には本当にその機能が必要とされているか バグ報告のやり方 など非常に勉強になることが多く書かれていた。 PRの作成 PRの要件を確認すると テストコード必須 ドキュメントへの追記 クリーンなコードへの配慮 PRの粒度 などに言及があるので、それぞれの要件を確認。 また過去に出されたPRの中で丁寧に書かれているものをベースにし、PRを作成する。 PRを出す いよいよ修正のPRを送る。(めっちゃ緊張しました。 1時間程度であっけなくマージ完了。 感想 修正自体は意外にあっさりしていて、プロジェクトの作法的なところをキャッチアップするのに時間がかかりました。 でも無事にマージされたときは自分でも驚くほど嬉しかったです。 もちろん修正内容は大したことないしライブラリの根幹となる機能でもないですが、やはり自分のコードが世界中に配布されるという事実は自分でも驚くほどの高揚感をもたらしました。 あとドキュメントを読み込むので必然的にtypoに気づきやすくなります。 * ドキュメントの修正PRも出せる 結言 よわよわエンジニアでもそこそこ規模のあるOSSにContributeできたので、同じようにContributeしたいと思っている方の参考になれば幸いです。 自分比  ↩ 実装例 ↩ 詳しくはdiscussionを参照いただきたく。 ↩
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

SQLSTATE[HY000]: General error: 1824 Failed to open the referenced table '〇〇s' (SQL: alter table `△△s` add constraint `△△s_〇〇_id_foreign` foreign key (`〇〇_id`) references `〇〇s` (`id`))

経緯 Laravel8でsail artisan migrateを実行したときに出たエラーです。Usersテーブル(親テーブル)と、外部キーuser_idを持つPostsテーブル(子テーブル)があるとして書いていきます。2つのテーブルのためのマイグレーションファイルを作り、テーブルを設定し、sail artisan migrateと実行すると SQLSTATE[HY000]: General error: 1824 Failed to open the referenced table 'users' (SQL: alter table `posts` add constraint `posts_user_id_foreign` foreign key (`user_id`) references `users` (`id`)) というエラーが出ました。 原因 エラーの内容は、「『posts』テーブルは外部キー『user_id』を持ってて『users』テーブルを参照しようとしているけど見つからないよ」というものです。これは、Postsテーブル(子テーブル)のマイグレーションファイルを作った後に、Usersテーブル(親テーブル)のマイグレーションファイルを作ったことが原因です。これにより、先にpostsテーブルを作ろうとしてしまい、参照したいusersテーブルがまだないのでエラーとなってしまいました。 解決策 先にUsersテーブル(親テーブル)後でPostsテーブル(子テーブル)を作ればPostsテーブルはUsersテーブルを参照できて、問題が解決します。ですので、sail artisan migrate:rollback(後述しますが、このときにもエラー発生します。)でロールバックした後に、現在の状態では、マイグレーションファイルの名前の日付が、子テーブルのほうが早くなっていますが、日付順を入れ替えます。 before 2021_09_07_234727_create_posts_table.php 2021_09_08_234727_create_users_table.php after 2021_09_08_234727_create_users_table.php 2021_09_09_234727_create_posts_table.php これで再度マイグレーションをすると無事成功します。 ロールバック時のエラー ロールバックを実行しようとすると、 SQLSTATE[HY000]: General error: 3730 Cannot drop table 'users' referenced by a foreign key constraint 'posts_user_id_foreign' on table 'posts'. (SQL: drop table if exists `users`) というエラーが出るかもしれません。(この例では起きないですが)。これは、Postsテーブル(子テーブル)が消されるまえにUsersテーブル(親テーブル)を消そうとしているため、「Postsテーブルのuser_idがUsersテーブルを参照してるから消せないよ」と言っているものです。usersテーブルのマイグレーションファイルにある、down時の設定をし忘れていることが原因で、ロールバック時に子テーブルを先に削除するように設定すると解決します。 before 2021_09_08_234727_create_users_table.php public function down() { Schema::dropIfExists('users'); } after 2021_09_08_234727_create_users_table.php public function down() { Schema::dropIfExists('posts'); Schema::dropIfExists('users'); } 参考 https://stackoverflow.com/questions/52377469/failed-to-open-the-referenced-table https://stackoverflow.com/questions/32524101/laravel-change-migration-order
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

外部キーを持つテーブルをマイグレーションした時のエラー'Failed to open the referenced table'の解決方法

経緯 Laravel8でsail artisan migrateを実行したときに出たエラーです。Usersテーブル(親テーブル)と、外部キーuser_idを持つPostsテーブル(子テーブル)があるとして書いていきます。2つのテーブルのためのマイグレーションファイルを作り、テーブルを設定し、sail artisan migrateと実行すると SQLSTATE[HY000]: General error: 1824 Failed to open the referenced table 'users' (SQL: alter table `posts` add constraint `posts_user_id_foreign` foreign key (`user_id`) references `users` (`id`)) というエラーが出ました。 原因 エラーの内容は、「『posts』テーブルは外部キー『user_id』を持ってて『users』テーブルを参照しようとしているけど見つからないよ」というものです。これは、Postsテーブル(子テーブル)のマイグレーションファイルを作った後に、Usersテーブル(親テーブル)のマイグレーションファイルを作ったことが原因です。これにより、先にpostsテーブルを作ろうとしてしまい、参照したいusersテーブルがまだないのでエラーとなってしまいました。 解決策 先にUsersテーブル(親テーブル)後でPostsテーブル(子テーブル)を作ればPostsテーブルはUsersテーブルを参照できて、問題が解決します。ですので、sail artisan migrate:rollback(後述しますが、このときにもエラー発生します。)でロールバックした後に、現在の状態では、マイグレーションファイルの名前の日付が、子テーブルのほうが早くなっていますが、日付順を入れ替えます。 before 2021_09_07_234727_create_posts_table.php 2021_09_08_234727_create_users_table.php after 2021_09_08_234727_create_users_table.php 2021_09_09_234727_create_posts_table.php これで再度マイグレーションをすると無事成功します。 ロールバック時のエラー ロールバックを実行しようとすると、 SQLSTATE[HY000]: General error: 3730 Cannot drop table 'users' referenced by a foreign key constraint 'posts_user_id_foreign' on table 'posts'. (SQL: drop table if exists `users`) というエラーが出るかもしれません。(この例では起きないですが)。これは、Postsテーブル(子テーブル)が消されるまえにUsersテーブル(親テーブル)を消そうとしているため、「Postsテーブルのuser_idがUsersテーブルを参照してるから消せないよ」と言っているものです。usersテーブルのマイグレーションファイルにある、down時の設定をし忘れていることが原因で、ロールバック時に子テーブルを先に削除するように設定すると解決します。 before 2021_09_08_234727_create_users_table.php public function down() { Schema::dropIfExists('users'); } after 2021_09_08_234727_create_users_table.php public function down() { Schema::dropIfExists('posts'); Schema::dropIfExists('users'); } 参考 https://stackoverflow.com/questions/52377469/failed-to-open-the-referenced-table https://stackoverflow.com/questions/32524101/laravel-change-migration-order
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Bootstrap フォームの色(枠)の変更方法

<form> <div class="form-group"> <input type="text" class="form-control"> </div> </form> ↓に変更 <form> <div class="form-group"> <input type="text" class="form-control border-success"> </div> </form> inputのclassの部分に border-success(今は緑色) を挿入するだけ!!! カラー表
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Laravel8でAdminLTE3を使用する方法

概要 この記事では、管理画面として有名なテンプレートAdminLTE3をLaravel8で使用する方法について記述していきます。 前提として、既にLaravelのセットアップは完了している事としています。 Laravel-AdminLTEをインストールする 下記の通りcomposerコマンドを使ってLaravel-AdminLTEをインストールします。 $ composer require jeroennoten/laravel-adminlte インストールが完了したら下記のコマンドでadminlteコマンドが使えるようになっている事を確認します。 $ php artisan list 上記のコマンドを実施した結果、下記のようなリストが表示されます。 adminlte adminlte:install Install all the required files for AdminLTE, and additional resources adminlte:plugins Manages the installation and removal of additional AdminLTE plugins adminlte:status Checks the installation status of the AdminLTE resources adminlte:update Update all the required assets for AdminLTE 念のため日本語解説版を紹介 adminlte adminlte:install AdminLTE に必要なすべてのファイル、および追加リソースをインストールします。 adminlte:plugins 追加のAdminLTEプラグインのインストールと削除を管理します。 adminlte:status AdminLTE リソースのインストールステータスをチェックします。 adminlte:update AdminLTE に必要なすべてのアセットをアップデートする。 では、早速インストールコマンドを実行! $ php artisan adminlte:install インストールが成功すると、下記の差分が出来上がります。 更新されたファイル composer.json composer.lock 新たに出来たやつ config/adminlte.php public/vendor/ resources/lang/vendor/ 上記の通りになっていれば、インストール完了です。 認証画面(View)の作成 下記のコマンドを実行して認証用のViewを作成します。 ViewはMVCのVの部分ですね。 $ php artisan adminlte:install --only=auth_views Authentication views installed successfully.と出れば成功です。 resources/views/authフォルダの中身が、AdminLTE用に置き換わっているはずです。 下記のようにresources\views\auth\login.blade.phpの中身を見るとadminlteの記述がちゃんとあるはずです。 @extends('adminlte::auth.login') 上記は、vendor/jeroennoten/laravel-adminlte/resources/views/login.blade.phpのファイルが参照されています。が参照されていることになります。 認証画面以外にもAdminLTEを適用する 下記のコマンドを実行しましょう。 php artisan adminlte:install --only=main_views すると、下記のようになります。 新しくできたやつ resources/lang/vendor/ resources/views/auth/ resources/views/vendor/ ログイン後の画面を作成する resources/views/home.blade.phpを下記のようにします。 @extends(‘adminlte::page’) @section(‘title’, ‘Dashboard’) @section(‘content_header’) <h1>Dashboard</h1> @stop @section(‘content’) <p>Welcome to this beautiful admin panel.</p> @stop @section(‘css’) <link rel=”stylesheet” href=”/css/admin_custom.css”> @stop @section(‘js’) <script> console.log(‘Hi!’); </script> @stop あとは、実際にログインしてみると、AdminLTEのデザインに置き換わっているはずです。 以上。 出典 下記のページを参考にさせていただきました。YOSHITAKAさんありがとうございます。 Laravel8でAdminLTE3をターミナルで導入して、インストールする方法。管理画面をサクッと作ろう。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Laravel date型カラムの取り扱いに注意

エラーの詳細 例えばUserモデルにdate型のbirthdayというカラムがあるとする。 このbirthdayを {{ $user->birthday->format('Y/m/d') }} {{ $user->birthday->format('Y年m月d日') }} 上記のようにフォーマットを変更して表示する場合、Userモデルに protected $dates = [ 'birthday' ]; とするとbirthdayはCarbonインスタンスとなるため、フォーマットを変更できる。 しかし、フォーマットを変更して表示している場合birthdayがnullだと下記のようなエラーになる。 Call to a member function format() on null (nullなのにメンバー関数format()を呼び出しています) エラーを回避するために下記のようなNull合体演算子を書いてみたが、それでもnullの場合、同じエラーになる。 {{ $user->birthday->format('Y/m/d') ?? '登録なし' }} これはのbirthdayのフォーマットを変更した上でnull判定しようとしているのだが、フォーマットを変更するタイミングでbirthdayがnullのため、やはり同じエラーが起こる。 解決策 birthdayのフォーマットを変更する前に条件分岐をすればいい。 // if文の場合 @if($user->birthday) {{ $user->birthday->format('Y/m/d') }} @else 登録なし @endif // 三項演算子の場合 {{ $user->birthday ? $user->birthday->format('Y/m/d') : '登録なし' }} 上記のようにすることで、birthdayがnullでもエラーは起きなくなる。 ということでlaravelのdate型カラムの取り扱いには要注意です。 (自戒の念を込めて。)
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【laravel】Auth::loginでログインできたと思ったらできていなかった問題

とある機能の実装をしていまして、 Auth::loginメソッドを使ったログインが必要になったのですが、、、、 ハマってしまった。。。 ありのままに起こったことを話そうと思います。 現象 ユーザのオブジェクトを入力してログイン認証を進めてくれるAuth::loginメソッド。 期待通り、ログインが成功して、期待通り、ログイン後の画面遷移が行われるはずだったのですが.... まさかの 401 unauthorized エラー 原因 どうやらログインそのものはできていたものの、セッションが保持されていなかったようです。 なので、セッションを保持させる解決策が必要。。。。 解決方法 app/Http/Kernel.phpの設定をいじる必要があったようです。 設定ファイル内の$middlewareに\Illuminate\Session\Middleware\StartSession::classを追加 app/Http/Kernel.php protected $middleware = [ ..., \Illuminate\Session\Middleware\StartSession::class ]; アタイ、こんなこと聞いてへん!って感じですが、これでセッションも維持されるようです。 ここら辺の認証まわり、知見がまだまだなので、もっとこういうやり方あるよ!だったり、アドバイスあればぜひお聞かせ願いたいです。 参考URL: https://www.it-mure.jp.net/ja/php/laravel-auth%EF%BC%9Aattempt%EF%BC%88%EF%BC%89%E3%81%AF%E3%83%AD%E3%82%B0%E3%82%A4%E3%83%B3%E3%82%92%E4%BF%9D%E6%8C%81%E3%81%97%E3%81%BE%E3%81%9B%E3%82%93/1043686939/
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

ほけん相談SNS『ほけんとーく』を作ってみた

はじめに このサービスをチームメンバーと一緒に開発しました。 これからサービスを作りたいという人に少しでも参考になれば幸いです。 自己紹介 現在24歳、都内の文系大学を卒業して、金融企業に務めております。 2020年8月にプログラミングスクールに通い始め、プログラミングの基本を勉強いたしました。 「ほけんとーく」とは 保険の悩み共有WEBアプリ「ほけんとーく」です。 保険に対する悩みを投稿することで、様々なユーザーからアドバイスをいただき解決のヒントとなるWEBアプリです。また、悩み投稿とコメントを共有することで、他のユーザーの悩み解決のヒントとなります。多くの人に見られたくない悩みは2人だけのチャット機能で相談することができます。 このアプリが目指すことは、ユーザーが保険の悩みを共有して①解決のヒントや、②安心感、③考えるきっかけ 以上のようなものを得ることです。 (直接保険営業マンとマッチングすることや、WEB上で保険の成立を目的とはしない) URL ほけんとーく ※スマホの場合は、ホーム画面に追加することを推奨しております。 ※WEBアプリのためインストール不要 開発のきっかけ 発案者が保険会社で代理店営業を行なっていた際の経験をもとに、以下の理由でサービスの開発に至りました。 ①保険に興味はあるけど、ほけんの窓口だと無理な保険を勧められそうで不安。 ②保険加入者の多くは会社の利益を優先する営業マンより、利益を求めない知人に勧められることがきっかけ。 ③営業マンではなく、一般の人が保険に対して意見交換する場がない。 ④世に似たサービスがなかった。 使用技術/使用ツール php7/Laravel5.5 HTML5/CSS/Bootstrap/javascript mysql git/GitHub/Linux slack/trello/調整くん/diagrams ER図 操作方法 全ユーザー共通(ログイン状況を問わない)  ①ホーム画面から悩み投稿の一覧を確認することができる。  ・左上のボタンをタップするとホーム画面に遷移します。 ・各ページに10投稿まで表示しております。 ・検索窓があり、興味がある投稿に絞って投稿を探すことができます。 ②投稿一覧ページから投稿をクリックしていただくと、悩み投稿に対する解決の提案を確認することができる。  ③ユーザー名をクリックしていただくとプロフィールページに遷移して、ユーザー情報を確認することができる。  ④メニューバーからランキングページに遷移して、週間提案コメントランキングと、週間ユーザーランキング(どちらもコメントに対するいいねの数による)  ⑤お問い合わせページから運営に問い合わせることができる。 ※いただいたお問い合わせは、管理者までメールと管理側のページで確認できる。 ⑥禁止事項ページに遷移して禁止事項の一覧を見ることができる。 ログインユーザーのみ  ①悩み投稿ページに遷移し、悩み投稿を行える。(削除と編集も可)  ②ログインユーザーのプロフィールページにてプロフィールを編集することができる。  ③他ユーザーのプロフィールページからフォローとフォロー解除することができる。  ④各ユーザーのプロフィールページからフォロー一覧ページに遷移することができる。  ⑤各ユーザーのプロフィールページからフォロワー一覧ページに遷移することができる。  ※フォローするボタンを押すことによってフォローすることができます。 ⑥他ユーザーのプロフィールページからチャットページに遷移し、個人チャットすることができる。(1度チャットを行ったユーザーはチャット相手選択ページに表示されます)  ※自身の発信したチャットについては削除と編集をすることが可能です。   チャットの右下の青いボタンを押すことで編集する。赤いゴミ箱ボタンを押すことにより削除が可能。 ⑦悩み投稿に対してコメントをすることができる。(削除と編集も可)  ⑧コメントに対して「いいね」をすることができる。  ⑨フォロー者の投稿とコメントを一覧で見ることができる。 ⑩パスワードを変更できる。 ⑪プロフィールページから家族が加入している保険の情報を追加できる。  ※ご不明点はメニューバーから遷移できるお問い合わせページからお願い致します。   ※禁止事項を必ずご確認いただいた上でのご利用をお願いいたします。 ポイント 悩み投稿画面の設計 悩みを抱えているユーザーが少ない負担で最適な解決方法が見つかるように、投稿時にアドバイスするユーザーが最低限知りたい内容を盛り込む設計にしました。  具体的には、ユーザーが悩み投稿をする画面で以下のような設問を設定しました。 「どんなタイプの悩み?」「誰の悩み?」「興味のある保険はなに?」(回答はすべてチェックボタンのため回答しやすいです) これらの設問に回答いただいた上で投稿内容をみることにより、他のユーザーが悩み解決につながる適切な回答が出来ると考えます。 ファイナンシャルプランナー(FP)やライフプランアドバイザー(LPA)が保険の提案、保険の見直しをする際に、多くの質問をして情報を聞き出し出します。その上で、個人ごとに最適なプランを設計いたします。  そのため、投稿時に多くのFP、LPAが知りたい最低限の内容を盛り込むことで、悩みを抱えているユーザーが少ない負担で解決に繋がりやすい設計にしました。  保険の内容に特化したプロフィール機能の設計 アドバイスするユーザーが悩み投稿からだけでなく、悩み投稿ユーザーの背景を汲み取れるような設計。また、実際に対面で話したいとなったときに会える距離なのかが分かるために活用されることを見込んで作成いたしました。 具体的には、 プロフィール画面に以下の情報を盛り込みました。 ・年齢 ・お住みの都道府県 ・家(例、持ち家の一軒家、賃貸のマンション) ・家族構成 ・家族が加入している保険 これらの情報を用いることで最適な解決方法が提案できると考えます。 例えば、お子様がまだ小さく、この都道府県は物価も高いから、これくらいの生命保険が必要かな〜と考える事ができます。 開発で苦労した点 ・メンバーの目線あわせ 私が作りたいものをメンバーに共有することに時間がかかりました。 特に共有するために作成したDB設計や、仕様書、ページ遷移表は時間が大変かかりました。 それ以外にも、git開発のルールを共有、コーティングルールの共有、日時のslackの連絡。週次のZoom会議などで意思統一して開発を進めていきました。 結果、細かい目線合わせをすることにより、サービスが良い方向に繋がりました。 優秀なメンバーに心から感謝しております。 ・DBのカラム名を変更した際のファイルの修正作業 DBのカラム名が適切でない時に修正作業に苦労しました。様々なファイルに影響を与えていたため、手作業だと完璧に行えない可能性があり方法を模索しました。その時にgrepコマンドの使い方を知り、使いこなし修正できたことが勉強になりました。 grepコマンドを使いこなす方法 今後の計画 ・使っていただくユーザーを増やす  ・非同期通信 ・ランキング機能のパターンを増やす(月間ユーザー、月間コメント)  ・WEBサイト上にLPAによるブログ作成  ・pwa化  ・スマホアプリ化  ・チャット機能の改修
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む