- 1. 音楽イベントのグッズを販売するECサイトを作ってみた
- 2. LaravelのFormRequestで条件付きバリデーションを行う
- 3. PHPにおけるコピーオンライトのメカニズム
- 4. LaravelでBasic認証をかける方法
- 5. Laravel Pintの実行をGitHub Actionsで自動化
- 6. if ($user[‘role’] === ‘admin’)←こういうのやめたいって話
- 7. PHPでの引数の渡し方によって、メモリの消費は異なる
- 8. PHPUnitの書き方
- 9. 独習PHP_第4版のアウトプット(第1章_PHPに必要な知識_中編)
- 10. 【Laravel】Pintで改行コードがLFになる問題の解消方法!
- 11. access.logをAthenaで分析できる環境を構築してみた話
- 12. 【PHP】 スーパーグローバル変数(定義済み変数)
- 13. PHP(動的型付け)・PHP(動的型付け+型指定)・Go(静的型付け)の比較
- 14. PATHの通っていない場所にインストールしたPHP向けの拡張モジュールコンパイル
- 15. 【PHP】Carbon使用する時に気をつけること
- 16. Laravelでテーブルのカラムを変更するための方法
- 17. WordPressで各ページのh1に任意の画像を設定する方法
- 18. PHPStanのエラー箇所へ1クリックで飛べるようにする設定
- 19. VSCodeの型ヒント表示を無効化する
- 20. Laravel ORM(Eloquent)チートシート
音楽イベントのグッズを販売する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]
…
PATHの通っていない場所にインストールしたPHP向けの拡張モジュールコンパイル
– `/usr/bin/php`: PHP8.3(APTで入れたもの)
– `/opt/php8.4/bin/php`: PHP8.4 RC1(ソースからビルドしたもの)という2バージョンが共存しているマシンで、PHP8.4 RC1向けにXdebugをビルドしたかった。
8.4のphpizeを使えば行けるのかと思ったらそうではなかったのでメモ。普通にphpize+./configureしたときのログ
“`console
~/xdebug-master$ /opt/php8.4/bin/phpize
Configuring for:
PHP Version: 8.4
PHP Api Version: 20240924
Zend Module Api No: 20240924
Zend Extension Api No: 420240924
$ ./configure –prefix=/opt/php8.4
checking for grep that handles
【PHP】Carbon使用する時に気をつけること
# はじめに
Carbon使用する時に気をつけたいと思ったのでメモです。# SubMonthsメソッド
– 1ヶ月前を取得を検索するとだいたい`subMonth()`メソッドが結果としてよく出ているが、月末になると日付がずれてしまうので注意が必要。
“`
$date = new Carbon(‘20241031’)->subMonth(1);
echo($date);
“`– 結果は`2024-10-01 00:00:00`になり、期待している`2024-09-30 00:00:00`にはならない。CarbonはDateTimeのラッパーとして、存在しない日付に対して適切に調整してくれるらしい。この場合は9月31日は存在しないので、10月1日に調整してくれているみたい。
# subMonthsNoOverflowメソッド
– 上記のようにならないために`subMonthsNoOverflow`を使用すると良いみたい。
“`
$date = new Carbon(‘2024-10-31’)->subMonthsNoOverflow(1);
echo $date;
Laravelでテーブルのカラムを変更するための方法
# はじめに
Laravelを使ってアプリを作る際にテーブルのカラム変更が発生した場合のマイグレーションの備忘録として記録します。# (例)User Tableのカラムを変更したい場合
(注意)
テーブルの更新をする場合は、あらかじめデータのバックアップを取得しておいてください。ユーザーテーブルを例に説明します。
(更新前)
|ユーザー名|メールアドレス|パスワード|作成日|更新日|
|———|————-|——–|——|——|
|Qiitaたろう|taro@qiita.com|qiitAbc|2024-01-01|2024-02-01|(更新後)
|ユーザー名|メールアドレス|パスワード|作成日|更新日|権限|
|———|————-|——–|——|——|—-|
|Qiitaたろう|taro@qiita.com|qiitAbc|2024-01-01|2024-02-01|true|権限の列を増やしたい場合、Mig
WordPressで各ページのh1に任意の画像を設定する方法
WordPressで各ページのh1に任意の画像を設定する方法を紹介します。
## 使用しているテーマとプラグイン
テーマ:[Cocoon](https://wp-cocoon.com/)
プラグイン:[Advanced Custom Fields](https://www.advancedcustomfields.com/)## カスタムフィールドの設置
プラグイン『[Advanced Custom Fields](https://www.advancedcustomfields.com/)』をインストール&有効化して、`Field Type`を`image`に設定します。
`Field Label`に適当な名前を付けて保存します。![image.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1902958/ed6b2cd1-d529-5abb-fedb-87ac782b802d.jpeg)
これで、各ページの編集ページの下部にカスタムフィールドが出現します。↓
![postedit.pn
PHPStanのエラー箇所へ1クリックで飛べるようにする設定
# 初めに
PHPStanで解析をした際、エラーの箇所をいちいち手動で開くのってちょっと面倒ですよね。
今回は、エラーの箇所にすぐに飛べるようになる設定をご紹介します。# エラーの箇所に飛びたい!
PHPStanでエラーを検出すると以下のような結果が出力されます。“`sh
$ ./vendor/bin/phpstan analyse
Note: Using configuration file C:\path\to\project\phpstan.neon.
3/3 [============================] 100%—— ————————————————————————–
Line level\Level0.php
—— ————————————————————————–
:759 Method Util\Level0
VSCodeの型ヒント表示を無効化する
# 課題
VSCodeバージョンアップで、関数の引数や返値の型ヒントが自動的に表示されるようになった。![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/20427/a1e85986-ac6c-f390-09ae-aadaafc7da8a.png)
邪魔なことが多いので非表示にしたいが、設定方法の発見に意外と時間がかかったのでメモ。
# 解決
変更する設定 : `Editor › Inlay Hints: Enabled`![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/20427/0fa711c3-23dd-c784-2aa2-45fd30302bc4.png)
`off`にすると非表示にできます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/20427/7b7017
Laravel ORM(Eloquent)チートシート
# Laravel ORM(Eloquent)チートシート
## モデル操作の詳細
### モデルの定義
“`php
class User extends Model
{
// テーブル名の指定(デフォルトはモデル名の複数形)
protected $table = ‘users’;// 更新可能なカラム
protected $fillable = [‘name’, ‘email’, ‘password’];// 非表示にするカラム(例: JSONシリアライズ時)
protected $hidden = [‘password’];// キャストするデータ型
protected $casts = [
‘email_verified_at’ => ‘datetime’,
];
}
“`### データの取得(詳細)
“`php
// 全件取得
$users = User::all();// 条件付き取得(1件だけ)
$user = User::where(‘email’, ‘