20210510のPHPに関する記事は12件です。

パスワード変更機能の実装

前回実装した退会機能に引き続き今回はパスワード変更機能を実装していこうと思います。 (退会機能の実装についてはこちらから) 【Laravel】論理削除を利用して退会機能を実装する 使用環境 AWS Cloud9 Laravel 5.5.50 実装する機能の内容 今回のパスワード変更機能はメール認証をしない仕様で実装します。 コントローラーの作成 $ php artisan make:controller ChangePasswordController ルートの定義 web.php //省略 Route::group(['middleware'=>'auth'],function(){ //中略 Route::get('/password/change','ChangePasswordController@edit')->name('password.form'); Route::put('/password/change','ChangePasswordController@update')->name('password.change'); パスワードの変更についてはログイン認証をしたユーザーのみがアクセスできるようにする。 /password/changeのアドレスでパスワードの変更画面を表示させる。 コントローラーの編集 ChangePasswordController.php use App\User; use Illuminate\Http\Request; use Illuminate\Support\Facades\Validator; class ChangePasswordController extends Controller { public function edit() { return view('password.form'); } protected function validator(array $data) { return Validator::make($data,[ 'new_password' => 'required|string|min:6|confirmed', ]); } public function update(Request $request) $user = \Auth::user(); if(!password_verify($request->current_password,$user->password)) { return redirect('/password/change') ->with('warning','パスワードが違います'); } //新規パスワードの確認 $this->validator($request->all())->validate(); $user->password = bcrypt($request->new_password); $user->save(); return redirect ('/') ->with('status','パスワードの変更が終了しました'); } } editメソッドでパスワード変更画面(password.form)に飛ばします。 validatorファザードを使用してバリデーションをした値をupdateメソッドに返します。 updateメソッドではまず現在のパスワードをpassword_verifyを用いて確認、一致しないのであればエラーのフラッシュメッセージを返すよう記述。 その後新しく入力されたパスワードが要件を満たしているかを確認後保存されるように記述、成功したのであれば完了文をTOPページに表示させます。 今回はフラッシュメッセージを用いてエラーメッセージ等を出せるようにしていきます。 リダイレクト先でフラッシュメッセージを表示させるにはredirectメソッドにアロー演算子を用いてwith()メソッドでつなぎます。 第1引数にキー、第2引数に値を入れます。 フラッシュメッセージの表示 form.php @if(session('warning')) <div class="alert alert-danger"> {{ session('warning') }} </div> @endif データはセッションを用いて表示されるのでsession()を使う。 statusを表示させるためにtop画面にも同様の追記。 変更に成功した場合 以前のパスワードが一致しない場合 参考:Laravel でフラッシュメッセージを表示する方法 パスワード編集画面の実装 resources >> views >> password >> form form.php @if(session('warning'))//エラー文を表示させる <div class="alert alert-danger"> {{ session('warning') }} </div> @endif <div class="row mt-5 mb-5"> <div class="col-sm-6 offset-sm-3"> {!! Form::open(['route'=>'password.change','method'=>'put']) !!} <div class="form-group"> {!! Form::label('current_password','以前のパスワード') !!} {!! Form::password('current_password',['class'=>'form-control']) !!} </div> <div class="form-group"> {!! Form::label('new_password','新しいパスワード') !!} {!! Form::password('new_password',['class'=>'form-control']) !!} </div> <div class="form-group"> {!! Form::label('new_password_confirmation','パスワードの確認') !!} {!! Form::password('new_password_confirmation',['class'=>'form-control']) !!} </div> {!! Form::submit('パスワードを変更する',['class'=>'btn btn btn-primary mt-2']) !!} {!! Form::close() !!} </div> </div> @endsection 感想 ・フラッシュメッセージを新しく知れてよかった。 ・自分でバリデーションを実行することでバリデーションの流れについて学べた。 ・難しいかと思ったが意外とシンプルだった。 ・次回はメール認証でのパスワード変更にチャレンジする。 参考 Laravel入門 Laravel公式 バリデーション
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

社内AWS研修の振り返り

取り組みを実施した背景 社内の新人Webエンジニアがインフラにあまり慣れていなかった為、インフラスキルの向上を目的にAWS研修を実施していただきました?‍♂️ 実施にあたり自分のAWSに関するスキル感 EC2上でWordPressを立てたことがある プライベートサブネットにWordPressのEC2サーバを、プライベートサブネットにMySQLのEC2サーバを立てた ELBやAWS Auto Scalingは使用したことがない 今回作ったインフラの構成図と使用したもの 開発環境 本番環境 使用したもの OS: Amazon Linux release 2 (Karoo) リバースプロキシサーバ: nginx 1.18.0 WEBサーバ: PHPビルトインウェブサーバ PHP 8.0.1 DBサーバ: MySQL 8.0.20 研修の流れと「やったこと、わかったこと、わからなかったこと」 座学 ? IPアドレスやサブネットマスク IPアドレスの基礎知識 - Qiita OSの種類 yumやapt-getについて リージョンやアベイラビリティーゾーン 可用性の高め方 VPCやサブネット パブリックサブネットとプライベートサブネットの使い分け VPCやサブネットってなんなの?AWSをオフィスビルでわかりやすく表現してみた:穂苅智哉の Webビジネス!日進月歩:オルタナティブ・ブログ EC2、RDS、ELBについて 0から始めるAWS入門:概要 - Qiita 分からなかったこと ロードバランサーの設定方法イメージ出来なかった WEBサーバの前段でアクセス負荷を分散させてくれるということは知っていた しかし、スキーム、証明書の設定、ターゲットグループといった概念や設定方法をなんとなくでしか理解していなかった 後ほど行ったハンズオンで理解することが出来ました?‍♂️ 開発環境構築(ハンズオン)? やったこと パブリックサブネットでグローバルIPのあるEC2を作成 yumでnginxを入れて初期ページを表示する yumでPHP8系をインストール その後PHPのビルトインサーバでHelloWorld PHP-FPMとビルトインサーバの2つがWEBサーバの候補で、他の参加者がPHP-FPMを選んでいたため物は試しと思いあえてビルトインサーバの方を選んだ(結果的に良くない実装だった? ) yumでMySQL8系をインストール その後ビルトインサーバでHelloWorld PHPでMySQLに入れたダミーデータを取得し表示 WordPressをインストール nginx.confにルーティングを記述し、nginx再起動 ビルトインサーバを起動 IPアドレス経由でWordpressが開くかどうかをデバッグしながら確認 分かったこと EC2インスタンスの構築方法 MySQL5.7系以降のパスワードの初期値について 参考サイト: MySQLにrootでログインできない!初期設定やファイル変更が必要です! PHPにおけるMySQLとの連携方法 分からなかったこと WordPressコンテンツが読み込まない状態になってしまった DB内の「WordPressの設定データ」が間違っていた可能性がある 原因調査しきれず?‍♂️ WordPress再インストールとconfigの再設定、DBの再生成で直った?‍♂️ 本番環境構築(ハンズオン)? やったこと 開発環境からのコピー 開発環境のEC2からamiを作成し、本番環境のEC2を生成&起動 開発環境のDBからdump取って、本番環境のRDSに入れる 分かったこと amiのとり方 amiから複製する方法 開発環境のDBからdumpをエクスポートする方法 本番環境のDBにdumpをインポートする方法 分からなかったこと 特になし 本番環境構築(ハンズオン)続き? やったこと ALBの作成 AWSの3種類のLBの比較と使い分け (ALB, NLB, CLB) - Qiita ACMを利用してSSL証明書の作成とALBへの設定 AutoScalingさせる ターゲットグループの設定 オートスケーリンググループの設定 わかったこと AutoScalingの設定方法 ApacheBenchコマンドを用いた負荷テストで、Scalingするかを確認する方法 Apache Benchでサクッと性能テスト - Qiita 分からなかったこと AutoScalingで新規起動したサーバでビルトインサーバを起動する方法? 個人アプリ検討、選定、実装まで 検討 MoonGift等でOSSを調べて以下のアプリに興味を持った OWASP ZAP Webアプリケーションセキュリティスキャナー Redmine プロジェクト管理ソフトウェア Lottery 懇親会等で使えそうなルーレットアプリ 選定 Dockerで立ち上げ可能なアプリを選定 第1候補: OwaspZap 理由: 今後業務でアプリを作った際に試しに自己診断してみたいと考えたため 第2候補: Redmine 理由: チケット管理ツールを立ち上げて実際に使ってみることで、今後の開発時に活きる「実装アイディア」を得られればなと考えた ただ、現状業務ではプロジェクト管理はGitHub内の機能を使用しているため、Redmineが業務に直接活きないと考えたため第2候補にした 実装 OwaspZap DockerでCUIが起動出来た しかし、GUIを起動するにはマシンリソース不足だったため断念? Redmine Dockerを用いて起動出来た GUIで起動出来た? 振り返り? うまくいったこと ? EC2インスタンスで開発環境と本番環境を作ること LBを経由してWordPressを公開すること うまくいかなかったこと? nginxのルーティングをベストな設定で記述したかった 十分な理解が無いままに記述して序盤上手く行ってしまったため、終盤にルーティングがぐちゃぐちゃになって困った WordPressを稼働させる上で最適な構成にしたかった ビルトインサーバで稼働させる方向で進めてしまった その影響もありAutoScalingの設定時に他の参加者では不要な作業が発生した もし次やるならPHP-FPMで作りたい 今後トライしたいこと? コンテナ周りのマネージドサービスを適切に使用して、運用負荷の少ないシステム構築すること nginxのルーティングを、きちんと理解した上で記述出来るようにすること AutoScalingで新規起動したサーバ上で、アプリケーションもちゃんと起動するようにすること まとめ 一度プライベートでEC2でWordPressを立てたことはあったのですが、ざっくりとしか着手していなかった為今回の研修では「わかっていなかった所」が数多く見つかり、かつその理解を深めることが出来たのでとても良かったです。ありがとうございました?‍♂️ 「ビルトインサーバでWordPress環境構築」という、「PHP-FPMを使った構築」より比較的情報が少ないかつ本番環境では非推奨な実装方法で進めてしまったため、問題が起こったときの原因究明が難しかったことが印象に残っています。(とはいえ、インフラの根本的な仕組みについて理解していれば解決は難しくないはず。主に自身の実力不足。) 今後技術選定を行うときは、「信頼できる情報源が豊富かどうか」も頭に入れた方が良いと学びました。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【php】おみくじ、大吉・中吉・小吉・凶・大凶

// おみくじを作る // 比較演算子 == > < >= <= != // 大吉・中吉・小吉・凶・大凶 <?php $omikuji = rand(1,10); echo $omikuji."\n"; if ($omikuji == 1) { echo "大吉"; } elseif ($omikuji == 2) { echo "中吉"; } elseif ($omikuji <= 4) { echo "小吉"; // 3,4 } elseif ($omikuji <= 7) { echo "凶"; // 5,6,7 } else { echo "大凶"; // 8,9,10 } ?>
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【php】1~5のランダムな数字を取得し、金賞、銀賞、銅賞の表示分けをせよ

<?php $place = rand(1,5); // 順位を1〜5の範囲でランダムに作られた数字を$placeに代入 echo "placeの中身:".$place."\n"; if ($place == 1) { echo "金賞"; } elseif ($place == 2) { echo "銀賞"; } elseif ($place == 3) { echo "銅賞"; } else { echo $place."位"; } ?> 順位が1位だったら「金賞」と表示し、 順位が2位だったら「銀賞」と表示し、 順位が3位だったら「銅賞」と表示し、 それ以外だったら「○位」と表示するプログラムを作成せよ。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

データベースを操作する際に使うメソッドの整理

この記事を書く目的 データベースを操作するメソッドの使い方、違いがうまく分からないので理解を深めると共に整理する為 メソッド query prepare bindParam bindValue execute fetch fetchAll データベースを操作する手順 ①データベースに接続する。 ②実行したいSQL文をセットする。 ③SQLに対してパラメーターをセットする。【任意】 ④実際にSQLを実行する。 ⑤結果を取得する。【任意】 ⑥データーベースから切断する。 query ・指定したSQL文をデータベースに対して発行してくれる役割 ・queryで実行まで行う(execute必要ない) // SQL文の組み立て(クエリの組み立て) $sql = "SELECT * FROM member"; // queryの結果は配列で返ってくる $stmt = $pdo->query($sql); prepare ・実行したいSQL文の中に「変動値」が入る場合に使用 ・SQL文の実行準備を行い文オブジェクトを返す // SQL文の組み立て(クエリの組み立て) $sql = "SELECT * FROM member WHERE email=?"; // 変動値をSQL文に含める準備 $stmt = $pdo->prepare($sql); // 変動値を含んだSQLを実行 $stmt->execute(array($_POST(email)); bindParam ・第二引数にはパラメータにバインドする「変数」を指定 ・値を指定することはできない ・値の参照を受け取る ・execute()関数を使用した際にバインドが確定 $stmt = $pdo->prepare("select * from member where email = :e-mail"); //セットする変数を定義 $email = example.jp; //第二引数に変数をセットする $stmt->bindParam("email",$email); //結果表示 $stmt->execute(); $result = $stmt->fetch(); echo "email = ".$result['email']; // example.jp と表示 //以降は変数の中身を変えてexecuteを実行するだけ $email = example_1.jp; //結果表示 $stmt->execute(); $result = $stmt->fetch(); echo "email = ".$result['email']; // example_1.jp と表示 bindValue ・変数の値をバインドするための関数 $stmt = $pdo->prepare("select * from member where email = :e-mail"); //セットする変数を定義 $email = example.jp; //第二引数に変数をセットする $stmt->bindvalue("email",$email); //結果表示 $stmt->execute(); $result = $stmt->fetch(); echo "email = ".$result['email']; // example.jp と表示 //変数の中身を変えても表示は一緒 $email = example_1.jp; //結果表示 $stmt->execute(); $result = $stmt->fetch(); echo "email = ".$result['email']; // example.jp と表示 execute ・PHPの標準関数でプリペアドステートメントを実行する際に使われる関数 ・プリペアドステートメントは、SQL文で値が変わる可能性がある箇所に対して、変数のように別の文字列を入れておき、後で置き換える仕組み // SQL文の組み立て(クエリの組み立て) $sql = "SELECT * FROM member"; // プリペアドステートメントの作成 $stmt = $pdo->prepare($sql); // クエリの実行 $stmt->execute(); fetch ・該当するデータを1行返す $sql = "SELECT * FROM member"; // プリペアドステートメントの作成 $stmt = $pdo->query($sql); // クエリの実行 $stmts = $stmt->fetch(); var_dump($stmts); <結果> array(6) { ["id"]=> string(1) "1" [0]=> string(1) "1" ["name"]=> string(6) "田中" [1]=> string(6) "田中" ["age"]=> string(2) "40" [2]=> string(2) "40" } fetchAll ・該当するすべてのデータを返す $sql = "SELECT * FROM list"; // プリペアドステートメントの作成 $stmt = $db->query($sql); // クエリの実行 $stmts = $stmt->fetchAll(); var_dump($stmts); <結果> array(2) { [0]=> array(6) { ["id"]=> string(1) "1" [0]=> string(1) "1" ["name"]=> string(6) "田中" [1]=> string(6) "田中" ["age"]=> string(2) "40" [2]=> string(2) "40" } [1]=> array(6) { ["id"]=> string(1) "2" [0]=> string(1) "2" ["name"]=> string(6) "佐藤" [1]=> string(6) "佐藤" ["age"]=> string(2) "35" [2]=> string(2) "35" } } 学んだこと ・queryは実行まで行う(execute必要ない) ・bindParamとbindValueの違い ・値の参照の意味 ・fetch,fetchAllの取得内容
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【php】サイコロを作成せよ

<?php $rand_num = rand(1,6); echo "サイコロの値は".$rand_num."です。"; ?>
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

eccube4+nginx+AmazonLinux2で構築してみた。

aws研修の一環で作成することになりましたので、メモ書きがわりに残しておきます。 Eccube4のシステム要件ではApacheが推奨でありますが、研修ではnginxで作成する方針になりました。 世の中的にはnginxの方がシェア拡大中でありますので、こちらで作成した方が良いとの判断なのでしょうね。 ECCUBE4システム要件参考 インストール eccube4に必要なパッケージをインストールしていきます。 phpインストール [ec2-user@ip-10-2-0-227 ~]$ sudo yum -y install php74 php74-php ・・・略・・・ [ec2-user@ip-10-2-0-227 ~]$ php -v PHP 7.4.19 (cli) (built: May 4 2021 11:06:37) ( NTS ) Copyright (c) The PHP Group Zend Engine v3.4.0, Copyright (c) Zend Technologies with Zend OPcache v7.4.19, Copyright (c), by Zend Technologies composerインストール 以下にアクセスし、4行のコマンドを実行 https://getcomposer.org/download/ [root@ip-10-2-0-227 ~]# composer ______ / ____/___ ____ ___ ____ ____ ________ _____ / / / __ \/ __ `__ \/ __ \/ __ \/ ___/ _ \/ ___/ / /___/ /_/ / / / / / / /_/ / /_/ (__ ) __/ / \____/\____/_/ /_/ /_/ .___/\____/____/\___/_/ /_/ Composer version 2.0.13 2021-04-27 13:11:08 nginx インストール [ec2-user@ip-10-2-0-227 ~]$ sudo yum install -y nginx ・・・略・・・ [ec2-user@ip-10-2-0-227 ~]$ nginx -v nginx version: nginx/1.16.1 私はApacheで作成テストしたのち、nginxに移行したので、競合しないための処置を行う。 [ec2-user@ip-10-2-0-227 ~]$ sudo systemctl stop httpd [ec2-user@ip-10-2-0-227 ~]$ sudo systemctl start nginx [ec2-user@ip-10-2-0-227 ~]$ sudo systemctl enable nginx Created symlink from /etc/systemd/system/multi-user.target.wants/nginx.service to /usr/lib/systemd/system/nginx.service. [ec2-user@ip-10-2-0-227 ~]$ sudo systemctl disable httpd Removed symlink /etc/systemd/system/multi-user.target.wants/httpd.service. php-fpm インストール どうやらnginxを使う際にはphp-fpmなるものが必要らしいのでこれをインストール ただ、当環境において普通にインストールするとphp-fpmのversionは5系となってしまう。 これでは、phpのversionとのずれ、及びeccubeのシステム要件と一致しないため注意。 (これに気づかず1時間取られた。) php-fpm詳細 [ec2-user@ip-10-2-0-227 ~]$ sudo yum install -y php74-php-fpm ・・・略・・・ [ec2-user@ip-10-2-0-227 ~]$ sudo cp /etc/opt/remi/php74/php-fpm.d/www.conf /etc/opt/remi/php74/php-fpm.d/www.conf.org [ec2-user@ip-10-2-0-227 ~]$ sudo vi /etc/opt/remi/php74/php-fpm.d/www.conf [ec2-user@ip-10-2-0-227 ~]$ sudo systemctl start php74-php-fpm [ec2-user@ip-10-2-0-227 ~]$ sudo systemctl enable php74-php-fpm /etc/opt/remi/php74/php-fpm.d/www.conf は以下のように編集してください。 詳細 userやgroupに指定するのもはwww-dataなども挙げられますが、nginxの記述によります。 詳しくはnginxの設定で述べます。 /etc/opt/remi/php74/php-fpm.d/www.conf user = nginx group = nginx eccube4 インストール [ec2-user@ip-10-2-0-227 ~]$ pwd /home/ec2-user/ [ec2-user@ip-10-2-0-227 ~]$ unzip eccube-4.0.5.zip [ec2-user@ip-10-2-0-227 ~]$ mv eccube-4.0.5 eccube [ec2-user@ip-10-2-0-227 ~]$ sudo chown nginx:nginx eccube [ec2-user@ip-10-2-0-227 ~]$ sudo chmod -R o+x eccube [ec2-user@ip-10-2-0-227 ~]$ ls -l 合計 42796 drwxrwxrwx 11 nginx nginx 4096 5月 10 03:43 eccube -rw-r--r-x 1 ec2-user ec2-user 43804031 5月 6 03:21 eccube-4.0.5.zip とりあえずインストールは終わりです。 nginx設定 [ec2-user@ip-10-2-0-227 ~]$ sudo vi /etc/nginx/nginx.conf [ec2-user@ip-10-2-0-227 ~]$ sudo systemctl restart nginx /etc/nginx/nginx.conf user nginx; 5行目くらいにuserがあります。 これでnginx(webサーバを実行するユーザを指定します。) 以下変更部 /etc/nginx/nginx.conf server { listen 80 default_server; listen [::]:80 default_server; server_name _; root /home/ec2-user/eccube/; access_log /var/log/nginx/eccube.log; error_log /var/log/nginx/eccube.error.log; # Load configuration files for the default server block. include /etc/nginx/default.d/*.conf; location / { index index.php index.html; try_files $uri $uri/ /index.php; } error_page 404 /404.html; location = /404.html { } error_page 500 502 503 504 /50x.html; location = /50x.html { } location ~ install\.php\/.+$ { fastcgi_pass 127.0.0.1:9000; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; fastcgi_param PATH_INFO $fastcgi_script_name; include fastcgi_params; try_files $uri $uri/ /install.php; } # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000 location ~ \.php { fastcgi_pass 127.0.0.1:9000; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; fastcgi_param PATH_INFO $fastcgi_script_name; include fastcgi_params; try_files $uri =404; } } 以上で、無事eccubeが構築できたかと思います。 メモ書き curl webブラウザが正常に動いているかどうかは、 $ curl http://localhost/ いちいちwebブラウザ開かなくてもこれで確認するのが早いです。 40x系、50x系エラーの対処 何が起こっているかはちゃんとエラーログに載ってるので、これをみましょう。 同じコマンドを何回も打つとかやりがちですけど、無駄なので。 $ sudo cat /var/log/nginx/eccube.error.log ここからは私が遭遇したエラーログです。 Permission denied系 eccubeのPATHや、権限周りを確認してください。 eccube4 インストールで述べたchown,chmod周り、PATH関係を確認してください。 FastCGI sent in stderr: "PHP message: PHP Parse error: php-fpmのversionが5系が入っている可能性が高いです。 php-fpm インストールで述べたあたりを参考にしてください。 phpのページがダウンロードされてしまう。 php-fpmが正常に実行されていない可能性が高いです。 $ sudo systemctl status php74-php-fpm.service ● php74-php-fpm.service - The PHP FastCGI Process Manager Loaded: loaded (/usr/lib/systemd/system/php74-php-fpm.service; enabled; vendor preset: disabled) Active: active (running) since 月 2021-05-10 03:21:36 UTC; 1h 58min ago Activeがactiveになっていることを確認してください。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【php】ゼロ・プラス・マイナスを繰り返し判定する

<?php $count = trim(fgets(STDIN)); echo "受け取った整数".$count . "\n"; for ($i = 0; $i < $count; $i++) { $number = trim(fgets(STDIN)); if ($number == 0) { echo $number . "は0\n"; } elseif ($number > 0) { echo $number . "はプラス\n"; } else { echo $number . "はマイナス\n"; } } ?> 標準入力から整数を 1 個受け取る 受け取った整数を表示する 受け取った整数回分、以下の処理を繰り返す a. さらに標準入力から整数を 1 個受け取る b. その整数が 0 の場合、以下のメッセージを表示する c. その整数が 0 より大きい場合、以下のメッセージを表示する d. それ以外の場合、以下のメッセージを表示する
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

laravel newInstance() メソッドの定義場所 個人メモ

目的 各モデルクラスでインスタンスを作るときに使用するnewInstance()メソッドの記載場所をメモ的にまとめておく 場所 アプリ名ディレクトリ/vendor/laravel/framework/src/Illuminate/Database/Eloquent/Model.phpの中に記載されている。 下記に定義部分を抜粋して記載する。 アプリ名ディレクトリ/vendor/laravel/framework/src/Illuminate/Database/Eloquent/Model.php /** * Create a new instance of the given model. * * @param array $attributes * @param bool $exists * @return static */ public function newInstance($attributes = [], $exists = false) { // This method just provides a convenient way for us to generate fresh model // instances of this current model. It is particularly useful during the // hydration of new objects via the Eloquent query builder instances. $model = new static((array) $attributes); $model->exists = $exists; $model->setConnection( $this->getConnectionName() ); $model->setTable($this->getTable()); return $model; } 各モデルクラスはアプリ名ディレクトリ/vendor/laravel/framework/src/Illuminate/Database/Eloquent/Model.phpに記載されているModelクラスを継承して作成されている。そのため各モデルクラスでもnewInstance()メソッドを使うことができる。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

PHP classの継承(オーバーライド)について

CakePHPを使用していて継承を使いたくなった時のメモ 参考記事:https://www.atmarkit.co.jp/ait/articles/1508/05/news021.html 結論 オーバーライドは継承元のメソッドがpublicでもprotected でも可能 検証例1 <?php class hoge { protected function A() { echo "hoge's Aを呼びます\n"; } // public $i_ = 1; } // class foo extends hoge { public function A() { echo "foo's Aを呼びます\n"; } // public $i_ = 999; } // class fooを使う $foo_obj = new foo(); $foo_obj->A(); var_dump($foo_obj); 結果 /*foo's Aを呼びます object(foo)#1 (1) { ["i_"]=> int(999) }*/ 上記例では継承元hogeクラスのprotectedメソッド A()を子クラスfooでオーバーライドしている。 検証例2 親クラスのオーバーライドをした時に親クラスの元のメソッドも呼びたい場合 parent::メソッド名()を使用する <?php class hoge { protected function A() { echo "hoge's Aを呼びます\n"; } } // class foo extends hoge { public function A() { echo "foo's Aを呼びます\n"; parent::A(); } } // class fooを使う $foo_obj = new foo(); $foo_obj->A(); 結果 /* foo's Aを呼びます hoge's Aを呼びます */
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

「転生したらスライムだった件」の大賢者チャットボットを作ってみた件

チャットボットを制作していたのですが、ボットとの会話が味気ないなと感じ、思案した結果、転スラの大賢者風に話せてみようと作ってみました。 「転スラ」をご存じないという方はこちらを見てください。 https://www.ten-sura.com/ 完成イメージ動画 前回書いた記事 環境 Windows10 Virtualbox v6 Docker AWS CLI Nginx Botpress v12 PHP 参考リンク Botpressインストール 今回はWindows10上にVirtualboxをセットアップしてCentos7をインストール、そのCentos7にDockerを入れてBotpressのコンテナを起動させています。 かなり複雑になってしまった。。。(;^ω^) Botpress設定 全体フロー図 段々とノードが増えていくにつれ、見にくくなっていくので対象のノードを探すのに困っています。このあたり何んとかならないものかな。。。 システムフロー ユーザ→Bopress→API→コマンド実行 FAQ Emulatorをしばらく置いておくとセッションが切れてしまうので面倒でしたが↓で設定できることが分かりました。 最後に Botpressはチャットボットを自分で一からスクラッチ開発出来るので気に入っています。 今回はチャットボットの制作で力尽き、詳細をお伝えできませんがまたその内、更新したいと思います。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

連想配列で使うforeach

連想配列を利用することで繰り返し表示することができる。 'りんご', 'grape' => 'ぶどう', 'lemon' => 'レモン', 'tomato' => 'トマト', 'peach' => 'もも' ]; $fruits = [ 'apple' => 'りんご', 'grape' => 'ぶどう', 'lemon' => 'レモン', 'tomato' => 'トマト', 'peach' => 'もも' ]; //りんご、ぶどうetcの右側の日本語だけを取り出す foreach($fruits as $val){ print($val . "\n"); } //インデックスごと取り出すときは foreach($fruits as $english => $japanese){ print($english . ':' . $japanese . "\n"); } //"$english"と"$japanese"の部分は、様々な値に変更することが可能。 //例えば、"$val"や"item_name"など変更するものによる ?>
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む