- 1. 最近知ったVSCodeの便利機能 3選
- 2. PHPを使ってSymbolブロックチェーンのトランザクションを送信する
- 3. EC-CUBE4 フォントの追加方法
- 4. PHPUnit x Laravel よく使うスニペット まとめ
- 5. docker+php5系でxdebugを使う方法
- 6. phpunit のメモ
- 7. PHP_CodeSnifferの導入方法と解説
- 8. [Stripe]Stripeで決済を実装できるぞ!のまとめ
- 9. Laravelでデフォルト以外のディレクトリでfactoryを読み込む
- 10. EC-CUBE4 EventListenerの使い方
- 11. 【Laravel】enumとconstsの使い分け
- 12. 【Laravel】Eloquentにlast()がない件
- 13. PHPリクエスト メモ
- 14. Carbon::parse で不正な日時も取得する
- 15. PHPStanで定数のエラーが出力されるとき
- 16. CarbonImmutable、NoOverflow をデフォルトに
- 17. Docker 環境で Laravel を動かしたらエラーが発生した話
- 18. よく間違えて書かれるトランザクション処理について
- 19. PHP declare(strict_types=1)ってなんだ!?
- 20. 【初心者PHP】この整数値は正、負、ゼロ?
最近知ったVSCodeの便利機能 3選
## はじめに
本記事では、私が最近知った**VSCodeの便利機能**を3つご紹介します。すべて以下の本から学んだことです。
https://book.impress.co.jp/books/1121101051
とてもわかりやすくてためになる本なので、おすすめです!
では、ここから便利機能をご紹介していきます。
## 便利機能① 独自のスニペット
スニペットとは、「**再利用可能なソースコードのまとまり**」を指します。
独自のスニペットを作成すると、自分のよく書くコードを**自動入力**できるようになります!
↓`var_export($array, true);`を自動入力する例
IF文を記述する際などに、VSCodeが補完候補を提示してくれることがありますよね。
PHPを使ってSymbolブロックチェーンのトランザクションを送信する
この記事は「自分の得意なプログラミング言語でSymbolブロックチェーンを動かす方法」をPHPで実践したものです。
https://qiita.com/nem_takanobu/items/09b6b687f3cbe10af945
### アカウント作成
“`php
$sign_pair = sodium_crypto_sign_keypair();
$sign_secret = sodium_crypto_sign_secretkey($sign_pair);
$sign_public = sodium_crypto_sign_publickey($sign_pair);echo ‘Secretkey: ‘ . sodium_bin2hex(rtrim($sign_secret, $sign_public)) . PHP_EOL;
echo ‘PublicKey: ‘ . sodium_bin2hex($sign_public) . PHP_EOL;
“`### アカウント復元
“`php
//Secretkey: 94ee0f4d7fe388ac4b04
EC-CUBE4 フォントの追加方法
## フォントの追加方法
EC-CUBE4系はPDFの出力にTCPDFを利用している。
TCPDFのフォント追加ツールを利用し、フォントファイルを変換し追加する。“`
vendor/tecnickcom/tcpdf/tools/tcpdf_addfont.php -i 追加するフォントファイル(ttf形式)
“``Process successfully completed!`と表示されれば成功。
下記は、HG行書体を追加する場合
“`
vendor/tecnickcom/tcpdf/tools/tcpdf_addfont.php -i HGGyoshotai.ttf>>> Converting fonts for TCPDF:
*** Output dir set to /vendor/tecnickcom/tcpdf/fonts/
+++ OK : HGGyoshotai.ttf added as hggyoshotai
>>> Process successfully completed!
“``vendor/tecnickcom/tcpdf/fo
PHPUnit x Laravel よく使うスニペット まとめ
laravel x PHPUnit で開発する際に忘れがちな処理をまとめました。
## リダイレクト先で assertSee
“`php
$response = $this->post(‘users’, [
‘name’ => ‘test_user’,
]);$response
->assertRedirect(‘/users’)
->assertStatus(302);$response->get(‘users’)->assertSee(‘user一覧’);
// or $this->followRedirects($response)->assertSee(‘user一覧’);
“`## DB定義からfactoryを自動生成
https://github.com/TheDoctor0/laravel-factory-generator“`sh
composer require thedoctor0/laravel-factory-generator –dev# –recursive でdirectory構成に沿って生成してくれ
docker+php5系でxdebugを使う方法
# はじめに
仕事でphp5.5の環境構築をすることになったのですが、xdebugが動作しませんでした。
解決するのに結構嵌ってしまったので、対処法を残します。# 環境
– VSCode
– Docker
– php5.5
– mysql5.7# 結論
xdebug3を使用していたため、動作しませんでした。xdebug2.6.0からphp5系がサポート対象外になったようです。
http://xdebug.org/announcements/2018-01-29php5.5を使用する場合はxdebug2.5.5を使用しましょう。
:::note warn
php5.3以前を使用する場合は、xdebug2.2.7をインストールしてください。
xdebug2.3.0からphp5.3以前がサポート対象外のようです。
http://xdebug.org/announcements/2015-02-22
:::# フォルダ構成
“`
├── .vscode
│ └── launch.json
├── docker
│ ├── Dockerfile
│ └── p
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'; } ?>“`
こちらでも正しい結果が出ました。
教えていただきありがとうございました。