20211008のPHPに関する記事は11件です。

【第七回】コロナ禍だから何かできることをー 自宅療養者連絡ツール ー

前回までのあらすじ 【第六回】コロナ禍だから何かできることを 実装イメージ図 LINEを利用して保健所の担当者の負担を軽減するとともに、自宅療養者はいつでもつながっている安心感を持たせるためのツールイメージです。 前回までで一通りの流れを説明したので、今回からはシステムについて大きく説明していきたいと思います。 まずは、データベースの構造から。 データベースの構造 地区情報 作業者や利用者が住んでいる地区の情報を登録しておきます。 仮に企業が利用する場合などは、支店や拠点毎に登録することも可能です。 メールアドレス、ホスト名、ポート名、ユーザー名、パスワードについては メールアドレスのチェックを行う場合に使用します。 ここ 作業者情報 地区ごとに作業者の情報を登録します。  権限 権限は、 ・システム管理者 ・管理者 ・作業管理者 ・作業者 の4つに分かれ、権限によって利用できる画面が変わります。  利用可否 利用可否は、利用可能なデータかどうかの判断をします。 (一時利用不可とか) 利用者情報  各ID 利用者情報については、IDが2種類存在します。 新規で登録されたときは、利用者IDだけが自動採番されます。 今回のLINE連携を使用しない場合はこのままですが、 利用者からLINE連携の処理が来た時に、LINE IDが格納されます。 これにより、LINEとの連携が可能になります。  最終連絡日 最終連絡日においては、利用者からLINEの通知が来た場合、 もしくは作業者が個別で連絡し、画面上からコメントを書き込んだ時に日付が入ります。 すると、最後にやり取りした日がわかるため、状況によってメールで担当者に報告したり、画面上でアクションを発生させたりすることができます。 (今回は、12時間以上は注意喚起、24時間以上は警告としています。)  状態 状態については、 ・未確認 ・自宅療養中 ・入院 ・完了 としてあります。 「未確認」は利用者登録したとき、「自宅療養中」と「入院」は言葉通り、「完了」は完治や死亡など管理対象外となった場合です。 連絡情報 ここに担当者と利用者のやり取りを蓄積していきます。  手段 手段はやり取りした方法を自動で更新します。 パターンとしては、 ・LINE通知 ・画面上で状態を変更したとき ・連絡後コメントを入力したとき 以上の3パターンになります。 次回は、WEB画面のレイアウトを含めて説明します。 コロナ禍だから何かできることをー 自宅療養者連絡ツール ー 【第一回】実装イメージ図と動画 【第二回】LINEからデータを取得して返すまでの流れ 【第三回】LINEからデータベースまでの流れ 【第四回】データベースへの更新までの流れ 【第五回】ユーザー登録の仕組み-LINEbotの設定部分 【第六回】ユーザー登録の仕組みLIFFで表示する画面の開発 ->>【第七回】データベースの構造 【第八回】WEB画面上でできる機能 【第九回】まとめ
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

PHP 関数定義

関数定義 エディター /** 整数xを受け取り、xの2乗を返す関数を作成。 **/ <?php function square($x){ return $x * $x; } //関数の呼び出し echo square(2) . PHP_EOL; //式 echo (square(4) + 10) . PHP_EOL; // 2つの数を受け取り、引き算を行う関数 function subtract($x,$y){ return $x - $y; } // 3 echo subtract(5,2) . PHP_EOL; // -5 echo subtract(10,15) . PHP_EOL; // 2つの数を受け取り、掛け算を行う関数 function multiply($x,$y) { return $x * $y; } // 10 echo multiply(5,2) . PHP_EOL; // 150 echo multiply(10,15) . PHP_EOL; ステートメント ステートメントとは、命令や宣言等の、実行されるコードのまとまりのことを指します。ステートメントの終了にはセミコロン;を使用。 関数定義 <?php // 縦、横、高さを受けとって、立体の体積を計算するboxVolumeという関数を作成してください function boxVolume($l,$w,$h) { return $l * $w * $h; } // 関数の呼び出し&コンソール出力 echo boxVolume(2,3,5) . PHP_EOL; // 半径、高さを受け取って、円柱の体積を計算するcolumnという関数を定義 // 円周率は3で計算してください。 function column($r,$h) { //戻り値を設定してください。 return 3 * $r * $r * $h; } // 半径2、高さ5を関数に入力して、コンソールに出力してみましょう。(60) echo column(2,5) . PHP_EOL; // 上底、下底、高さを受け取って、台形の面積を返す、trapezoidという関数を定義 function trapeozoid($a,$b,$h) { return ($a + $b) * $h * 0.5; } // 上底3、下底5、高さ6を関数に入力して、コンソールに出力してみましょう。(24) echo trapeozoid(3,5,6) .PHP_EOL;
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【PHP】訪問者数カウンターに関わる関数についての学習

はじめに この記事は、独学開始から約3ヶ月の実務未経験者が作成したものです。 よって、スキルは非常に未熟なため、決してこの記事の内容を鵜呑みにされないように、ご注意ください。 (未熟な私が本記事の作成に至った背景については、本文の最後にお伝えします。) また本記事は、PHP言語の基礎理解を目的としております。 よって、Webアプリ開発におけるルーティングなどについては考慮できておりませんので、ご容赦ください。 参考にしたサイト記事 本記事を作成するために参照したのは、PHP公式マニュアルです。 https://www.php.net/ 【訪問者カウンター】のコードレビュー まず、今回レビューしていく完成コードは以下の通りです。 function set_count( $file_name = "counter.txt"){ //【ブロック①】 if( file_exists($file_name) ){ $count = (int)file_get_contents($file_name) + 1; file_put_contents($file_name, $count); //【ブロック②】 }else{ $handle = fopen($file_name , 'w+'); $count = 1; fwrite($handle, $count); fclose($handle); } return $count; } 私が設定したブロック毎にレビューしていきます。 【ブロック①】file_exists関数 ・ file_get_contents関数 ・ file_put_contents関数 //【ブロック①】 if( file_exists($file_name) ){ $count = (int)file_get_contents($file_name) + 1; file_put_contents($file_name, $count); } まずfile_exists関数は、【ファイルまたはディレクトリが存在するかどうかを調べる関数】です。 今回の場合、file_exists関数の引数内にある$file_nameに代入されている counter.txtというテキストファイルがディレクトリ内に存在しているかを確認しています。 $file_name(=counter.txt)がディレクトリ内に存在しなかった場合、後ほど解説するelse以下へ条件分岐します。 もし$file_name(=counter.txt)が存在した場合、file_get_contents関数が起動します。 file_get_contents関数は、【ファイルの内容を全て文字列に読み込む関数】です。 つまり、file_get_contents関数の第一引数にある$file_nameに書き込まれている文字を読み込んでいます。 もしも、$file_name(=counter.txt)に『整数1』のみが記載されていた場合、file_get_contentsは『1』となります。 後書きで『+1』とも記載さているため、1+1の合計値である『2』が$countに代入されます。 次に、file_put_contents関数が起動します。 file_put_contents関数は、【データをファイルに書き込む】関数です。 file_put_contents関数の第一引数には、データの書き込み先のファイルが定義されます。 この場合は、$file_name(=counter.txt)です。 そして、第二引数には、書き込まれるデータを定義します。 この場合、$countに代入されている『2』が書き込み先のファイルに上書きされます。 ※余談ですが、以下のように記載すれば、データを上書きするのではなく、追記ができます。 file_put_contents($file_name, $count)FILE_APPEND 【ブロック②】fopen関数 ・ fwrite関数 ・ fclose関数 //【ブロック②】 else{ $handle = fopen($file_name , 'w+'); $count = 1; fwrite($handle, $count); fclose($handle); } 次に、else以下のコードについて、レビューしていきます。 まず、fopen関数です。 fopen関数の挙動は引数のmodeによって異なります。 詳しくは、以下のURLを確認ください。 https://www.php.net/manual/ja/function.fopen.php 今回の例でのfopen関数の挙動は、以下の通りです。 ①$file_name(=counter.txt)がディレクトリ内に存在しないことを確認する。 ②fopen関数の第二引数のmodeであるw+が発動し、新規ファイルが作成される。 modeについては以下の公式マニュアルを参照ください。 fopen関数により、新規ファイルが作成され、且つそれに書き込み可能な状態となります。 その状態のまま、$handleに代入されます。 次に、fwrite関数です。 fwrite関数の第二引数で定義されているデータ($count)を、第一引数で定義されている『書き込み可能なファイル』に書き込まれます。 最後に、fclose関数によって、開かれた状態のファイルを閉じます。 最後に 上記でもお伝えいたしましたが、私は独学開始から約3ヶ月の実務未経験者です。 そんな未熟な私が記事を投稿しようと決意した理由は、以下の通りです。 ・初学者の記事が多いほどに、プログラミングの学習を検討している方の背中を押せると考えたから(私自身、学習を開始するまでに初学者の記事を読み漁っておりました) ・周りに同じ境遇の仲間がいない、孤独な初学者さんの競争心を掻き立てられるのではと考えたから(学習効率を上げるためにはライバルの存在は重要) ・あるいは「自分のレベルはこいつよりも上」と優越感を与えられるのではと考えたから(学習効率を上げるためには自信を持つことも重要) プロのエンジニア同様、初学者にもそれなりの努めがあると、私は思います。 今後も、下手くそながらも【初学者ページ】を上げ続けて参ります。 ありがとうございました。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【初学者奮闘録】訪問者数カウンターに関わる関数についての学習(PHP)

はじめに この記事は、独学開始から約3ヶ月の実務未経験者が作成したものです。 よって、スキルは非常に未熟なため、決してこの記事の内容を鵜呑みにされないように、ご注意ください。 (未熟な私が本記事の作成に至った背景については、本文の最後にお伝えします。) また本記事は、PHP言語の基礎理解を目的としております。 よって、Webアプリ開発におけるルーティングなどについては考慮できておりませんので、ご容赦ください。 参考にしたサイト記事 本記事を作成するために参照したのは、PHP公式マニュアルです。 https://www.php.net/ 【訪問者カウンター】のコードレビュー まず、今回レビューしていく完成コードは以下の通りです。 function set_count( $file_name = "counter.txt"){ //【ブロック①】 if( file_exists($file_name) ){ $count = (int)file_get_contents($file_name) + 1; file_put_contents($file_name, $count); //【ブロック②】 }else{ $handle = fopen($file_name , 'w+'); $count = 1; fwrite($handle, $count); fclose($handle); } return $count; } 私が設定したブロック毎にレビューしていきます。 【ブロック①】file_exists関数 ・ file_get_contents関数 ・ file_put_contents関数 //【ブロック①】 if( file_exists($file_name) ){ $count = (int)file_get_contents($file_name) + 1; file_put_contents($file_name, $count); } まずfile_exists関数は、【ファイルまたはディレクトリが存在するかどうかを調べる関数】です。 今回の場合、file_exists関数の引数内にある$file_nameに代入されている counter.txtというテキストファイルがディレクトリ内に存在しているかを確認しています。 $file_name(=counter.txt)がディレクトリ内に存在しなかった場合、後ほど解説するelse以下へ条件分岐します。 もし$file_name(=counter.txt)が存在した場合、file_get_contents関数が起動します。 file_get_contents関数は、【ファイルの内容を全て文字列に読み込む関数】です。 つまり、file_get_contents関数の第一引数にある$file_nameに書き込まれている文字を読み込んでいます。 もしも、$file_name(=counter.txt)に『整数1』のみが記載されていた場合、file_get_contentsは『1』となります。 後書きで『+1』とも記載さているため、1+1の合計値である『2』が$countに代入されます。 次に、file_put_contents関数が起動します。 file_put_contents関数は、【データをファイルに書き込む】関数です。 file_put_contents関数の第一引数には、データの書き込み先のファイルが定義されます。 この場合は、$file_name(=counter.txt)です。 そして、第二引数には、書き込まれるデータを定義します。 この場合、$countに代入されている『2』が書き込み先のファイルに上書きされます。 ※余談ですが、以下のように記載すれば、データを上書きするのではなく、追記ができます。 file_put_contents($file_name, $count)FILE_APPEND 【ブロック②】fopen関数 ・ fwrite関数 ・ fclose関数 //【ブロック②】 else{ $handle = fopen($file_name , 'w+'); $count = 1; fwrite($handle, $count); fclose($handle); } 次に、else以下のコードについて、レビューしていきます。 まず、fopen関数です。 fopen関数の挙動は引数のmodeによって異なります。 詳しくは、以下のURLを確認ください。 https://www.php.net/manual/ja/function.fopen.php 今回の例でのfopen関数の挙動は、以下の通りです。 ①$file_name(=counter.txt)がディレクトリ内に存在しないことを確認する。 ②fopen関数の第二引数のmodeであるw+が発動し、新規ファイルが作成される。 modeについては以下の公式マニュアルを参照ください。 fopen関数により、新規ファイルが作成され、且つそれに書き込み可能な状態となります。 その状態のまま、$handleに代入されます。 次に、fwrite関数です。 fwrite関数の第二引数で定義されているデータ($count)を、第一引数で定義されている『書き込み可能なファイル』に書き込まれます。 最後に、fclose関数によって、開かれた状態のファイルを閉じます。 最後に 上記でもお伝えいたしましたが、私は独学開始から約3ヶ月の実務未経験者です。 そんな未熟な私が記事を投稿しようと決意した理由は、以下の通りです。 ・初学者の記事が多いほどに、プログラミングの学習を検討している方の背中を押せると考えたから(私自身、学習を開始するまでに初学者の記事を読み漁っておりました) ・周りに同じ境遇の仲間がいない、孤独な初学者さんの競争心を掻き立てられるのではと考えたから(学習効率を上げるためにはライバルの存在は重要) ・あるいは「自分のレベルはこいつよりも上」と優越感を与えられるのではと考えたから(学習効率を上げるためには自信を持つことも重要) プロのエンジニア同様、初学者にもそれなりの努めがあると、私は思います。 今後も、下手くそながらも【初学者ページ】を上げ続けて参ります。 ありがとうございました。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【凡ミス①】Formタグ外に登録ボタンを配置

私の凡ミス集その①です。 Formタグ外に登録ボタンを配置した事が原因で、 登録ボタンが反応しなくなる。 環境 PHP7 Laravel6 Docker 背景 ユーザー登録画面と処理機能作成時の凡ミス 登録ボタンを押しても反応無し。エラーすら出ない。笑 RegisterController.phpを確認しても問題は見当たらない Web.phpの記述は、Auth::routes();で認証系はバッチリ register.blade.phpの記述を見ても、この時点では間違いが見当たらず 諦めて就寝... 解決 翌朝register.blade.phpを再確認したところ、 Formタグ外に登録ボタンを間違って配置していたおかげで、 入力データがPOSTされていない事を確認。 register.blade.php </div> </form> <button class="btn btn-block" title="アカウント登録" type="submit"> はじめる </button> <div> アカウントをお持ちの方は<a href="{{ route('login') }}">こちら</a>から </div> </div> 以下のように修正したら、上手くいった。 register.blade.php </div>           <button class="btn btn-block" title="アカウント登録" type="submit">  はじめる    </button> </form> <div> アカウントをお持ちの方は<a href="{{ route('login') }}">こちら</a>から </div> </div> 終わりに Formタグの中でPOSTメソッドを定義して登録処理を実行しているので、 登録ボタンをタグ内に置かないと機能しないのは当たり前。 また、この事象はユーザー登録機能に関わらず、ログイン、パスワードリセット、投稿等、 あらゆるPOSTメソッドを使用する処理で起こりうる凡ミスです。 register.blade.php <form method="POST" action="{{ route('register') }}" class="p-3"> @csrf      ・・・・省略・・・・ <button class="btn btn-block" title="アカウント登録" type="submit"> はじめる </button> </form> 以上、凡ミス集①でした
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

PHP クラス名(インスタンス)からPHPファイルパスに辿り着く方法

クラス名(インスタンス)から実際のPHPファイルパスを探したいとき。 public function run($nazoClass) { $nazoClass->nazonazo(); } $nazoClass ってどこに定義されてるの?を調べます。 環境 IDEのコードジャンプが効かないクソ環境を想定してます。 コードジャンプできればこんなことしなくていいのに... クラス名を調べる var_dump(get_class($nazoClass)); die; ファイルパスを調べる var_dump((new \ReflectionClass(get_class($nazoClass)))->getFileName()); die; 参考 https://www.php.net/manual/ja/function.get-class.php https://www.php.net/manual/ja/class.reflectionclass.php https://stackoverflow.com/questions/3014254/how-to-get-the-path-of-a-derived-class-from-an-inherited-method
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

転職活動管理アプリを作ろう④(Laravel に鞍替え〜ログイン実装チュートリアル)

前回は コチラ Laravel に変更します Java(Spring) ではなく PHP のスキルが必要になり、復習のため テーブル定義は前回のものから変更しません が、user テーブルの変更は必須なので後で更新する 今回の記事ではチュートリアルに即したログイン画面の実装をしていきます 記事の体裁は前回を踏襲 その他も変更します DB は PostgreSQL にします Laravel の開発環境構築は コチラ にて解説 docker-compose.yml 等は github/sosobl/env-laravel にて ログインを実装してみよう laravel-admin を使用します 他のライブラリも検討しましたが、ドキュメントの多さとそこまで複雑なことをやる必要もないため、本ライブラリを選定しました ログイン後のダッシュボード画面も付いてくるのが助かる 以下ドキュメントよりインストール実施 やったこと(コマンドログ) $ composer require encore/laravel-admin $ php artisan vendor:publish --provider="Encore\Admin\AdminServiceProvider" /config/app.php の timezone を Asia/Tokyo に、locale を ja に修正 $ php artisan admin:install これをやると初期アカウントの作成等のシーディングをしてくれる つまった点 SQLSTATE[42P01]: Undefined table: 7 ERROR: relation "sessions" does not exist LINE 1 解決策 以下コマンドを実行し sessions テーブルを作成し、サーバー再起動 $ php artisan session:table 動作確認 http://localhost/admin/ へアクセス id:admin / pass:admin でログイン こんな画面が表示される (備忘録)ログインを実装してみよう(JetStream) ※ laravel-admin を使用した方が色々と捗るので、以下の記事は 備忘録として 残しておりますが以降は使用しません 一般ユーザーのような階層を設ける場合は使うかも 以下チュートリアルを行う 使用するライブラリは Laravel Jetstream にしました コマンド打ってインストールするだけで以下機能が追加されるため(簡単) ログインフォーム 認証 新規ユーザー登録 パスワード問い合わせ チーム管理(一応) API サポート(一応) インストール方法 $ composer require laravel/jetstream Laravel Jetstream の有効化 $ php artisan jetstream:install livewire --teams Laravel Jetstream のインストール(Livewire ) $ npm install && npm run dev $ php artisan migrate $ php artisan vendor:publish --tag=jetstream-views 日本語化 https://github.com/Laravel-Lang/lang/ から zip ダウンロード zip を解凍し lacales/ja 内のファイルをプロジェクト内の resources/ja にコピー、ja.json を resources/ にコピー config/app.php の locale を 'ja' に変更 インストール方法詳細は後ほど追記したい 参考 Laravel Docs Jetstream Docs
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

SonarQube+WindowsでPHPソースをスキャンする

間があいてしまいましたが、前回 に引き続きSonarQubeで静的解析を行うための手順を書いていきたいと思います。 今回はDockerコンテナでSonarQube立ち上げて、Windows10(ホスト)にあるCakePHPプロジェクトをSonar Scannerでスキャンしてみようと思います。 参考にした記事 https://qiita.com/takao-takass/items/5d54768ad0d315d3dad4 環境 Windows10 Pro Windows10 へDockerインストールについては コチラ を参照 コンテナ作成については コチラ の記事を参照 PHP:PHP 7.4.4 Cake:4.x系 SonarQubeの設定 SonarQubeへアクセス ブラウザを開いて、SonarQubeへアクセスします。 http://{IP or ホスト名}/ 特に設定していなければhttp://localhost:9000/でアクセスできると思います。 ログイン ID:admin Password:admin でログイン可能です。 プロジェクトの作成 画面中央付近にある『Create new project』をクリックします。 次に『Project key』、『Display name』を入力し、『Set up』をクリックします。 そして、SonarQube ScannerからSonarQubeへログインするためのTokenを生成します。 ある程度の文字列の長さが必要です。 Tokenが生成できたら、『Continue』をクリックします。 Scannerの設定 Scannerはソースコードをスキャンするプログラムなり、スキャン結果をSonarQubeへ返します。 こちらを参考にしました プログラム言語などの選択 今回はPHPのプロジェクトをスキャンするので、『Other』選択します。 次にScannerを動かすOSを選択しますが、『Windows』を選択します。 Scannerのダウンロードと設定 zipファイルがダウンロードされるので、適当なフォルダで解答します。 サンプルとして下記ファイルパスで実行します。 PHPプロジェクト:C:\tmp\{PHPプロジェクト} Scanner:C:\tmp\{Scanner} スキャンしてみる コマンドプロンプトを開きディレクト移動 PHPプロジェクト配下へ移動します。 cd C:\tmp\{PHPプロジェクト} 2. スキャン実行 『Execute the Scanner from your computer』に表示されているコマンドをちょっと変えて実行 環境変数にbinまでのパスを通した方がいいと思うのですが、それは割愛してbatまでのフルパスを指定する形にしました。 なので、下記を参考にScannerまでのパスだけ修正してください。 ■変更前 sonar-scanner.bat -D"sonar.projectKey=php-test" -D"sonar.sources=." -D"sonar.host.url=http://localhost:9000" -D"sonar.login=トークンが表示されます" ■変更後 C:\tmp\sonar-scanner-4.6.2.2472-windows\bin\sonar-scanner.bat -D"sonar.projectKey=php-test" -D"sonar.sources=." -D"sonar.host.url=http://localhost:9000" -D"sonar.login=トークンが表示されます" ※Scanner解凍時のフォルダ名は読み替えをお願いします。 3. スキャン結果を見る(まずは成功 or 失敗) プロンプト上にログがバーッと流れます (ちょいちょいWARNINGがあるのは気になりますが・・・今はまぁいいでしょうw) 最終的に『EXECUTION SUCCESS』が表示されていることを確認してください。 INFO: Analysis total time: 28.439 s INFO: ------------------------------------------------------------------------ INFO: EXECUTION SUCCESS INFO: ------------------------------------------------------------------------ INFO: Total time: 30.419s INFO: Final Memory: 14M/57M INFO: ------------------------------------------------------------------------ SonarQubeでの結果確認 上記までの手順が順調にいけば、SonarQube側がこんな感じで表示されます。 あとがき あとは、デフォルトの解析設定だとちょっと物足りない感じですが、『Rules』、『Quality profile』、『Quality Gates』などで解析についての設定が行えそうなので、今後調査していこうと思います。 そして、お気づきの方もいらっしゃるかと思いますが、実はちょっと日本語化してあります。 別記事で記載していこうと思います。 関連記事 SonarQubeをDockerで立ち上げた時の話
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

イケてないswitch-case文からおさらばするPHP生活の知恵2 -PHP8編-

はじめに 以前こんな記事を書いたんですよね。 でも最近PHP8を使うようになってもっとイケてる感じにかけるやん?ってわかったわけで、続編みたいな感じです。 match式を使おう ゆるゆる判定のswitch文を憎んでいるちょっとだけ意識高い目のぺちぱー諸氏は色んな方法でswitch文使わないで書こうと考えてると思うんですが、とうとうPHP8で我々の前に救世主が降り立ちました。 match式 です。 構文はこんな感じです。 $return_value = match (制約式) { 単一の条件式 => 返却式, 条件式1, 条件式2 => 返却式, }; 公式ドキュメントに書いてある大事なポイントを抜き出してきます。 match 式は、 switch 文と似ていますが、いくつかの違いがあります: * match 式の比較は、 switch 文が行う弱い比較ではなく、 厳密に値を比較(===) します。 * match 式は値を返します。 * match 式の分岐は、 switch 文のように後の分岐に抜けたりはしません。 * match 式は、全ての場合を網羅していなければいけません。 最後のところがめんどくさそうな雰囲気を醸し出してますが、心配はいりません。 default を使えばいいだけです。 書き換えてみよう では前回でも使ったイケてない例を書き換えてみましょう。 class HogeController { public function fuga($method){ $title = ''; switch($method){ case 'new': $title = '新規作成'; break; case 'update': $title = '更新'; break; } return view('fuga', compact('title')); } } これを…… class HogeController { public function fuga($method){ $title = match($method){ 'new' => '新規作成', 'update' => '更新', default => '' }; return view('fuga', compact('title')); } } こうじゃ! これはね、シビレますね!!(*´Д`)ハァハァ
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

PHPで\nを改行させる方法

PHPだと文字列に\nが入っていても改行されない。 ただの空白として出力される。 解決方法 $summary = "abc\ndef\nghi"; //改行されない通常のコード echo($summary); //改行されるコード echo(nl2br($summary)); nl2br関数を使うと、stringに含まれるすべての改行文字(\r\n,\n\r,\n,\r) の前に<br />あるいは<br>を挿入して返してくれる。 参考
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

[CakePHP] 型情報付きでエンティティを取得する

前回の型情報付きでテーブルオブジェクトを取得するの続き 課題 通常CakePHPではエンティティオブジェクトをQuery/ResultSetからfirst()等で取得する。 ResultSetからforeachで取るような場合は@var書くしかないして、fisrt()のときくらいはEntityInterfaceではなく具体的な型情報がほしい。 解決策 ジェネリクスを使用した回避策がこれ。 例としてByIdにしてあるけど条件は好みで適当に調整。 use Cake\Utility\Inflector; /** * @template T * @param class-string<T> $fullEntityName 完全修飾エンティティ名 * @param int $id * @return T of \Cake\ORM\Entity */ public static function getEntityById(string $fullEntityName, int $id, array $contain = []) { if (!preg_match('#(\w+)$#', $fullEntityName, $matches)) { throw new \DomainException(); } $tableName = Inflector::pluralize($matches[1]); return TableRegistry::getTableLocator()->get($tableName)->findById($id)->contain($contain)->first(); } 使用例 $article = getEntityById('\App\Model\Entity\Article', 3); または $article = getEntityById(\App\Model\Entity\Article::class, 3); または use \App\Model\Entity\Article; $article = getEntityById(Article::class, 3); いずれも\App\Model\Entity\Article型としてIDEに認識される 留意事項 テーブルモデルと同様、ジェネリクスを使う都合上、単にgetEntityById('Articles', ~~)と書くことはできず、完全修飾名で指定する必要がある。 使用例の真ん中の書き方であればIDE補完付きで書くことができるのでそれほど手間ではない。 また配列形式であれば以下のように書けるはずだが、現時点ではPhpStormは対応しておらず、今後対応予定とのこと。(公式ブログのWI-60894 Support parameter wrapping) use Cake\Utility\Inflector; /** * @template T * @param class-string<T> $fullEntityName 完全修飾エンティティ名 * @param string $named * @return array<int, T> */ public static function getEntitiesByName(string $fullEntityName, string $name, array $contain = []) { if (!preg_match('#(\w+)$#', $fullEntityName, $matches)) { throw new \DomainException(); } $tableName = Inflector::pluralize($matches[1]); return TableRegistry::getTableLocator()->get($tableName)->findByName($name)->contain($contain)->toArray(); }
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む