- 1. phpunit のメモ
- 2. PHP_CodeSnifferの導入方法と解説
- 3. [Stripe]Stripeで決済を実装できるぞ!のまとめ
- 4. Laravelでデフォルト以外のディレクトリでfactoryを読み込む
- 5. EC-CUBE4 EventListenerの使い方
- 6. 【Laravel】enumとconstsの使い分け
- 7. 【Laravel】Eloquentにlast()がない件
- 8. PHPリクエスト メモ
- 9. Carbon::parse で不正な日時も取得する
- 10. PHPStanで定数のエラーが出力されるとき
- 11. CarbonImmutable、NoOverflow をデフォルトに
- 12. Docker 環境で Laravel を動かしたらエラーが発生した話
- 13. よく間違えて書かれるトランザクション処理について
- 14. PHP declare(strict_types=1)ってなんだ!?
- 15. 【初心者PHP】この整数値は正、負、ゼロ?
- 16. date関数の使い方 現在日時の表現方法
- 17. TwitterのOAuth2.0認可をSocialiteで実装しようとしたら401が返ってきた
- 18. 【PHP】PHPのarray_mapのコールバック関数 ※多次元配列対応
- 19. PHP今日知ったこと
- 20. Livewireのhydrate、dehydrate完全に理解した。
phpunit のメモ
## 繰り返しのテスト
`@dataProvider`“`php
/*
* @dataProvider testData
* @params int $year1
* @params int $year2
* @params bool $expected
*/
public function testGroupNameValidate($year1, $year2, $expected)
{
$this->assertSame($expected, $year1 === $year2);
}public function testData()
{
return [
[2022, 2022, true],
[2022, 2023, false],
…
];
}
“`## 繰り返しが少なければ
`@testWith`“`php
/*
* @testWith [2022, 2022, true]
* [2022, 2023, false]
*/
pub
PHP_CodeSnifferの導入方法と解説
## はじめに
今回は、コーディング規約に[CakePHP Code Sniffer](https://github.com/cakephp/cakephp-codesniffer)を使用します。## PHP_CodeSnifferとは
PHP_CodeSnifferとは、**指定したコーディング規約に沿った構文チェック**を行ったり、
違反があったら**自動で修正することが出来る静的解析ツール**のことです。– [PHP_CodeSniffer](https://github.com/squizlabs/PHP_CodeSniffer)
> **PHP_CodeSniffer**
>
> PHP_CodeSniffer is a set of two PHP scripts; the main phpcs script that tokenizes PHP, JavaScript and CSS files to detect violations of a defined coding standard, and a second phpcbf script to aut
[Stripe]Stripeで決済を実装できるぞ!のまとめ
# TL;DR
StripeとはAPIベースのヘッドレスな**決済サービス**であり、
カードはもちろん銀行振込やコンビニ決済の代行もできます。
そして、**通常の決済**はもちろん、**サブスクリプション決済**の実装も可能です。
サイト側にフォームをもたせない**セキュア**な実装ができ、
ドキュメントも充実している(最初理解するのに時間かかったけど)ため
使い所も多いのではないかと思いましたので記事にまとめておきます。# Stripeでできること・できないこと
## できること– 商品の作成
– 商品の数量に応じた段階的な割引
– 各種決済
– カード決済
– コンビニ決済
– 決済先の発行と自動入金確認
– 銀行振込
– 振込先の発行と自動入金確認
– 決済フォームの実装
– 商品の料金をもとに決済できる
– 商品が登録されていなくとも任意の金額でも決済できる
– サブスクリプションの実装
– ユーザー情報の作成
– 各種決済・サブスクリプションのキャンセル
– 各種決済・サブスクリプショ
Laravelでデフォルト以外のディレクトリでfactoryを読み込む
# 背景
先日ユニットテストを実装中に、factoryを規定のディレクトリ以外から読み込みたいことがあった。
そのプロジェクトではリポジトリパターンを採用していて、
factoryがvendor配下にあるという特殊な作りをしていたため。
# 実装方法
“`
app()->useDatabasePath(‘vendor/models/database’);
“`これでvendor配下がfactoryの置き場所として読み込まれる。
EC-CUBE4 EventListenerの使い方
## EventListenerの使い方
EC-CUBEには下記の様ないくつかのフックポイントが用意されてある。
“`php:src/Eccube/Controller/EntryController.php
private function entryActivate(Request $request, $secret_key)
{
…$event = new EventArgs(
[
‘Customer’ => $Customer,
],
$request
);
$this->eventDispatcher->dispatch(EccubeEvents::FRONT_ENTRY_ACTIVATE_COMPLETE, $event);…
}
“`上記は会員登録完了時のフックポイントとなり、登録完了時に行いたい処理を差し込むことが可能である。
処理を
【Laravel】enumとconstsの使い分け
## 環境
Laravel v9.5.1 (PHP v8.1.3)## enum(列挙型)
曜日や血液型、星座、都道府県名など似たような意味を持ち、値がまったく変化しない複数の定数を定義しておく。
(PHP8.1からenumが使える)クラスのように使えるがインスタンス化はできない。
“`app/Enums/UserRole.php
【Laravel】Eloquentにlast()がない件
## 環境
Laravel v9.5.1 (PHP v8.1.3)## Eloquentにlast()がない件
Railsでさんざん“`User.last“`を使っていたので当然Laravelもあると思っていたらなかった…
最新順にソートしてから最初のデータを取り出す。“`php
// created_atを基準にソートされる
User::latest()->first();User::latest(‘id’)->first();
“`## collectionにはlast()がある
“`php
collect([1, 2, 3, 4])->last();// 4
“`## 参考
https://zenn.dev/naoki_oshiumi/articles/4db2d6714cc6a3https://readouble.com/laravel/9.x/ja/collections.html#method-last
PHPリクエスト メモ
PHPリクエスト メモ
リクエスト オブジェクトはいくつかのプロパティオブジェクトを持ちます。
そのうちのいくつかは、PHPのスーパーグローバル変数をコピーしたものです。“`.php
$request->cookies for $_COOKIES
$request->env for $_ENV
$request->files for $_FILES
$request->post for $_POST
$request->query for $_GET
$request->server for $_SERVER//その他のプロパティオブジェクトは、リクエストに特有の情報を表します。
$request->client for the client making the request
$request->content for the raw body of the request
$request->headers for the request headers
$request->method for the request method
$request->accep
Carbon::parse で不正な日時も取得する
## 24時超えの終業時刻ってw
担当した勤怠管理プロジェクトにて、24時超えの終業時刻(どころか始業すら)が当たり前のようにあった。
フォームからの入力値を正しい日時オブジェクトに変換するためにも Carbon::parse を用いたかったが、残念ながらエラーで取得できない。24時超えや31日超えの不正な日時でも取得可能なのは、Carbon::create だけのようだ。
ということで、Carbon::parse を拡張してみた。
## Carbon::parse の拡張
前の記事で `App\Helpers\Carbon` を作成しているので、そこにメソッドを加える。
__app/Helpers/Carbon.php__
“`php
PHPStanで定数のエラーが出力されるとき
## コマンド入力
“`
composer stan
“`
Stanチェックするためコマンド入力すると、あるエラーが出力される。
“`
Constant DEL_FLG_OFF not found.
? Learn more at https://phpstan.org/user-guide/discovering-symbols
“`
定数として定義したDEL_FLG_OFFが見つからないとのこと。## 原因は?
定数を定義したファイルがStanチェックのときに、読み込まれていないためです。
親切にエラー文にURLが載せてあるため、参照すると下記のように書いています。#### [Global constants](https://phpstan.org/user-guide/discovering-symbols)
Global constants used in the analysed code need to be defined in bootstrap files.
Create a file that looks like this:
“`php:con
CarbonImmutable、NoOverflow をデフォルトに
## PHP の日付操作ライブラリ Carbon の問題
私のプロジェクトのコーディング規約では、PHP のdate 関数と strtotime 関数、及び MySql の NOW 関数の使用禁止を第一に謳う。
日付操作のロジックを可視化するには Carbon を使用するべきであり、Sql クエリ内の固定された NOW はユニットテストの障害となるから。しかし、Carbon を使用さえすれば良いかといえば、そうはいかない。
初期状態の Carbon には、プログラムコードにバグを潜らせる問題点が2つある。1. __Carbon オブジェクトは値が変動する__
`$today = Carbon::now(); $tomorrow = $today->addDay();` のようなコードは書きがちであるが、もとの変数も変動してしまう。これを避けるには `CarbonImmutable` を意識して宣言する必要がある。
2. __1月末の1ヶ月後が2月末にならない__
これを回避するために `addMonth` ではなく `addMonthNoOverflow` を使用しろと言うの
Docker 環境で Laravel を動かしたらエラーが発生した話
# Docker 環境の Laravel でエラー
Rocky Linux の Docker 環境に入れた Laravel を起動してブラウザから開くとエラーが発生。
ログファイルを append mode でオープンできないようです。
“`
The stream or file “/var/www/html/storage/logs/laravel.log” could not be opened in append mode:
Failed to open stream:
Permission denied The exception occurred while attempting to log:
“`Docker コンテナが参照しているホスト側ディレクトリの所有者を確認。root が所有者となっています。コンテナ内から
よく間違えて書かれるトランザクション処理について
## はじめに
自分が見てきたコードでよく間違えられて書かれるトランザクション処理をまとめました。
原因として多いのが、例外処理が正しく書けていないパターンです。## NG集
– #### ▼ NG例 ①
“`php
/** @var \Cake\Database\Connection $connection */
$connection = ConnectionManager::get(‘default’);
try {
// トランザクション開始
$connection->begin();
$this->Articles->save($saveData);
$connection->commit();
} catch (Exception $e) {
// キャッチされない
$connection->rollback();
echo $e->getMessage();
}
“`
– 〇 問題点
– save()では例外を投げないため、Exceptionでキャッチすることができない。
– #### ▼ N
PHP declare(strict_types=1)ってなんだ!?
# 概要
– PHPのコードにてファイルを作成したらnamespaseの宣言の前に呪文の様に`declare(strict_types=1);`と記載していた。詳しく意味を知りたかったのでまとめる。
# 調べてみた
– 公式ドキュメントでは下記の様に記載されている。
>declare 文は、あるコードブロックの中に 実行ディレクティブをセットするために使用します。declare の文法は他の制御構造と似ています。
– 簡単に言うとコンパイルするときの指示らしい
>ディレクティブ の箇所で、セットされた declareブロックの挙動を指定することが出来ます。 現在のところ、使用できるディレクティブは ticks ( ticksに関しては以下を参照ください)、 encoding (encoding に関しては以下を参照ください)、 strict_types (型宣言のページの 厳密な型付け も参照ください) です。
– 「strict_types (型宣言のページの 厳密な型付け も参照ください) 」と記載されているので下記のページを見てみる。
– [厳密な型付け](http
【初心者PHP】この整数値は正、負、ゼロ?
# コード
“`PHP
0){
echo ‘positive’;
} else if($m < 0){ echo 'negative'; } else if($m == 0){ echo 'zero'; } ?>“`
<ポイント>
☆intval() = 文字列(string)を整数(int)にする
☆is_int() = 整数か否か調べる★ = は「代入」、 == は「等しい」
↓ ご指摘を受けて・・・
“`PHP
0){
echo ‘positive’;
} else if($m < 0){ echo 'negative'; } else { echo 'zero'; } ?>“`
こちらでも正しい結果が出ました。
教えていただきありがとうございました。
date関数の使い方 現在日時の表現方法
1 date関数の使い方調査
—
公式マニュアルで調べると、説明がstringとか$formatで記されていて、使い方が理解できなかった。自分の知識経験不足が原因であり、このように記述する必要があることはすぐに理解した。理解を深めていくため、まずいろいろ動かし結果がどのようになるかを試した。
[公式マニュアルdate関数](https://www.php.net/manual/ja/function.date.php)2 date関数について
—
dateは日本語では日付だが、date関数は日付と時刻、更に曜日を表示できる。
現在日時と曜日も表現方法がいろいろ存在する。
今回はもっとも簡単な現在日時でまとめておく。3-1 コード 年月日 曜日 時分秒のアルファベット記号
—年月日 曜日 時分秒の順番で、年月日の間に’-‘、時分秒の間に’:’をつける場合のコードを代表例として記す。
~~~PHP: date1.php
TwitterのOAuth2.0認可をSocialiteで実装しようとしたら401が返ってきた
## {“code”:32,”message”:”Could not authenticate you.”}
Twitter の OAuth2.0 を用いた認可を Laravel の Socialite で実装しようとしたところ、出てきたエラーメッセージです。あなたが誰だか分からないって言われてますね。つまり、 Client ID などはちゃんと渡っているのにそれが符合しないというエラーだと思われます。
直感ではありましたが、これは OAuth1.0a で認可しようとしていて出ているエラーなのではと思いました。
じゃあ、ちゃんと OAuth2.0 を使うように指定しなければならないけれど、その方法が [Laravel 公式](https://laravel.com/docs/9.x/socialite)をみてもいまいち分からない。
なので、ソースコードを読みに行きました。具体的には[この辺](https://github.com/laravel/socialite/blob/5.x/src/SocialiteManager.php#L125)。“`php:SocialiteMa
【PHP】PHPのarray_mapのコールバック関数 ※多次元配列対応
“`PHP
‘太郎’, ‘age’ => 33],
[‘name’ => ‘洋子’, ‘age’ => 37],
[‘name’ => ‘美玖’, ‘age’ => 21],
[‘name’ => ‘信也’, ‘age’ => 15],
[‘name’ => ‘裕次郎’,’age’ => 45],
[‘name’ => ‘魁’, ‘age’ => 8],
[‘name’ => ‘達郎’, ‘age’ => 55],
[‘name’ => ‘真治’, ‘age’ => 29]
];
“`
### 全て2倍にする処理無名関数(クロージャ)
“`PHP
$value = array_map(function($num){
return $num[‘age’] * 2;
}, $people);var_dump($value);
“`
アロー関数
“`PHP
$value = array_map(fn ($var) => $var
PHP今日知ったこと
# DockerDesktop
DockerDesktopをインストールした.
wsl(Windows SubSystem for Linux)でやれとのことだった。PCにはUbutuを入れていて、Ubuntuはwslなのでいけると思ったが、ubuntuのバージョンが1で、1だとDockerDesktopが動かないらしくてバージョンを2に上げた。
Dockerはイメージからコンテナを構成するらしい。
そしてDockerDesktopはコンテナ、Image、Volume(記憶領域のことらしい)の削除とかはguiでできるらしいが、コンテナの中身はCLIで確認操作する。(のであまり意味を感じなかった。)docker内にphpUnitをインストールした。
### 型変換
strじゃなくてstring.
“` php:cast.php
return (string)$i;
“`
と書けばstringになる。### 表示文
var_dumpでcliに文を表示できる。
勉強元
https://online.dhw.co.jp/kuritama/function-tools-be-use
Livewireのhydrate、dehydrate完全に理解した。
# 事の発端
https://readouble.com/livewire/2.x/ja/lifecycle-hooks.html

**hydrate**と**dehydrate**って何だよ。
解説しているブログとか記事が無い。調べてみるか
## 前提
>livewireは、コンポーネント内のイベントが発火する度に、バックエンドで生成したHTMLをView側で受け取り差し替えています。
バックエンド側ではHTMLを渡すと同時にコンポーネント内のプロパティをオブジェクトに変換して渡しています。# 先に結論
要約すると多分こうです。| フック | 説明 |
| ———— |