- 1. 変更された項目の差分を知るための PHP の array_diff_assoc の応用小ネタ
- 2. Laravel の Tinker で DI
- 3. CloudflareでGraphQLを使った話
- 4. Laravelでコマンドライン処理の単体テストを行う
- 5. LaravelでJSONリクエスト、JSONレスポンスの単体テストを行う
- 6. LaravelでHTTPリクエストの単体テストを行う
- 7. symfonyでTODOアプリ
- 8. echoとprintについて
- 9. 自前のResponseクラスを作ってテストしやすくする
- 10. rails と比べて laravel は、、、(雑感)
- 11. (続)Controllerからs3に保存されている画像を削除する(Laravel)
- 12. LaravelでDIを使う
- 13. AWSでLaravelのフォーム送信が出来なかった
- 14. for文の多重ループ
- 15. PHP で解いてみた!!Paiza練習問題「長テーブルのうなぎ屋」
- 16. Nginx経由でCVE-2018-17082脆弱性を攻撃する手法に関する個人的なメモ
- 17. PHPStanの型チェック機能をまとめる
- 18. 【Lighthouse】Variablesを使ってスキーマを送る際に空文字がnullなる問題の対処法【Laravel + GraphQL】
- 19. Laravelでテーブルの中身をcsvファイルにエキスポート&インポート
- 20. PHPとMysqlで躓いた点まとめ
変更された項目の差分を知るための PHP の array_diff_assoc の応用小ネタ
### 概要
ユーザがあるフォームからユーザ情報を変更したとする。
「どの項目が変更されたのだろう?」 というのを簡単に知る方法はないかというところで array_diff_assoc を使った小ネタです。例えばユーザ情報の所属が `開発部` から `プロダクト部` に変更されたとすると、
`所属`の項目が変わったのだな、と知ることができる。### コード
“`php$before = [‘ユーザ名’ => ‘yamotuki’, ‘会社名’ => ‘M&Aクラウド’, ‘所属’ => ‘開発部’];
$after = [‘ユーザ名’ => ‘yamotuki’, ‘会社名’ => ‘M&Aクラウド’, ‘所属’ => ‘プロダクト部’];$changedBeforeList = array_diff_assoc($after, $before);
$changedAfterList = array_diff_assoc($before, $after);
$beforeAndAfterDiff = [];
foreach ($changedBeforeList as
Laravel の Tinker で DI
Laravel では Service Provider に依存解決のルールを記述することで、 Constructor Injection のような形で DI が実現可能です。
この DI を Tinker の実行時に行う方法がすぐ出てこなかったので、そのメモです。## TL;DR
`app()` ヘルパー関数または `App` ファサードを使えば良い。
## 例
Repository パターンを用いる際に以下のような ServiceProvider を作成した場合について考えます。
“`php:RepositoryServiceProvider.php
CloudflareでGraphQLを使った話
#経緯
Cloudflareを使っていると帯域幅が気になる事はよくあると思う。
APIを利用すると便利だけど、古いAPIはそろそろ使えなくなるらしい。
>https://api.cloudflare.com/#zone-analytics-dashboard
>Deprecation Warning
>End of life Date: 2020年11月2日
>Please use the new GraphQL Analytics API instead: https://developers.cloudflare.com/analytics/graphql-api/.GraphQLなど聞いた事も無いが移行するしか無い。説明を見ながらテスト。
https://developers.cloudflare.com/analytics/migration-guides/zone-analytics/
https://developers.cloudflare.com/analytics/graphql-api/tutorials/build-your-own-analytics/#
Laravelでコマンドライン処理の単体テストを行う
# 前提条件
[eclipseでLaravel開発環境を構築する。デバッグでブレークポイントをつけて止める。(WindowsもVagrantもdockerも)](https://qiita.com/toontoon/items/76fa7f8845b20776077c)
本記事は上記が完了している前提で書かれています
プロジェクトの作成もapacheの設定も上記で行っています[Laravelでコマンドライン処理を行う](https://qiita.com/toontoon/items/2015ec0deea4b11e5361)
[Laravelのタスクスケジューラを使う](https://qiita.com/toontoon/items/777c427345780411da8b)
本記事は上記が完了している前提で書かれています
上記記事で作成したクラスを使っていきます# テストクラス作成
(1) [Laravelでコマンドライン処理を行う](https://qiita.com/toontoon/items/2015ec0deea4b11e5361)
上記記事で作成したSamp
LaravelでJSONリクエスト、JSONレスポンスの単体テストを行う
# 前提条件
[eclipseでLaravel開発環境を構築する。デバッグでブレークポイントをつけて止める。(WindowsもVagrantもdockerも)](https://qiita.com/toontoon/items/76fa7f8845b20776077c)
本記事は上記が完了している前提で書かれています
プロジェクトの作成もapacheの設定も上記で行っています[Laravelで入力値エラーチェック(validate)を実装する](https://qiita.com/toontoon/items/abf5c52eb0c3fe11003c)
本記事は上記の内容を理解している前提で書かれています[LaravelでHTTPリクエストの単体テストを行う](https://qiita.com/toontoon/items/bb57147b616ec5a5038b)
本記事は上記が完了している前提で書かれています
上記記事で作成したクラスに追記していきます# フォームリクエストの作成
/sample/app/Http/Requests/Ut2Request.php作
LaravelでHTTPリクエストの単体テストを行う
# 前提条件
[eclipseでLaravel開発環境を構築する。デバッグでブレークポイントをつけて止める。(WindowsもVagrantもdockerも)](https://qiita.com/toontoon/items/76fa7f8845b20776077c)
本記事は上記が完了している前提で書かれています
プロジェクトの作成もapacheの設定も上記で行っています[Laravelで入力値エラーチェック(validate)を実装する](https://qiita.com/toontoon/items/abf5c52eb0c3fe11003c)
本記事は上記の内容を理解している前提で書かれています# フォームリクエストの作成
/sample/app/Http/Requests/Ut1Request.php作成“`Ut1Request.php
symfonyでTODOアプリ
Project\Php は僕が作ったフォルダで、ここでphpの作品を取り扱うことにしている
# TODOアプリ
## スケルトン作成
djangoでいう、startproject の後の状態ね“`terminal:Project\Php(symfony4-crudというアプリ名)
Php> composer create-project symfony/skeleton symfony4-crud “4.2.*”
“`
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/94562/2282f255-be7e-0807-8de4-aa0752cc7809.png)“`terminal:Console
Php> cd symfony4-crud
symfony4-crud> composer require symfony/requirements-checker
symfony4-crud> php -S 127.0.0.1:8000 -t public
“`## 確認(
echoとprintについて
echoとprintの違いについての備忘録です。
#受け付ける引数の違い
echoは値を「,」で区切ることで、複数(1以上)の引数を受け付けます。“`php
echo ‘こんにちは’;
echo ‘こんにちは’,’竈門さん’;
“`対してprintは単一の引数のみ受け付けます。
“`php
print ‘こんにちは’;
print ‘こんにちは’,’竈門さん’; //引数が二つなのでエラー
“`printを用いて複数の文字列を出力したい場合は、文字列を「.」で連結して単一の文字列にすることで出力可能です。
“`php
print ‘こんにちは’.’竈門さん’; //
“`
#戻り値の違い
またechoは戻り値がないのに対して、printは戻り値が常に1です。“`php
$hello = echo ‘こんにちは’;//エラー
$hello = print ‘こんにちは’;//文字列が出力され、$helloに1が代入される
“`#文と式の違い
echoは文ですが、printは式です。
式と文の違いついては後日改めてまとめます。
自前のResponseクラスを作ってテストしやすくする
Laravelはとても便利なので、ControllerでLaravelが提供してくれるリクエストとレスポンスのクラスを活用するだけで簡単に処理が書けてしまいます。
例えば
“`php
return view(‘view_name’, $params);
“`このようにするとレスポンスが簡単に返せます。
ただ、これだとControllerを呼ばないとレスポンスが得られないため、`$params`の色んなパターンを試すのが面倒です。
# Responsableインターフェース
LaravelにはResponsableインターフェースというものがあります。このInterfaceを実装しているクラスをControllerから返せば、いい感じにレスポンス化してくれます。
“`php
rails と比べて laravel は、、、(雑感)
#はじめに
udemy で laravel のコースを一つやってみただけなのですが、それまで勉強してきた ruby on rails を書くくときと比べて感じたことを書き残す。# テーブル内の要素(カラム・オプション等)の変更がしやすい
laravel は、データベースの内容を変更するのが、rails と比べてかなり楽です。migration ファイルにデフォルトで、up と down のメソッドが記述されているのもかなり助かります。railsを使っているときにめんどくさいなあと思っていたのが、テーブルにカラムを追加したり削除したり、オプションを追加したりするとき、いちいち rollback したり新しく migration ファイルを作らなきゃいけなかったりしなきゃいけないことです。
さらには、オプションを追加する際、自分で up, down のメソッドを記述しないと、後で migration ファイルを削除したくなって、rollback を使って遡ることができなくなるんです( migrate:status を down にできなくなる)。このことを全く知らずにやっ
(続)Controllerからs3に保存されている画像を削除する(Laravel)
#はじめに
前記事「チャットアプリで、1グループのメッセージ数上限を50件にする(Laravel)」の続きです。
前回の内容はメッセージが50件を超えた場合自動で古いメッセージを削除するコードです。削除するのは古いメッセージレコード(messagesテーブルのデータ)です。
#画像の送受信の仕組み
画面としては下図です。
「ファイルを選択」で画像を選択し、「送信」をクリックすると画像はcontrollerでs3に保存します。
画像が保存されたs3のリンクをimage_pathカラムに保存します。ファイル名の前にpathをつけて保存します。“` https://バケット名.s3.us-east-2.amazonaws.com/ファイルハッシュ名.
LaravelでDIを使う
# 前提条件
[eclipseでLaravel開発環境を構築する。デバッグでブレークポイントをつけて止める。(WindowsもVagrantもdockerも)](https://qiita.com/toontoon/items/76fa7f8845b20776077c)
本記事は上記が完了している前提で書かれています
プロジェクトの作成もapacheの設定も上記で行っています[Laravelで環境(開発環境と本番環境等)ごとに異なる値を定義する](https://qiita.com/toontoon/items/c1372b34859f94b0225e)
本記事は上記の内容を理解している前提で書かれています# DIって?
簡単に言うと、作成したクラスをnew演算子を使ってインスタンスを作成せずに、クラスに名前を付けて、付けた名前を使ってインスタンスを呼び出す方法です
そして、名前とクラスのマッピングは独立したファイル内で行います
そうすると、名前とクラスのマッピングファイルを変更するだけで帰ってくるインスタンスのクラスを変えることができます
それの何がいいかというと、ユーティ
AWSでLaravelのフォーム送信が出来なかった
ローカルでLaravelアプリをDocker環境に移行し、AWSのEC2へそのままデプロイしました。
EC2上で“`docker-compose up -d“`をして立ち上げ、サイトにアクセスしたら、
表示はされるのですが、ログインフォームや登録フォームを送信したら、こんな状態に。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/596140/248a50b8-1cc8-98d3-a83f-d5153053ff46.png)
かなり対処に苦労したので、記録しておきます。#環境
Mac OS Catalina 10.15.4
PHP: 7.2.24
Laravel: 5.5.48
Docker: 19.3.6
Docker-compose: 1.16.1
AWS: AMI: Amazon Linux2
EC2: t2.micro(無料枠のやつ)#どういうことか
画像の文字の意味的には「このページは期限切れだから更新してみて」的な感じ。
これが出る時は多くがCSRFト
for文の多重ループ
#多重ループが理解しにくい
こんにちは、徳永です
今回はfor文を使った多重ループの概念が難しかったので
復習も兼ねて書き留めておくまず最初に出会ったのは
ドットインストールにて
[『phpを使ってビンゴゲームを作ろう』](https://dotinstall.com/lessons/bingo_php_v2)
要は以下のような表示をHTMLで表示させてみようといったものだちなみに表示のさせかたは、かなり端折ってはいるが
“`php:
for ($i = 0; $i < 5; $i++) { for ($j = 0; $j <= 5; $j++) { //ランダムな数値を生成する処理 }
PHP で解いてみた!!Paiza練習問題「長テーブルのうなぎ屋」
## この記事について
先日、知り合いとプログラミング(特にオブジェクト指向設計でデザインされたウェブアプリケーション開発において重要となるようなスキル)の独習について話をしていて、オンラインジャッジってどうなんですかね、みたいな話になり、まぁ基礎力は身につくだろうけど、どうなんだろう…と思ったので、実際に体験してみた感想(とコード)です。
今回利用したサービスは [paizaラーニング](https://paiza.jp/works) です。海外のだと LeetCode とか Codewars あたりも使ってみましたが、調べている過程で発見した以下の記事に触発されたので、同じお題「長テーブルのうなぎ屋」を取り上げてみました。
[Javaで解いてみた!! Paiza練習問題「長テーブルのうなぎ屋」 – Qiita](https://qiita.com/koukun1985/items/896b5fe4f2c72cff9c02)
問題を解くだけなら、別にオブジェクト指向で書く必要はなくて、関数化すら必要ないわけですが、そこを敢えて、ウェブアプリケーションを念頭に置いて、書いてみま
Nginx経由でCVE-2018-17082脆弱性を攻撃する手法に関する個人的なメモ
以下は、特に公表を目的としない個人的な備忘録であるが、公開のメモであるので、もちろん指摘やコメントなどは歓迎する。
PHPの脆弱性 CVE-2018-17082 についてYouTube動画を制作するために、この脆弱性についてあらためて調べているが、Nginxをキャッシュサーバーにしている(リバースPROXYとしてNginxを使っている)場合の挙動についてきちんと調べていなかったので調べ直した。主に以下の記事に関係する。[PHPの脆弱性 CVE-2018-17082 によるキャッシュ汚染についての注意喚起](https://blog.tokumaru.org/2018/09/cve-2018-17082-cache-poisoning.html)
ブラウザ <--> リバースプロキシ(Nginx) <--> Apache2 + PHP という構成を前提としている
今までの調査で、Nginxが挟まっている場合攻撃が刺さらないことは判明しているが、なぜ刺さらないかを追っかけきれていなかった。
NginxとApacheの間の通信をキャプチャするには、tcpdumpを使うのが一般的だろ
PHPStanの型チェック機能をまとめる
# PHPStan の型チェック機能
https://phpstan.org/writing-php-code/phpdocs-basics
こちらをベースに独断と偏見で重要そうなところをまとめる。(翻訳ではない)バージョンは 0.12.25。
## PHPDocと型宣言
### メソッドや関数で型を指定する
“`php
g();
return new Baz();
}
“`“`
—— —————————————————
14 Call to an u
【Lighthouse】Variablesを使ってスキーマを送る際に空文字がnullなる問題の対処法【Laravel + GraphQL】
# 発生したこと
GraphQLのString!型に空文字を送ったところ、スキーマに直接値を書き込む形では空文字のまま渡されるが、Variablesを使用して代入すると空文字がnullに変換される。
* スキーマ定義
“`php:schema.graphql
type Mutation {
updateUser(id: ID! name: String!): User! @update
}type User {
id: ID!
name: String!
}
“`* 単体のスキーマの場合。
* 正常に動作し、`name`は空文字のものが返される。“`graphql:mutation
mutation {
updateUser(
id: 1
name: “”
) {
id
name
}
}
“`* Variablesを使用してスキーマを使用した場合。
* こちらでは`updateUser`で`name`にnullのリクエストを投げているというエラーが出る。“`graphql:mut
Laravelでテーブルの中身をcsvファイルにエキスポート&インポート
## 環境
– PHP 7.3.1
– Laravel Framework 5.8.35
– csvファイルの読み込みには[SplFileObject](https://www.php.net/manual/ja/class.splfileobject.php)を使用## 最終目標
○○EXPORTを押すと、以下のようなファイルを吐き出します。
###その1 mysql関数が見つからない
どうやらPHP7系以降のバージョンではmysql関数が使用できないようなので、mysqliクラスまたはPDOクラス(こちらは筆者未使用)などの関数で書き換える必要があるみたいです。
###その2 引数が違うと怒られる
mysqli関数にはmysqli_select_dbなどmysql関数と引数の順序が異なるものがあるようです。
“`php
$connect = mysqli_connet(DB情報);
mysql_select_db(‘db_name’,$connect);
“`
これだとエラーが出ます。
正しくは
“`php
$connect = mysqli_connet(DB情報);
mysql_select_db($connect,’db_name’);
“`
のように記述する必要があるみたいです。