20210914のPHPに関する記事は14件です。

PHPでselectBox作ってみた

PHPでselectBox作ってみた タイトル通りです。 <?php $busho_list = array("営業部","経理部","製造部","開発部",); $select_option = 2; $select_box = "<select name='busho'>"; foreach($busho_list as $key => $busho){ $selected = ""; if($key === $select_option){ $selected = "selected"; } $select_box .= "<option value='{$key}' {$selected}>{$busho}</option>"; } $select_box .= "</select>"; echo $select_box; 変数$select_optionにデータベースから取得した値を代入することでデフォルトの選択を動的に変更することができます。 $busho_list自体もマスタなどから取得すれば選択項目も動的に作ることができますね♪ 部署みたいに会社によって大きく異なる要素はPHPで動的に作ってあげることで、どんなに部署が増えてもHTMLを修正することなく選択肢を追加することができました。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

自分用 Laravel 備忘録(基礎用語編)

※自分が確認する用です。 基礎用語編 artisan(アルチザン) ファイル作成や設定、DB操作など様々な操作が出来るコマンド。 Auth ユーザ認証・ログイン管理。 csrfトークン ユーザの意図しないリクエスト送信を防ぐ。 Blade Laravelテンプレートエンジン。〜blade.php。書き方は基本HTML。 Bootstrap webページのレイアウトの見え方を制御するフレームワーク。 Eloquent(エロクエント) DBのレコードをオブジェクトとして扱えるようにしてくれる(リレーション)をしてくれる、Laravel内蔵のORM。 HTTPリクエスト ブラウザ⇄web間のやり取りで定められた手順。 get.post.put(更新).delete(削除).head(ヘッダ取り出し)など。 Migration データベースを作成、管理する。 Requesut ユーザー情報の全てを取得してくれる。 rollback 実行されたMigrationのテーブル、カラムやデータ型を変更する時に使用。 Routing アクセスを個別のController内のActionに割り当てる。Route::での指定。 Sass CSSを管理するフレームワーク。コンパイルする時は、ターミナルの処理を忘れずに。 $ npm run watch $this メソッド外で定義された変数などをメソッド内で呼び出す際に使用する。 Validation Modelに保存する前に、データの不備を検証する。 webpack cssやJavaScriptを1つにまとめる。 インスタンス化 クラス(設計図)からインスタンス(実体)を生成すること。 継承 レイアウトを作成し、他のBladeファイルでも使用できるようにする。 デプロイ アプリケーションを本稼働(サーバを用意してアプリケーションをインストール)する。 @ Bladeファイルでメソッドなどを使用する時に用いる。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

自分用

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

dockerでphpのサーバーを立てる

カレントディレクトリにphpファイルを置く。 index.php <html> <head> <title>PHP Test</title> </head> <body> <?php echo '<p>Hello World</p>'; ?> </body> </html> apacheが含まれているdockerコンテナを動かす。 docker run -it --rm --name php -p 80:80 -v $PWD:/var/www/html php:apache サーバーが立つ。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【5枚目】おっさんが入門CakePHP (動画第6回:新規登録の解説)

ケーキも5枚目に成ってかなり胃もたれしてきてます。。。 動画再生(2倍で)娘に又それかよって言われながら進めてます。 https://www.youtube.com/watch?v=ieFp-Y9sZIg&t=414s 今回の動画でやること ・新規登録の動きを確認 ・Code解説 新規登録画面を開く ・Code解説 ユーザ登録をする 前回配置したソース類を使用してお勉強するので今回はほ見るだけ。(ソースは追いかける) いつも通りXAMPPからApacheとMySQLを開始して WEBブラウザで画面動作確認 上記画面のように「New User」にカーソルを当てると 押下時に遷移するURLが画面左下に表示される。 押下したら新規登録画面を表示するために UsersControllerのaddメソッドが呼ばれる。 前回のソースの動きを説明 新規登録のためのメソッドを説明 POSTとGESTの説明 setメソッドの説明でcompact関数を使うと説明があるのだが メソッドと関数は何が違うのん? set・・・・・CakePHPが用意しているメソッド compact・・・PHPの関数 この辺の説明が無いのでサラッと分かった気になるんだけど実は良く解って無いってことに成りそうなので気になるポイントがあったらググるの必要だね。 ブラウザを使用したデバッグツールを使用して動作確認するのだけど こういう操作教えてくれるの親切で良いよね。 UserController.phpのaddメソッドを確認 ソースの内容はpostからの動きの確認程度。 patchentityを使用することによってCakePHPの便利機能を使うことができる。 バリデーションを自動でやってくれるが説明は後日らしい。いつだろうか?? saveメソッドで登録するっと。これもCakePHPのメソッドらしい。 cakephp固有メソッドの説明が無いの微妙だな・・・ WEBで調べても日本語のリファレンス的なのは意外と出てこなくて ググっても結局公式のサイトぐらいしか見つけられなかったのだけど 現在勉強中の画面から遷移できることに気づいた・・・ 動画ではv3.8を使用しているので3.8を選択してリファレンスを利用 動画のまとめ ・GETとPOSTは用途で使い分ける   GET→取得   POST→データ送信 ・FormのnameとDBのカラム名は同じにすることによりCakePhpの便利機能が使える。 ・setメソッドはcompactメソッドを使うことにより引数と同じ名前の変数をセットできるのでコードが短くできる。 所感: 正直、ソースの内容は簡単なので誰でもわかると思う。 テンポよくてザックリわかるのは良いところだが 複雑な説明などを後回しにしているので自学が必要。 思い出: WEBシステム初期のころはオレオレフレームワークを作ってチームメンバーに文句言われてたなあ...( = =) トオイメ
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

初学者向けにCookieの概念と使い方を説明してみる

#はじめに 本稿は初学者向けにCookieの概念から実際の使い方までを解説した記事になります。 Cookieが何のために存在して、どのように使うのかといったことをざっくり理解して頂ければ幸いです。 実際の使い方だけ学びたい方は、2 実際のCookieの使用方法から読んでください。 #目次 1 Cookieとは 1.1 そもそもCookieって何のためにあるの? 1.2 セッションとの違い 1.2.1 保存先 1.2.2 有効期間 2 実際のCookieの使用方法 2.1 Cookieを保存する 2.2 Cookieを呼び出す 2.3 設定したCoookieを確認する #1 Cookieとは ここでは、そもそもCookieとはなんぞや?という話をします。 #1.1 そもそもCookieって何のためにあるの? Cookieを説明するにあたって、まずWebブラウザとサーバー間の通信について触れます。 まず、Webブラウザとサーバー間でデータをやり取りするために使われるHTTPプロトコル(通信の手続き)はステートレスという状態です。 つまり、Webページを表示しているサーバーは前のページからの続きなのか関連したアクセスなのか以前の状態を全く覚えていないということです。(HTTPプロトコルはステートレスであるという説明は難しいと思うので、最低限ここだけ分かっていれば良いです) SNSを例に出すと、「ログインする」「自分のマイページに入る」「誰かの投稿を見る」といったような一連の機能があると思いますが、ステートレスな状態では「誰がログインしているか」「誰のマイページなのか」「誰の投稿を表示するのか」といったところが判別できないのです。 そのステートレスな状態を管理するために生まれた技術のひとつがCookieです。 SNSの例で言うと、「ログインしているのは○○さん」「表示すべきマイページは○○さん」「○○さんの投稿を表示する」といった情報をCookieを使って保存しています。 サイトにアクセスする際にこれらの情報を呼び出すことによって、それぞれのユーザーがそれぞれの画面でSNSを利用することができます。 そして、Cookieが保存する情報はWebサーバーが発行し、Webブラウザ上に保存されるという特徴を持っています。(ちなみに保存する技術名だけでなく、保存される情報のことも一般的にCookieと呼びます。) ブラウザは同じサイトにアクセスする際にはそのCookieをWebサーバーに送信し、 Webサーバーはブラウザからのリクエスト毎にCookieが保存した情報を参照することができます。 実はCookieの用途はこれだけではないのですが、紹介しきれないので割愛します 知りたい方は以下ドキュメントを参照してください MDNのHTTP Cookieのドキュメント 参考: 【PHP超入門】Cookieとセッションについて Cookieとセッションをちゃんと理解する 「Cookie」と「セッション」と「セッションCookie」の違い #1.2 セッションとの違い 少し話は脱線しますが、一時的に情報を保存する技術ということで類似点があるセッションとの違いについても触れておきます。 大きな違いとしては2つあります。 保存先と有効期間です。 #1.2.1 保存先 先ほどCookie内の情報の保存先について、 Webサーバーが発行し、Webブラウザ上に保存されると書きましたが、 これに対してセッションは、Webサーバーに保存されます。 #1.2.2 有効期間 Cookieが情報を保持できる期間は任意で設定できるのに対し、 セッションはブラウザを閉じるまでしか保持できません。 参考:11.3 セッションの仕組みを理解しよう #2 実際のCookieの使用方法 Cookieの概念を説明したところで、実際のコードの書き方を解説します。 (ここではPHPを使用して説明します) ##2.1 Cookieを保存する Cookieを保存するにはsetcookie()を使用します。 setcookie(’キー’,’保存したい値’,’有効期限’) 第3引数を設定しないことも可能ですが、ブラウザを閉じると消えてしまいます。 (第4引数以降は省略します。知りたい方は下記のドキュメントを参照してください。) 参考:MDNのsetcookieのドキュメント 以下の例ではキーをanimal,保存したい値をpanda,有効期限を保存時から24時間(606024秒)後に設定しています。 <?php //ここでCookieに情報を入れる setcookie('animal','panda',time()+60*60*24); //time関数 time()は現在時刻(単位/秒)を指します。 ?> //実際に動作させるのであれば、HTMLのコードはこの下に書きます。(省略) このsetcookie()を動作させる順番は、必ず文字列が出力される前に動作させないといけません。 (エラーが出ます。) #2.2 Cookieを呼び出す Cookieを呼び出すには$_COOKIE[]を使用します。 $_COOKIE['キー'] 引数でキーを指定することで、対応した保存した値を呼び出すことができます。 (先ほどの例で言うと、キーにanimalを指定するとpandaを呼び出すことができます。 先ほど保存したCookieを呼び出して、出力をしてみます。 入力 //HTMLは省略 <?php //キー:animal 保存した値:panda echo 'Cookieの中身は:'.$_COOKIE['animal'].'です'; ?> 出力 //キー:animal 保存した値:panda Cookieの中身は:pandaです #2.3 設定したCookieを確認する 設定したCookieを確認するには、各ブラウザの開発者ツールを使います。 ブラウザによって確認方法が違うので、下記リンクを参照してください。 主要ブラウザCookieの確認方法まとめ
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Laravel Sail 導入時に発生したエラーと解決方法

Laravel Sailを使ってLaravelをインストールしてみようとしたときのうっかりミスとその解決方法。 うっかり編 公式ページに書いてあるインストレーションを進める。 $ curl -s "https://laravel.build/example-app" | bash docker: Error: remote trust data does not exist for docker.io/laravelsail/php80-composer: notary.docker.io does not have trust data for docker.io/laravelsail/php80-composer. See 'docker run --help'. bash: line 16: cd: example-app: No such file or directory Please provide your password so we can make some final adjustments to your application's permissions. Password: Thank you! We hope you build something incredible. Dive in with: cd example-app && ./vendor/bin/sail up エラーが表示されていたが「Thank you!」って言ってるし、進める。 $ cd example-app && ./vendor/bin/sail up cd: no such file or directory: example-app ディレクトリがないと言われるので、疑問に感じつつも、自分で作る。 $ mkdir example-app モッカイヤッテミル。 $ cd example-app && ./vendor/bin/sail up zsh: no such file or directory: ./vendor/bin/sail エラー解決編 もう一度、最初のエラーを解決して進めます。 docker: Error: remote trust data does not exist for docker.io/laravelsail/php80-composer: notary.docker.io does not have trust data for docker.io/laravelsail/php80-composer. 上記のエラーは、こちらの記事によるとDockerのセキュリティ機能DOCKER_CONTENT_TRUST(DCT)が有効になっているというのがエラーの原因でした。 # 環境変数を設定。 $ export DOCKER_CONTENT_TRUST=0 # もう一度実行。 $ curl -s "https://laravel.build/example-app" | bash # インストレーションが進む中に以下のテキストが、、、! Application already exists! 先ほど、ディレクトリを消し忘れておりました 自分で作ったexample-appを削除し、再度実行。 $ curl -s "https://laravel.build/example-app" | bash 無事、Laravelがインストールされました! 結論編 Laravel Sailはディレクトリは自動生成してくれるので、自分で作らないように。 あと、エラーがあっても We hope you build something incredible. Dive in with: cd example-app && ./vendor/bin/sail up と進めてくるので注意です。 初歩的なミスでしたが誰かの参考になれば幸いです。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【実務で使えるLaravel】取得したデータを配列に追加する方法

実務の学びを記事にします。 取得したデータを配列に追加する方法です。 $hoge = array(); $categories = $this->category->findCategories(); foreach ($categories as $category) { array_push($hoge, $category->category_name); } $categoriesはコレクションでカテゴリーデータを何件か取得するロジックです。 まず、$hoge = array()で空の配列を用意し、array_pushで配列の最後に要素を追加できます。 array:3 [▼ 0 => "85HCKP3sfL" 1 => "XOF4msHVdd" 2 => "ir10PRKDGp" ] こんな感じで配列にカテゴリーの名前を追加できます。 もう一つプラスαで覚えておくべきは、in_arrayです。 if (in_array('aaa', $hoge)) { echo 'true'; } else { echo 'false'; } こんな感じで、$hogeの配列にaaaがあるか判定します。あればtrue,なければfalseを返すようにしました。 今回では$hogeの配列は、 $hoge = ('85HCKP3sfL', 'XOF4msHVdd', 'ir10PRKDGp') このようになっており、aaaは存在しないためfalseがかえります。 if (in_array($category->category_name, $hoge)) { echo 'true'; } else { echo 'false'; } これならtrueが返ってきます。 in_arrayの使い道として、コントローラーからビューに変数を渡したときに、in_arrayで要素があればAのビューを読み込むみたいなことができるでしょう。 ※さらにis_nullも付け加えるといいでしょう。 if (!is_null($hoge) && in_array($category->category_name, $hoge)) { Aの画面 } else { Bの画面 } エンジニア・フリーランスにおすすめの転職サイト https://www.kamome-susume.com/enginner-job-change-site/
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

[PHP] GoogleAdsAPIでSearchした結果の総件数を取得する方法

例えば広告グループをSearchする場合、GoogleAdsAPIのリファレンスやExampleを見ても、API通信のResponseから広告グループ名やResourceNameを取得する方法はすぐわかりますが、広告グループがいくつあるかを取得する方法は探しづらかったので、他の方がこんなことに時間かけなくていいようにという意味も込めてメモ。 どこに総件数が入っているのか? 結論から言えば、SearchGoogleAdsResponse クラスに、「total_results_count」というプロパティがあり、これが取得結果の総件数にあたります。 URL:https://developers.google.com/google-ads/api/reference/rpc/v8/SearchGoogleAdsResponse じゃあ公式のExampleを少しいじって、このプロパティを取得しにいけばええやろがいと思われるかもしれませんが、GoogleAdsAPIのリファレンスばかり見ているとその方法にたどり着けないです。 公式のExampleを見てみよう 私がやったときはアカウント内のキーワードの総件数を取得しようとしていたので、Get Keywordsを見ていきます。 URL:https://developers.google.com/google-ads/api/docs/samples/get-keywords Response取得部分だけここに書きます。 GetKeywords.php // Issues a search request by specifying page size. $response = $googleAdsServiceClient->search($customerId, $query, ['pageSize' => self::PAGE_SIZE]); // Iterates over all rows in all pages and prints the requested field values for // the keyword in each row. foreach ($response->iterateAllElements() as $googleAdsRow) { /** @var GoogleAdsRow $googleAdsRow */ printf( "Keyword with text '%s', match type '%s', criterion type '%s', and ID %d " . "was found in ad group with ID %d.%s", $googleAdsRow->getAdGroupCriterion()->getKeyword()->getText(), KeywordMatchType::name( $googleAdsRow->getAdGroupCriterion()->getKeyword()->getMatchType() ), CriterionType::name($googleAdsRow->getAdGroupCriterion()->getType()), $googleAdsRow->getAdGroupCriterion()->getCriterionId(), $googleAdsRow->getAdGroup()->getId(), PHP_EOL ); } これを見ればわかる通り、Response の iterateAllElements()というメソッドを使って GoogleAdsRow クラスのオブジェクトがいくつも入った配列を取得し、それに対して forEach を使って取得結果を一件ずつ取り出しています。 私は最初、「じゃあこの$responseがSearchGoogleAdsResponseクラスのオブジェクトだろう」と考え、クライアントライブラリのSearchGoogleAdsResponse.phpのファイルを見に行き、getTotalResultsCount()というメソッドを見つけて、これだと思って意気揚々とこいつを実行してみました。 コードはこんな感じだったと思います。 getNumOfKeywords.php $search = $googleAdsServiceClient->search($customerId, $query, ['pageSize' => 1000]); $count = $search -> getTotalResultsCount(); var_dump($count); しかし、「getTotalResultsCount()なんていうメソッド、PagedListResponseクラスには定義されてないよ」というエラー文が出ました。 てっきり$responseの変数にはSearchGoogleAdsResponseクラスのオブジェクトが入っていると思い込んでいた私はビックリしました。 Google汎用ライブラリのクラスだった そして思いました。「このPagedListResponseというクラスはなんぞや」と。 とりあえずGoogleAdsAPIのリファレンスで検索してみます。(ポチー 「No results found.」 えぇ...。 そしてGoogle大先生に質問しに行きます。 すると... ありました。 どうやらGoogleの汎用ライブラリのクラスだったみたいです。 このクラスのメソッド一覧を見てみると、getPage()というメソッドがありました。Pageクラスにありそうだな、と目星をつけ、Pageクラスのリファレンスページに行く。 メソッド一覧を見ると、「getResponseObject() Gets the API response object.」という表記が。 これだ!!!!!! というわけで、こんなコードで実行してみる。 getNumOfKeywords.php $pagedResponse = $googleAdsServiceClient->search($customerId, $query, ['pageSize' => 1000]); $count = $pagedResponse->getPage()->getResponseObject()->getTotalResultsCount(); error_log($count); forEachじゃないのはなんで?と思われる方もいるかもしれませんが、どのPageオブジェクトにも同じようにtotal_results_countプロパティは含まれているので読み込むPageオブジェクトは1個で良く、iteratePages()メソッドを使ってPageクラスのオブジェクトの配列を取得してforEachで回す必要はないのです。 そして出力されてきたログを見ると... 「0」 なんで!?って叫びそうになりました。 オプションの値の設定を忘れずに そこから30分ほどネットの海を漂流し、何も見つからなかったのでクライアントライブラリのSearchGoogleAdsResponse関連のファイルを眺めていたのですが、GoogleAdsServiceGapicClient.phpファイルの、search()メソッドが定義してある部分のコメントに気が付きました。そこに、 GoogleAdsServiceGapicClient.php //@param array $optionalArgs { // Optional. // @type bool $returnTotalResultsCount // If true, the total number of results that match the query ignoring the // LIMIT clause will be included in the response. という記述があったのです。なるほどパラメーターが必要なのか。 というわけで先ほどのコードを以下のように修正します。 getNumOfKeywords.php $pagedResponse = $googleAdsServiceClient->search($customerId, $query, ['pageSize' => 1000, 'returnTotalResultsCount' => true]); $count = $pagedResponse->getPage()->getResponseObject()->getTotalResultsCount(); error_log($count); これで正しい値が出力されました!長かったーーー。 後書き 実は私は最初、ExampleにあるFor文を使って、results[]の配列の要素数をcount()で数えて、変数に足していけばええやん!と思って作っていたのですが、PHP君に「メモリが足りないよ!!」と泣き言を言われてしまいました。 他の人に相談すると、取得結果の総件数くらいAPIの方で数えて渡してくれるでしょ、と助言いただいたので、こうやって探すことができました。 ちなみにこの方法でも、pageSizeを10000(上限)とかにするとメモリが足りなくなるかもしれないので注意! 最後までお読みいただきありがとうございました。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【PHP】少数切り上げのやり方

<?php switch (true) { case $count >= 5: $colspan = 3; $rowspan = ceil($count / 3); break; }
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【PHP】多次元配列の重複を削除

<?php $rows = [ 0 => [ 'id' => 10, 'language' => 'PHP', 'framework' => 'Laravel'], 1 => [ 'id' => 20, 'language' => 'Java', 'framework' => 'Spring'], 2 => [ 'id' => 30, 'language' => 'JavaScript', 'framework' => 'Vue.js' ], 3 => [ 'id' => 40, 'language' => 'Ruby', 'framework' => 'Ruby on Rails' ], 4 => [ 'id' => 40, 'language' => 'Ruby', 'framework' => 'Ruby on Rails' ], 5 => [ 'id' => 40, 'language' => 'Ruby', 'framework' => 'Flutter' ] ]; $size_list = array_unique($rows, SORT_REGULAR); 結果 array(5) { [0]=> array(3) { ["id"]=> int(10) ["language"]=> string(3) "PHP" ["framework"]=> string(7) "Laravel" } [1]=> array(3) { ["id"]=> int(20) ["language"]=> string(4) "Java" ["framework"]=> string(6) "Spring" } [2]=> array(3) { ["id"]=> int(30) ["language"]=> string(10) "JavaScript" ["framework"]=> string(6) "Vue.js" } [3]=> array(3) { ["id"]=> int(40) ["language"]=> string(4) "Ruby" ["framework"]=> string(13) "Ruby on Rails" } [5]=> array(3) { ["id"]=> int(40) ["language"]=> string(4) "Ruby" ["framework"]=> string(7) "Flutter" } }
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Laravelでイベントを用いてメールを送信する

概要 Laravelのイベントとリスナーを使って、フォームからの問い合わせが来たときに、通知メールを送信する処理を実装します。 実行環境 上記の記事を参考に、GitHubのテンプレートリポジトリから環境を構築しています。 Laravel6.* 実装の大まかな流れ 環境変数にメール送信に必要な情報を設定 メール送信用クラスの作成 メールのViewを作成 イベントの作成 リスナーの作成 イベントとリスナーを紐づけ イベントの発行 環境変数(.env)に必要情報を設定 .env MAIL_DRIVER=smtp MAIL_HOST=XXXXX.jp //サーバのドメイン名やIPアドレス MAIL_PORT=587 //ポート番号は各環境に依存 MAIL_USERNAME=XXXXX@XXXXX.co.jp //メールで利用するユーザ名 MAIL_PASSWORD=XXXXX //メールで利用するパスワード MAIL_ENCRYPTION=null MAIL_FROM_ADDRESS=XXXXX@XXXXX.co.jp //メールの送信元アドレス ACCEPT_MAIL_ADDRESS=XXXXX@XXXXX.co.jp // メールの送信先アドレス \config\app.php <?php return [ 'aliases' => [ // 省略 ], // 問い合わせ用メールアドレスを設定 'mail_from_address' => env('MAIL_FROM_ADDRESS'), 'accept_mail_address' => env('ACCEPT_MAIL_ADDRESS'), ]; メール送信用クラスの作成 app\Mail配下にContactMail.phpを作成 $ php artisan make:mail ContactMail メール送信用クラスの編集 ContactMail.php <?php namespace App\Mail; use Illuminate\Bus\Queueable; use Illuminate\Contracts\Queue\ShouldQueue; use Illuminate\Mail\Mailable; use Illuminate\Queue\SerializesModels; class ContactMail extends Mailable { use Queueable, SerializesModels;   // 追記 private $contact; /** * Create a new message instance. * * @return void */ public function __construct($contact) // コンストラクタの引数で値を受け取る { // ContactMailクラスのprivate変数に引数の値を代入 $this->contact = $contact; } /** * Build the message. * * @return $this */ public function build() { return $this ->from(config('app.mail_from_address')) // 送信元のメールアドレスを指定 ->subject('お問い合わせ完了のご連絡') // メールの件名 ->view('emails.contact_mail') // どのテンプレートを呼び出すか ->with(['contact' => $this->contact]); // withオプションでセットしたデータをテンプレートへ受け渡す } } メール送信用のViewを作成 resources\views配下にemailsフォルダを作成 $ mkdir emails フォルダ作成後、resources\views\emails配下に、contact_mail.blade.phpを作成 メール送信のViewを編集 contact_mail.blade.php <html> <head> <title>sample</title> </head> <body> メール送信しました </body> </html> イベントの作成 app\Events配下にContactRequestCompleted.phpを作成 $ php artisan make:event ContactRequestCompleted イベントの編集 イベントのコンストラクタを修正 イベント発火時に必要な情報をコンストラクタで渡しておく。 ContactRequestCompleted.php class ContactRequestCompleted { use Dispatchable, InteractsWithSockets, SerializesModels;   // 追記 public $contact; /** * Create a new event instance. * * @return void */ public function __construct($post) // コンストラクタの引数でフォームから値を受け取る { // ContactRequestCompletedクラスのpublic変数に引数の値を代入 $this->contact = $post; } /** * Get the channels the event should broadcast on. * * @return \Illuminate\Broadcasting\Channel|array */ public function broadcastOn() { return new PrivateChannel('channel-name'); } } リスナーの作成 app\Listeners配下にSendContactRequestEmail.phpを作成 $ php artisan make:listener SendContactRequestEmail リスナーの編集 SendContactRequestEmail内のhandleメソッドを修正 handleメソッド内に、メール送信などの具体的な処理を追加する。 SendContactRequestEmail.php <?php namespace App\Listeners; use Illuminate\Contracts\Queue\ShouldQueue; use Illuminate\Queue\InteractsWithQueue; use Mail; use App\Mail\ContactMail; class SendContactRequestEmail { /** * Create the event listener. * * @return void */ public function __construct() { // } /** * Handle the event. * * @param object $event * @return void */ public function handle($event) { // メールの送信先アドレスに、.envで指定したACCEPT_MAIL_ADDRESSの値を代入 $to_address_admin = config('app.accept_mail_address'); // 送信先アドレスにメールを送信 Mail::to($to_address_admin)->send(new ContactMail($event->contact)); } } イベントとリスナーを紐づけ Providers\EventServiceProvider.phpを編集 EventServiceProvider.php <?php namespace App\Providers; use Illuminate\Auth\Events\Registered; use Illuminate\Auth\Listeners\SendEmailVerificationNotification; use Illuminate\Foundation\Support\Providers\EventServiceProvider as ServiceProvider; use Illuminate\Support\Facades\Event; use App\Events\ContactRequestCompleted; use App\Listeners\SendContactRequestEmail; class EventServiceProvider extends ServiceProvider { /** * The event listener mappings for the application. * * @var array */ protected $listen = [ Registered::class => [ SendEmailVerificationNotification::class, ], // 作成したイベントと紐付けたいリスナーを追記 ContactRequestCompleted::class => [ SendContactRequestEmail::class, ], ]; /** * Register any events for your application. * * @return void */ public function boot() { parent::boot(); // } } イベントの発行 コントローラー等にイベントの発行処理を追加 SampleController.php use App\Events\ContactRequestCompleted; class SampleController extends Controller { // イベントの発火処理(引数で値渡しが可能) event(new ContactRequestCompleted($post)); }
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Laravel5.5を8.58にアップグレードした際の手順メモ

PHP のWebアプリケーションフレームワーク Laravel を最新バージョンに更新しました。 次回また必要になったときの、ほぼ個人的なメモなので解説はありません。環境に合わせて読み替えて下さい。 環境 Red Hat Enterprise Linux のリビルド版だった CentOS のサポート終了に伴い、Laravel移行と同じタイミングで Ubuntu に乗り換えています。 旧環境 $ cat /etc/redhat-release CentOS Linux release 7.6.1810 (Core) $ php -v PHP 7.2.3 (cli) (built: Feb 28 2018 08:39:13) ( NTS ) Copyright (c) 1997-2018 The PHP Group Zend Engine v3.2.0, Copyright (c) 1998-2018 Zend Technologies $ php artisan --version Laravel Framework 5.5.50 新環境 $ cat /etc/os-release VERSION="20.04.3 LTS (Focal Fossa)" $ php -v PHP 7.4.3 (cli) (built: Jul 5 2021 15:13:35) ( NTS ) Copyright (c) The PHP Group Zend Engine v3.4.0, Copyright (c) Zend Technologies with Zend OPcache v7.4.3, Copyright (c), by Zend Technologies $ php artisan --version Laravel Framework 8.58.0 手順 一般的には、composer.json を編集し composer updateコマンドで更新という手順になると思いますが、バージョンが開き過ぎているので、最新の Laravel を新規インストールし、旧プロジェクトファイルを手作業でマージしていくことにしました。 composer で Laravel をインストール cd /var/www/html composer create-project laravel/laravel [プロジェクト名] cd [プロジェクト名] chown -R www-data:www-data . find . -type d -exec chmod 770 {} \; find . -type f -exec chmod 660 {} \; chmod -R 777 ./storage ./bootstrap/cache validation.php 言語ファイルの日本語化 php -r "copy('https://readouble.com/laravel/8.x/ja/install-ja-lang-files.php', 'install-ja-lang.php');" php -f install-ja-lang.php php -r "unlink('install-ja-lang.php');" Laravel Fortify のインストール composer require laravel/fortify php artisan vendor:publish --provider="Laravel\Fortify\FortifyServiceProvider" config/app.php 'providers' => [ App\Providers\FortifyServiceProvider::class, // 追加 config/fortify.php return [ 'username' => 'user_id', // 必要に応じて修正 : // 必要に応じてコメントアウト 'features' => [ Features::registration(), Features::resetPasswords(), //Features::emailVerification(), //Features::updateProfileInformation(), //Features::updatePasswords(), //Features::twoFactorAuthentication([ // 'confirmPassword' => true, //]), ], config の下を編集した場合は php artisan config:clear を忘れずに。 app/Providers/FortifyServiceProvider.php public function boot() { : Fortify::viewPrefix('auth.'); // 追加 app/Providers/RouteServiceProvider.php //public const HOME = '/home'; public const HOME = '/xxxxx'; // 必要に応じて修正 protected $namespace = 'App\\Http\\Controllers'; // コメントアウトを外す Laravel Debugbar のインストール composer require barryvdh/laravel-debugbar php artisan vendor:publish --provider="Barryvdh\Debugbar\ServiceProvider" データベース設定 $ mysql -u root CREATE DATABASE [データベース名]; CREATE USER '[ユーザ名]'@'localhost' IDENTIFIED BY '[パスワード]'; GRANT ALL PRIVILEGES ON [データベース名].* TO '[ユーザ名]'@'localhost'; FLUSH PRIVILEGES; .env DB_CONNECTION=mysql DB_HOST=127.0.0.1 DB_PORT=3306 DB_DATABASE=[データベース名] DB_USERNAME=[ユーザ名] DB_PASSWORD=[パスワード] Apache設定 /etc/apache2/sites-available/virtual-host.conf Alias /[プロジェクト名] /var/www/html/[プロジェクト名]/public <Directory "/var/www/html/[プロジェクト名]/public"> AllowOverride All Require all granted </Directory> /var/www/html/[プロジェクト名]/public/.htaccess RewriteBase /[プロジェクト名] Apache の再起動 apache2ctl configtest systemctl restart apache2 ルーティング設定 routes/web.php Route::get('/', function () { //return view('welcome'); return view('auth.login'); // 必要に応じて修正 }); Route::group(['middleware' => 'auth'], function () { 最後に、コントローラやビュー、モデルの他、個別に修正していたファイルがあればマージして完成です。 モデルは\App\Modelsに置くのがデフォルトになりました。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

laravel5.5で、Authを使ったログイン時アクセスしたい画面にリダイレクトする方法

さっと書きます。 今回実装したいのは、 ログインが必要なページにアクセスした際ログイン画面にリダイレクト ↓ ログイン ↓ アクセスした元のURLにリダイレクトされる といった簡単な内容です。 すぐ答えです。以下です。 Laravel 5.5の場合、LoginController.phpを更新するだけで次のコードが機能しました public function showLoginForm() { session(['link' => url()->previous()]); return view('auth.login'); } protected function authenticated(Request $request, $user) { return redirect(session('link')); } セッションに残して、それにリダイレクトさせる簡単なコードで実装できました。 参考文献 https://www.it-mure.jp.net/ja/php/laravel-5%E3%83%AD%E3%82%B0%E3%82%A4%E3%83%B3%E5%BE%8C%E3%80%81%E5%89%8D%E3%81%AE%E3%83%9A%E3%83%BC%E3%82%B8%E3%81%AB%E3%83%AA%E3%83%80%E3%82%A4%E3%83%AC%E3%82%AF%E3%83%88/1052037127/amp/ 上記には多数のバージョンがあるので、見てみてくださいねん。 以上
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む