- 1. シニアPHPエンジニアの資質
- 2. 私の同僚たちは、私がどれだけ早く物事を終わらせるかを羨ましがっています——これはすべて、これらの生産性ツールのおかげです!
- 3. 【Laravel】テスト実行時、データを吹っ飛ばさないように注意!!
- 4. DateTime::diff()は時間差判定には(ほぼ)使えない
- 5. 【Laravel】「ZipArchive not found」エラー解消法!
- 6. Laravel11 リクエストログを出力する
- 7. PHP/Symfony バージョンアップ時に確認するComposerコマンドまとめ
- 8. 音楽イベントのグッズを販売するECサイトを作ってみた
- 9. LaravelのFormRequestで条件付きバリデーションを行う
- 10. PHPにおけるコピーオンライトのメカニズム
- 11. LaravelでBasic認証をかける方法
- 12. Laravel Pintの実行をGitHub Actionsで自動化
- 13. if ($user[‘role’] === ‘admin’)←こういうのやめたいって話
- 14. PHPでの引数の渡し方によって、メモリの消費は異なる
- 15. PHPUnitの書き方
- 16. 独習PHP_第4版のアウトプット(第1章_PHPに必要な知識_中編)
- 17. 【Laravel】Pintで改行コードがLFになる問題の解消方法!
- 18. access.logをAthenaで分析できる環境を構築してみた話
- 19. 【PHP】 スーパーグローバル変数(定義済み変数)
- 20. PHP(動的型付け)・PHP(動的型付け+型指定)・Go(静的型付け)の比較
シニアPHPエンジニアの資質
PHP開発者として、「シニアPHPエンジニア」というタイトルは非常に魅力的です。もしあなたがPHPを本当に楽しんでいるなら、これからシニアPHPエンジニアが持つべき資質をいくつか挙げて、ジュニアやミッドレベルのPHPエンジニアの助けになればと思います。
![画像説明](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/kx83z5vr79tnteg3kq3s.png)
### 落ち着いたマインドセット
すべてのプログラマーにとって、良いコードを書くためにはしっかりとしたマインドセットが必要です。忍耐強く、簡単に諦めないようにしましょう。
開発プロセスの中で、特にジュニアやミッドレベルの開発者は、コードやアーキテクチャに関するさまざまな問題に直面します。些細な問題もあれば、まったく新しい問題もあります。一つ一つの根本原因を冷静にトラブルシューティングすることが重要です。急いで取り組むのはプロジェクトに対して無責任です。焦りは妥協や挑戦の回避につながります。私自身、北京での2年間のシンプルな生活が、冷静なマインドセッ
私の同僚たちは、私がどれだけ早く物事を終わらせるかを羨ましがっています——これはすべて、これらの生産性ツールのおかげです!
私の同僚たちは、私がどれだけ早く物事を終わらせるかを羨ましがっています——これはすべて、これらの生産性ツールのおかげです!
Macのノートパソコンは確かに使いやすいですが、使用時にいくつかの課題があります。ここでは、Macの体験を向上させるための10の一般的なソフトウェアツールを紹介します。### Magnet – ウィンドウサイズとレイアウトの管理
このソフトウェアを使うことで、Macでウィンドウのサイズや位置をWindowsのように管理できます。ウィンドウの最大化、画面の垂直または水平分割、画面の1/4や1/3にリサイズする機能が利用できます。また、キーボードショートカットを使ってウィンドウサイズやレイアウトを制御することも可能です。![画像説明](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/8967gkjso9uwf7p3tekc.png)
**[[ダウンロード](https://magnet.crowdcafe.com/)]**
### Snipaste – スクリーンショットツール
Snip
【Laravel】テスト実行時、データを吹っ飛ばさないように注意!!
# はじめに
本記事をご覧いただきありがとうございます。東京でバックエンドエンジニアとして働いている大野です。今回は初心者や経験の浅いエンジニアがよくやってしまう(?)テスト実行時にデータベースを空にしてします事件について対策を書いていきます。私も過去に1度やってしまったので自戒を込め、実施した対応を備忘録として残します。扱う内容はLaravelです。参考になりますと幸いです。また、誤った箇所がございましたらご教示いただけますと幸いです。# テスト実行にあたっての前提
本記事では以下の環境を使用しています。私は普段、ローカルでsailコマンドを扱っているので、普段sailコマンドを使っていない方は以降で出てくるコマンドの「sail」の部分を「php」に読み替えてください。(sail artisan 〜 ⇨ php artisan 〜)
* Laravel11
* PHP Unit
* Mac M3
* docker compose(Laravel sail)
::: note alert
テストは本番環境では実行しないこと!!
テストコードを書いたことあるかたであればLaravel
DateTime::diff()は時間差判定には(ほぼ)使えない
# 概要
phpでふたつの日時の差分を判定するとき、DateTime::diff()は基本的に不適切である。
# 不適切さの詳細
– ふたつの日時が「○分以内だったら」「○秒以上だったら」という比較には使えない。
– DateTime::diff()の戻り値であるDateIntervalは、「○年○か月○日○時間○分○秒」というデータの持ち方をしている。
– たとえば「差分が5秒以上か」を判定したいとき、「60秒差」だったら、DateIntervalは「1分0秒(秒はゼロ)」なので、false判定になってしまう。# 1. 例
## 1-1. サンプルコード
“`php
$dt1 = new DateTime(‘2001-01-01 00:00:00’);
$dt2 = new DateTime(‘2002-03-04 05:06:07’); // 1年2か月3日5時間6分7秒後
$diff = $dt1->diff($dt2);// デバッグ用関数。DateIntervalの指定プロパティを出力する。
function test(DateInterval $di,
【Laravel】「ZipArchive not found」エラー解消法!
泉([@izumin_0401](https://twitter.com/izumin_0401))です。
今回は、Laravelの「ZipArchive not found」エラー解消法を解説しやす!
:::note info
僕はDocker使っているので、Docker環境を前提としています。
:::# ブログ記事はこちら
https://traveler0401.com/laravel-zip-archive-not-found/
# 「ZipArchive not found」エラー解消法
## zipモジュールのインストール
“`
RUN apk add –no-cache libzip-dev && \
docker-php-ext-install zip
“`
Dockerファイルに追記して、Dockerを再ビルドします。# zipモジュールの確認
“`shell
$ php -m
“`
Dockerコンテナに入り、上記コマンドを実行してzipが表示されればOKです。# まとめ
実はめっちゃハマって2時間くらい苦戦してたのは内緒。#
Laravel11 リクエストログを出力する
https://qiita.com/ucan-lab/items/bfd15b096a916f811468
Laravel8系の時に書いた記事がこのままの通りにはできなくなったので、Laravel11に合わせて書き直します。
## 目的
Laravelでリクエストログを出力します。
また、環境変数でログ出力の有効/無効の切り替えます。## 環境
– PHP 8.3.11
– Laravel 11.23.5## RequestLogger を作成
“`shell-session
$ php artisan make:middleware RequestLogger
“``app/Http/Middleware/RequestLogger.php` ファイルが生成される。
### bootstrap/app.php へ追記
“`php:bootstrap/app.php
PHP/Symfony バージョンアップ時に確認するComposerコマンドまとめ
## 目的
PHP 8.0.25 → PHP 8.2.7 へバージョンアップ作業を行いました。
その際に Composer 周りの脆弱性のあるパッケージが含まれてないか調査しました。
Symfony 5.4.13 を使用しており、今回はフレームワークのバージョンアップは実施しません。## ローカルでvendor配下を更新してないか
`vendor` 配下がどういうわけかGitで管理されているプロジェクトでした。
`vendor` 配下が更新されていてアップデートできないのではないか?という不安がありました。その疑念を解消する神コマンドがありました。
“`
$ composer status -v
No local changes
“`変更がないのでひと安心です。
## プラットフォーム要件が満たされていることを確認する
`check-platform-reqs` コマンドは 現在のプラットフォーム(PHPや拡張モジュールなど)が、プロジェクトの `composer.json` ファイルに定義された依存関係の要件を満たしているかどうかを確認します。
“`
$
音楽イベントのグッズを販売するECサイトを作ってみた
# はじめに
個人開発で「音楽イベントのグッズを販売するECサイト」を作ってたので、紹介します。
![melody-market_top-movie.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/935364/e0189049-0272-49f6-7715-c4ef30dba2d0.gif)# 概要
音楽のライブイベントに足を運ぶと、Tシャツや帽子、ステッカーなど様々なグッズが販売されています。それらのグッズをオンラインで販売しているECサイトを作成しました。
運用は考えておらず、あくまで自分の練習・スキルアップとして作ったものです。
使用技術については後ほど詳細を記載しますが、主にPHP, Laravelを用いており、MPAのWebアプリケーションとなっています。# URL
## デプロイ先システムの利用者の種別は、ユーザー(一般の利用者)、オーナー(店舗を運営)、管理者(システムを管理)の3つがあります。
:::note warn
起動に数秒時間がかかります。
:::ユーザー:ht
LaravelのFormRequestで条件付きバリデーションを行う
# 前置き
アンケートで問1で1〜5を選択する設問があり、問2は問1の回答が3〜5の時必須の自由入力の場合を想定しています。# FormRequest
まずは、FormRequestを継承したMyRequestを作成します。
“`php
php artisan make:request MyRequest
“`
Controller内のRequestをMyRequestとすれば、バリデーションをRequest内ですることができます。今回はファイル名を`MyRequest`としていますが、自由に変更していいです。# バリデーション
次にMyRequest内でバリデーションの定義をする場合、`rules`に追加していきます。
“`php
public function rules()
{
return [
‘question_1’ => ‘required|numeric|min:1|max|5,’
];
}
“`
とりあえず、`question_1`がバリデーションの対象、`required|numeric|min:1|max|5`が必須か
PHPにおけるコピーオンライトのメカニズム
PHPでは値渡しの場合でも、内部的にはrefcount(参照カウント)を増やすことで同じメモリ領域を参照する最適化が行われています。これは「コピーオンライト(Copy-On-Write)」と呼ばれるメカニズムです。
具体的には以下のように動作します:
1. 値渡しで変数を渡す際、PHPは即座に新しいメモリ領域を確保してデータをコピーするのではなく、元の変数が参照しているzval(PHP内部の値を表現する構造体)のrefcountを増やします。
2. この時点では、元の変数と関数内の引数変数は同じzvalを参照しています。
3. 関数内で引数の値を変更しようとした場合にのみ、PHPは新しいzvalを作成し、そこに値をコピーします(これが「コピーオンライト」の由来です)。
例えば:
“`php
$a = “hello”;
function foo($x) {
// この時点では$aと$xは同じzvalを参照している
// $xの値を変更しようとすると、新しいzvalが作成される
$x .= ” world”;
}
foo($a);
“`この最適化
LaravelでBasic認証をかける方法
# はじめに
こんにちは、エンジニアのkeitaMaxです。
今回は、Laravel10でBasic認証のかけ方を記事にします。
# middlewareの作成
以下のコマンドでBasic認証ようのミドルウェアを作成します。
“`
php artisan make:middleware BasicAuthMiddleware
“`
作成された`BasicAuthMiddleware`を以下のように編集します。“`php:BasicAuthMiddleware.php
Laravel Pintの実行をGitHub Actionsで自動化
# はじめに
個人開発アプリ作成において、Laravel Pintの実行をGitHub Actionsで自動化してみたので、そのソースコードや躓いた内容を記載します。Laravelのソースコードの整形を自動化したい方には参考になるかもしれません。# Laravel Pintとは
Laravelのコードスタイルの自動整形ツールです。
Readoubleでは、下記のように記載されています。> Laravel Pint(ピント:PHP+lint)は、ミニマリストのための主張を持ったPHPコードスタイルフィクサです。PintはPHP-CS-Fixer上に構築されており、あなたのコードスタイルがクリーンで一貫したものになるよう、シンプルにします。
> Pintは、すべての新しいLaravelアプリケーションに自動的にインストールされますので、すぐに使い始めることができます。デフォルトで、Pintは設定を必要とせず、Laravelの主張を取り入れたコーディングスタイルに従い、コードスタイルの問題を修正します。https://readouble.com/laravel/11.x/ja/p
if ($user[‘role’] === ‘admin’)←こういうのやめたいって話
今日も今日とてドメインをモデリングしているみなさん、こんにちは。
今回は別にドメインモデリングの話をしたいわけではなくて、そんな話ができるような知識ベースが私の中にあるわけでもないのですが、それに近い何かだとは思います(?)
## とある現場にて
「このシステムのドキュメントってありますか?」
「そんなのないよ。なんで?」
「管理者と一般ユーザーの権限の違いを把握したくて」
「コード読めば分かるでしょ」
「あっはい分かりましたありがとうございますお邪魔しました」言いたいことは色々あるでしょうが、そこはぐっと堪えていただいて。
コードを読めば分かるとのことなので、さっそく目を通してみましょう。“`PHP
if ($user[‘role’] === ‘admin’) {
/* 管理者限定の処理 */
}
“`どこか懐かしい気持ちになるコードですね。
`’admin’`をハードコーディングしているのが良くないというのは分かると思います(`$user`が配列なのもポイント高いですけどね)。
このままでは修正が面倒なので定数を作ることにしまし
PHPでの引数の渡し方によって、メモリの消費は異なる
PHPでの引数の渡し方によって、メモリの消費は異なります。主に以下の2つの方法があります:
1. 値渡し(デフォルト):
値渡しの場合、引数として渡されたデータの新しいコピーが作成されます。これは追加のメモリを消費します。“`php
function valuePass($x) {
$x = 10;
}$num = 5;
valuePass($num);
“`この場合、`$num`の値のコピーが作成され、関数内で使用されます。元の`$num`は変更されません。
2. 参照渡し:
参照渡しの場合、変数のメモリアドレスが渡されるため、追加のメモリは消費されません。“`php
function referencePass(&$x) {
$x = 20;
}$num = 5;
referencePass($num);
“`この場合、`$num`のメモリアドレスが渡されるため、追加のメモリは使用されません。
ただし、以下の点に注意が必要です:
– 小さなデータ型(整数や浮動小数点数など)の場合、値渡しと参照渡しのメモリ消費の差はほとんどあり
PHPUnitの書き方
### 背景
Laravelを使ったAPI開発をしている中、PHPUnitを使ってテストコードを書く機会があり、PHPUnitの書き方が?な人に向けて基本的な書き方を[公式](https://docs.phpunit.de/en/11.3/writing-tests-for-phpunit.html)から抜粋して、参考になりそうなページを備忘録として書き記しましたので、クイックスタートとして参考になれば幸いです。
### 基本的な書き方
名前を指定して挨拶を返す“`Greeter.php“`は、引数に名前を指定して’Hello,
{名前}’を返します。
“`Greeter.php
独習PHP_第4版のアウトプット(第1章_PHPに必要な知識_中編)
「独習PHP 第4版」を読んだ内容を、簡潔にまとめています。
最新の知見も合わせると情報が古い箇所もあるため、その点はアップデートしました。
早速、第1章 中編で学んだ内容をアウトプットしていきます。
## 第1章 イントロダクション 中編
### 何故PHPを使用するのか?
本書の著者の視点として、**PHPを学習することには次のようなメリット**があります。
– **習得が容易であること。**
文法をシンプルに記述することができます。また、あらかじめ用意された**ライブラリ**(コーディングの便利なツール)も充実しています。– **ドキュメントが充実していること。**
歴史のある言語のため、様々な構文と用例が紹介されています。**公式ドキュメント**を活用するだけでも、非常に勉強になります。– **利用できる環境が豊富であること。**
他の言語も引けを取らないものの、対応している**ホスティングサービス**(レンタルサーバー)がPHPでは特に多いです。また、**AWS**などのクラウドサービスでも積極的にサポートしています。ここま
【Laravel】Pintで改行コードがLFになる問題の解消方法!
泉([@izumin_0401](https://twitter.com/izumin_0401))です。
今回は、LaravelのPintで改行コードがLFになる問題の解消方法を解説しやす!!
# ブログ記事はこちら
https://traveler0401.com/laravel-pint-lf-crlf/
# そもそもpintでは無理
そもそもですが、pintでは改行コードの設定は変えられないっぽいです。なので、「.gitattributes」で改行コードを設定します。
# 「.gitattributes」の設定
“`
* text=auto eol=crlf
“`
これでOK!!# まとめ
もはやLaravel Pintの解説ではないのである!ではまた!
# 最後に
暇つぶしに[Twitter](https://twitter.com/izumin_0401)と[ブログ](https://traveler0401.com/)もやってるので見てね。
access.logをAthenaで分析できる環境を構築してみた話
## 概要
EC2で収集した`access.log`をS3に転送して、S3上のgz形式のログファイルをAthenaで分析できる環境を**作成**しました。—
## そもそもAthenaってなに?
> Amazon Athena は、オープンソースフレームワーク上に構築されたサーバーレスのインタラクティブな分析サービスで、オープンテーブルとファイル形式をサポートしています。
> Athena は、ペタバイト規模のデータが存在する場所で分析するための簡素化された柔軟な方法を提供します。Amazon Simple Storage Service (S3) データレイクと 25 以上のデータソース (オンプレミスデータソースや SQL または Python を使用した他のクラウドシステムを含む) からデータを分析したり、アプリケーションを構築したりできます。
> Athena は、オープンソースの Trino および Presto エンジンと Apache Spark フレームワーク上に構築されており、プロビジョニングや設定は不要です。要するに **S3にデータを設置す
【PHP】 スーパーグローバル変数(定義済み変数)
## スーパーグローバル変数とは
PHPのスーパーグローバル変数は、定義済み変数でプログラムコード中何処からでも使用可能な変数のことです。 関数やメソッドの内部からアクセスする際にも「global $変数名」などとする必要がない。スーパーグローバル変数は9種類あります。
## 変数一覧
1. [**$GLOBALS (グローバル変数)**](https://qiita.com/With21/items/78e80197cd0f7fbe36c5)
+ グローバルスコープに現在定義されているすべての変数への参照
+ 連想配列として使用
2. **$_SERVER (サーバー変数)**
+ サーバー情報および実行時の環境情報
+ 連想配列として使用
3. **$_GET (GET変数)**
+ URLパラメーター、HTTP GET として送られてきた値を取得する変数
+ 連想配列として使用
4. **$_POST (POST変数)**
+ HTTP POST で送られてきた値を取得する変数
+ 連想配列として使用
5. **$_FILE
PHP(動的型付け)・PHP(動的型付け+型指定)・Go(静的型付け)の比較
型に注目してPHPとGoを比較してみます。
1年ほど前まではPHPで型を指定せずに実装していたので、その視点からまとめてみました。
## 動的型付け(PHP)の主なメリットデメリット
### メリット
少ない工数で実装が可能。型を指定しなくて良いため、コード量が少なくなる、及び型について考える必要がない。経験の少ないエンジニアでも容易に実装可能。
### デメリット
型の指定がないため、実装時に型の違いに気づけず、予期せぬバグが発生しやすい。また、型がバグの原因である場合に原因の追求に時間がかかる。
型の指定がないことで、メソッドの引数を見た際にどのような内容や意図の引数なのか分かりにくい。毎回、元のデータを追っていくのが手間となる。
例1)記事詳細情報取得
“`
class ArticleService
{
/**
* 記事詳細情報取得
*/
public function detail($id)
{
return [$article, $dramaList, $related]
…