PHP関連のことを調べてみた

PHP関連のことを調べてみた

PHPのパターンマッチで遊んでみた

## はじめに

先日、Ruby の強力なパターンマッチを試して楽しみました。その直後にたまたま久し振りに PHP に触る機会があったので PHP でもパターンマッチができないか調査してみました。

https://qiita.com/mnishiguchi/items/53b55deae8e033562a55

2020 年の PHP 8.0 に[match 式](https://www.php.net/manual/ja/control-structures.match.php)が導入されていました。PHP でもパターンマッチができます!

https://php.watch/versions/8.0

https://php.watch/versions/8.0/match-expression

https://www.php.net/manual/ja/control-structures.match.php

試してみます。

## PHP の`match` 式とは

公式ドキュメントに以下の通り記されています。

> match 式は、値の一致をチェックした結果に基づいて

元記事を表示

PHPで権限周りの構築にビット演算を使用する

ビット単位のAND演算を使用して権限チェックを行うことは、権限管理の一般的かつ効率的な方法です。
この方法には以下のような利点があります:

1. 効率性:
複数の権限を1つの整数値で表現できるため、データベースの保存や処理が効率的です。

2. 柔軟性:
新しい権限を追加する際に、既存のシステムに大きな変更を加えることなく拡張できます。

3. 高速な演算:
ビット演算は非常に高速で、大量の権限チェックを行う場合でもパフォーマンスが良好です。

実装例:

“`php
// 権限の定義
define(‘PERMISSION_READ’, 0x0001); // 1
define(‘PERMISSION_WRITE’, 0x0002); // 2
define(‘PERMISSION_DELETE’, 0x0004); // 4
define(‘PERMISSION_ADMIN’, 0x0008); // 8

// ユーザーの権限(例:読み取りと書き込み権限を持っている)
$userPermissions = PERMISSION_READ | P

元記事を表示

CakePHP 5でコマンドを作成する方法:HelloCommandの実装

CakePHP 5でコマンドを作成するには、`Command`クラスを継承したカスタムコマンドを作成し、`bin/cake`コマンドで実行できるようにします。以下に、CakePHP 5でカスタムコマンドを作成する手順を示します。

### 手順

1. **コマンドの作成**
コマンドファイルは、`src/Command`ディレクトリに作成します。

例として、「HelloCommand」というシンプルなコマンドを作成してみます。

“`bash
src/Command/HelloCommand.php
“`

2. **コマンドクラスの作成**
以下のように、`HelloCommand`クラスを作成します。

“`php

元記事を表示

初めてのCakePHP:Linux上でのアプリケーション開発手順

CakePHPのアプリをLinuxで作成する手順は以下の通りです。必要な環境を整え、アプリケーションを作成し、設定を行います。

### 1. 必要なソフトウェアのインストール

#### a. PHPのインストール
CakePHPはPHPフレームワークですので、まずPHPをインストールします。PHP 7.2以上を推奨します。

“`bash
sudo apt update
sudo apt install php php-cli php-mbstring php-xml php-mysql php-zip php-curl
“`

#### b. Composerのインストール
ComposerはPHPのパッケージ管理ツールで、CakePHPのインストールに必要です。

“`bash
sudo apt install curl
curl -sS https://getcomposer.org/installer | php
sudo mv composer.phar /usr/local/bin/composer
“`

#### c. Webサーバーのインストール
Apac

元記事を表示

API トークン認証を分かりやすく図解する

## はじめに

この記事では、API トークン認証に関して図を用いて分かりやすく説明していきます。
API トークン認証の仕組みをざっくりと理解した上で、Laravel Sanctum を使った API トークン認証の仕組みをコードベースで解説していきます。

– API トークン認証の仕組み
– Laravel Sanctum のインストール方法
– ユーザ登録・ログイン時の API トークン生成
– API トークン認証によるアクセス制限・リソースの所有権の検証
– ログアウト時の API トークン削除

## API トークン認証の仕組み

![api-auth-whole-flow.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1067124/28c26c37-2176-2e85-778a-9736dc7b5b9c.png)

#### **1. ユーザーの新規登録・ログインリクエスト**

– クライアントがユーザーのログイン情報(例:メールアドレス、パスワード)をサ

元記事を表示

Laravel はダメで時代遅れなんですか?

# 参考にした記事
https://qiita.com/MadakaHeri/items/e6034727fcab8b61b55e
こんな記事が話題になっていました。しかし、この記事の内容は妥当なのでしょうか。私の実感とはかけ離れていると思うので疑問に思う点を記述します。

# それって本当ですか?

## Laravelはオンプレ前提パート
以下引用

> 今はLaravelを本番環境で稼働させようとするとこうなると思います。
> “`
>|WAF| – |LB| – |Nginxコンテナ| – |Laravelコンテナ| – |DB|
>“`
引用終わり

この図と文章の意味するところはよく分かりませんが、一口に本番環境でアプリケーションを動かすと言ってもその実行環境は様々です。例えばAWSを使うにしても、EC2のなかにPHPをいれてその上で動かしている環境も少なくはないでしょう。またコンテナの文脈においてもAWSではその実行や管理にECSを使うのか、EKSを使うのかでも状況は異なると思います。あと別にオンプレミス環境でもコンテナ技術を使うことは多分にあると考えられます。

元記事を表示

初学者の登竜門のひとつ「Xdebugの導入」sailを使用したプロジェクト

## はじめに

Xdebugって導入難しすぎません?
初学者の皆さんどうですか? 自力でできました?
記事通りにやってもうまくいかないし、、、

やっとできたので備忘録で取っておきます。

※laravel sailを使用をしようしてdockerを使ったデバックの記事になります。
※vscodeの拡張「php debug」のインストールは済ませること。
※Xdebugのバージョンは3になります。2だと設定が違います。確認はphpinfo関数を使用してください。

## .envファイルに以下2行追加

“`
SAIL_XDEBUG_MODE=develop,debug,
SAIL_XDEBUG_CONFIG=”client_host=host.docker.internal”
“`

## xdebug.iniファイルを作成

/自分のプロジェクト/vendor/laravel/sail/runtimes/今回のPHPのバージョン/ここに作成

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.

元記事を表示

【Laravel11】LINEログインの実装

# はじめに
最近ではWEBでもモバイルアプリでもメアド(ID)ログインの他にGoogleやLINEなどソーシャルメディア経由のログイン方法は当たり前になってきています。ログインが必要なアプリケーションにおいてはこれらを実装するかどうかでユーザー数も変わってくるのではと考えています。今回はLaravel11でのLINEログインの実装を紹介いたします。

## ソーシャルメディアログインでのメリット・デメリット
前段としてソーシャルメディアログインを実装するメリット・デメリットを押さえておきます。「そんなのいいから早く実装方法教えて!」って方は読み飛ばしていただいて構いません。
### メリット
* メールアドレスやパスワードの入力が不要のため、ユーザーを会員登録まで持っていきやすい。(今回の実装方法は初回ログイン時はDBにユーザーデータが入るため実質新規登録となります)ユーザーは画面の案内にしたがってボタンをポチポチしてけば完了するため、UX向上が期待できる。
* ユーザーはパスワードの管理をしなくて済む。
* 各ユーザーデータにメアド・パスワードが存在しないため、これらが盗まれる心配

元記事を表示

Laravelのジョブ内で通信を行う場合の注意点

## 概要
LaravelのジョブでSFTPを行う際に`Connection closed prematurely`エラーが起きました。
この記事では
– 原因
– 解決策

を解説します。

## 前提
– SFTP通信には`league/flysystem-sftp: ^1.1`を使用
– ジョブの処理には`php artisan queue:work`を使用

## 原因
シンプルに**前のコネクションが残っておりタイムアウトしたから**です😭

### なぜ前のコネクションが残っていた?
`queue:work`でジョブの処理を行う際、Laravelはワーカープロセスを常駐させ処理毎にアプリの更新を行いません。
つまり、**シングルトンインスタンスに設定されたプロパティがジョブ毎にリセットされません。**
(通常のリクエスト=>アプリ生成=>処理実行=>アプリ停止の流れだとリセットされます)

`league/flysystem-sftp`ではプロパティにコネクションが設定されていれば、そのまま使用します。そのため、以下の流れでエラーが発生してしまいます。
1. プロセス立ち上

元記事を表示

【Laravel】Eager LoadとLazy Loadの違いと使い分け

## はじめに

モデル間のリレーションを扱う場合、データのロード方法によってパフォーマンスやメモリ使用量に大きな影響を与えることがあります。今回は、「Eager Load(イーガーロード)」と「Lazy Load(レイジーロード)」について解説します。
## Eager Load(イーガーロード)とは?
### 特徴
**Eager Load**は、一度のクエリでまとめてデータを取得する方法です。これにより、後からデータをアクセスする際に追加のクエリを発行する必要がなくなります。Laravelでは、`with`メソッドを使用してEager Loadを実装できます。

“`php
$users = User::with(‘posts’)->get();
“`
この例では、Userモデルに関連するpostsが一緒に取得され、各ユーザーの投稿を表示する際に追加のクエリが発生しません。

**メリット:**
– **クエリ数を削減:** データベースへのアクセス回数を減らせる
– **パフォーマンス向上:** 複数のリレーションを持つデータを一括で処理する場合に効果的
– **データの一

元記事を表示

業務レベルの実例で理解するProxyパターン

## はじめに

この記事のゴールは、**適切な場面でProxyパターンを使えるようになる**ことです。
不適切な場面におけるデザインパターンの適用は大きな技術的負債をもたらしますので気をつけましょう。

対象読者は、Proxyパターンのことをなんとなく知っているものの仕事では自信を持って使えない人です。

:::note warn
筆者はPHPerなのでサンプルコードはPHPです。
:::

完成版はこちらです。

https://github.com/jnkmtsd/qiita-php-sample/tree/v0.1.1

## Proxyパターンとは

以下がわかりやすいです。

> Proxyパターンは、すでにあるオブジェクト関係の間に、透過的に別のオブジェクトを割り込ませて、元のコードを変更せずに、同じ機能呼び出しの振る舞いを拡張するためのパターンです。
>
> 田中ひさてる (2022). ちょうぜつソフトウェア設計入門――PHPで理解するオブジェクト指向の活用 技術評論社

クラス図は以下のようになります。

“`plantuml
@startuml
interfac

元記事を表示

DBのトランザクションの概要について理解する

:::note
### 概要
トランザクションとは
複数の SQL 文によるデータ更新を1つの処理としてまとめてデータベースに反映させることです。
一部だけがデータベースに反映されると、データベース全体としてデータが不整合な状態になる場合に有効です。
:::

# 背景 🖼️

業務でトランザクションを使ったのですが、口で説明できるほど概要がつかめていないので今回復習します。

# トランザクションとは 💡

https://oss-db.jp/dojo/dojo_01

複数の SQL 文によるデータ更新を1つの処理としてまとめてデータベースに反映させることを言います。

一部だけがデータベースに反映されると、データベース全体としてデータが不整合な状態になる場合に有効です。

たいせい君がお父さんに送金する際の処理を考えます。(本当に送金してるかはそっとしておいてください)

:::note
Laravelで検証します。
:::

こちらで動作確認可能です。

https://github.com/yamatai12/transaction-app

以下に公式docを参考にします。

元記事を表示

【自分用メモ】PHP で時刻が正常に表示されないときの対処法

## 手順

①php.ini ファイルに、`date.timezone` を追加
(日本の場合は以下の通り)

“` php.ini
date.timezone = “Asia/Tokyo”
“`

②サーバーを再起動する

元記事を表示

高度なLaravelテクニックを活用した家計管理アプリケーション開発ガイド

## はじめに

Laravelは、PHPのウェブアプリケーションフレームワークとして人気があり、多くの開発者に愛用されています。この記事では、家計管理アプリケーションを例に、Laravelの高度な機能について詳しく解説します。各章では、実際のコード例と詳細な説明を提供し、Laravelの高度な概念を理解しやすくします。

## サンプルデータ

まず、以下の50件の家計データを使用して説明を進めていきます。このデータは、日付、カテゴリ、金額、メモの4つの列で構成されています。

“`php
$household_expenses = [
[‘date’ => ‘2023-01-01’, ‘category’ => ‘食費’, ‘amount’ => 5000, ‘memo’ => ‘新年会’],
[‘date’ => ‘2023-01-02’, ‘category’ => ‘交通費’, ‘amount’ => 1200, ‘memo’ => ‘通勤’],
[‘date’ => ‘2023-01-03’, ‘category’ => ‘光熱費’, ‘amoun

元記事を表示

Laravelの開発環境で php artisan serve が停止しない時の解決策

## はじめに
`php artisan serve` を停止したいけれど、方法がわからない。または停止できない問題を解決する方法を紹介します。
## `php artisan serve` の基本的な停止方法
基本的vscodeのターミナルなどで `php artisan serve` していると `Control + c` で停止することができます。
## 例外1
`php artisan serve` したターミナルを閉じてしまった方は `ps` コマンドを実行してプロセスを確認します。

“`
$ ps
“`

プロセス一覧を確認すると、以下のような表示が出ると思います
“`
PID TTY TIME CMD
“`

プロセスの「CMD」の列に 127.0.0.1:8000 と表示されている行が、ローカルサーバーを指しているはずです。この行に表示されているPIDが対象となります。

該当するPIDを見つけたら、以下のように入力してプロセスを停止します。
“`
kill -9 1234
“`
ちなみに、`-9` はプロセスを強制終了させるオプション

元記事を表示

ある日アプリが動作しないと言われたら

# 前置き
先日、自社で納品したWEBアプリを使用しているクライアントから
『今朝いきなりログインができなくなり、アプリケーションが表示できない。早急に原因を調査し解決して欲しい。』と連絡があり、対処する機会があった。

# 推測してみる
いったんrebootコマンドでサーバーを再起動してみるが動作は解消せず。
色々な原因が考えられたがその時までアプリケーションは2年近く問題なく動作していたため、格納されているオンプレミスサーバー内ディスクのメモリが何らかの原因で容量ギリギリまで使用されていたのではないかと推測し、調査した。

# 調査した

まずteratermでサーバーに接続後、以下のdf -hでサーバー内全体のディスクの容量を確認した。
“`
df -h
“`
画像はないが、何故か/varディレクトリ以下が88%使用となっており、仮説が正しそうと思い始める。次にディレクトリを移動しながらdu -sh/*でディレクトリごとの容量を確認していく。
“`
du -sh/*
“`
すると/var/spool/mail/rootディレクトリで80%以上使用しており、このディレクトリ

元記事を表示

Laravel 11.16.0 にアップグレードしてから file_put_contents() エラーが発生する

## はじめに
Laravelで開発をしていると以下のようなエラーが発生した人向けの解決策です。
“`
Notice: file_put_contents(): Write of 61 bytes failed with errno=32 Broken pipe in /Users/[redacated]/Projects/fpwr/vendor/laravel/framework/src/Illuminate/Foundation/resources/server.php on line 21
“`
## このエラーが発生した原因
私の場合、Laravelでデータベース接続の設定を行うために `.env` ファイルを編集して更新したところ、「該当するデータベースが存在しない」とエラーが表示されました。再度 `.env` を修正し、ブラウザをリロードすると表示がされるようになったものの、画面の上部に以下のエラーが表示されました。
“`
Notice: file_put_contents(): Write of 61 bytes failed with errno=32 Broke

元記事を表示

【Laravel】テストデータの登録をTraitで共通化する方法!

泉([@izumin_0401](https://twitter.com/izumin_0401))です。

今回は、Laravelでテストデータの登録を共通化する方法を解説しやす!

# ブログ記事はこちら

https://traveler0401.com/laravel-testdata-trait/

# Laravelでテストデータの登録を共通化する方法

## Traitの作成
“`php
insert([
‘hoge’ => ‘1’,
]);
}
}
“`
データを登録するTraitを作成します。

## テストデータでTraitを使う
“`php

元記事を表示

【パーティションキー】MySQLにパーティションキーを設定したら5倍クエリが早くなった件【Laravel】

# 結論
100,000件のtestsテーブルからyearカラムに対してパーティションキーを設定して比較した結果はこちら
“`php
// クエリ
DB::table(‘tests’)->where(‘year’, 2023)->get();

// パーティションを設定した結果
結果: 0.47547888755798 seconds

// パーティションを設定していない結果
結果: 2.206062078476 seconds
“`
**約5倍** は早くなりました…タイトルとおりです。

# パーティションキーとは
パーティション = 仕切り というようにデータを指定した値ごとに仕切ることで、読み込み速度が高速化されます。

2022年、2023年、2024年…ごとにデータが積まれていく場合、年カラムにパーティションキーを設定することで検索結果が早くなります。

※パーティションキーにはいくつかの種類がありますが、今回は特定の範囲に絞り込む「レンジパーティション」に絞り込んで紹介します。

# migrationファイルで設定する
Laravelの機能でパーティシ

元記事を表示

加算子/減算子は$i++,$i–だけじゃない

# 前談
転職して情シスから開発エンジニアに戻った
この前初出社を迎えました。
その時新卒の社員と話したところ、プログラムの話をしました。
いきなりプログラムの話とは、やっぱり開発エンジニアが150名以上いると違うんですかね。
僕の新卒は上司と二人だったので、ある意味プログラムとアニメとかの話しかしませんでしたねw

# 本編
新卒の社員とプログラムの話をした時にPHPリファレンスの話になり、加算子・減算子の話をしました。

“$i++と++$iって同じじゃないんですか?”
確かにプラスすることには変わらない。だが違うのだ。

違うのは加算されるタイミングなんだよ。
僕にはリファレンスお兄さんことA上司がいたから知っている。

テストコードは以下の通りです。
“`php

元記事を表示

OTHERカテゴリの最新記事