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

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

【PHP】array_filterの使い方

## array_filterとは

“`php
array_filter(array $array, ?callable $callback = null, int $mode = 0): array
“`

> (PHP 4 >= 4.0.6, PHP 5, PHP 7, PHP 8)
> array_filter — コールバック関数を使用して、配列の要素をフィルタリングする

https://www.php.net/manual/ja/function.array-filter.php

配列を破壊することなくフィルタリングしてくれる関数です。

元記事を表示

クエリビルダでlatest()->first()やoldest()->first()と書いてはいけない

https://readouble.com/laravel/9.x/ja/queries.html#latest-oldest
> latestおよびoldestメソッドを使用すると、結果を日付順に簡単に並べ替えできます。デフォルトでは、結果をテーブルのcreated_atカラムによって順序付けします。もしくは、並べ替えるカラム名を渡すこともできます。

`latest()->first()`や`oldest()->first()`だと、`created_at`を基準にレコードを見に行ってしまうため、もしバルクインサートしたデータを取得したい場合、意図しないデータを取得してしまう場合があります。

### 【結論】
latest()とoldest()の引数にid指定でOK
“`php
latest(‘id’)->first();
oldest(‘id’)->first();
“`

元記事を表示

多次元配列内の値に変更を加えたい時

array_walk、array_walk_recursiveを使うとスッキリ書けます。

“`php
// forEach
$array = [
‘hoge1’ => null,
‘hoge2’ => null,
‘hoge3’ => null
];
foreach ($array as $key => &$value) {
if ($value === null) {
$value = 0;
}
}
var_dump($array);
// array(3) {
// [“hoge1”]=>
// int(0)
// [“hoge2”]=>
// int(0)
// [“hoge3”]=>
// &int(0)
// }

// array_walk
$array2 = [
‘hoge1’ => null,
‘hoge2’ => null,
‘hoge3’ => null
];
array_walk($array2, function (&$value) {
if ($value === null) {

元記事を表示

PHPのバージョンを変更する方法

こんにちは!
Laravelのバージョンによって求められるPHPのバージョンが異なることはみなさんご存知だと思います。
この記事では、Laravel Sail、Dockerを用いて現在のPHPのバージョンの確認方法と変更方法について記載したいと思います!

初めての投稿で拙い文章ですが、温かい目で読んでやってください!
# LaravelのバージョンとPHPのバージョンの依存関係
(2024/10 現在)
| Laravelのバージョン | PHPのバージョン |
|:———–|————|
| Laravel 8 | PHP 7.3以上 |
| Laravel 9 | PHP 8.0以上 |
| Laravel 10 | PHP 8.1以上 |
| Laravel 11 | PHP 8.2以上 |

上の表のようにLaravelのバージョンによっては必要とされるPHPのバージョンも異なります。
PHPのバージョンが求められているバージョンを満たしていない場合、意図していた動作

元記事を表示

E: Release file for http://archive.ubuntu.com/ubuntu/dists/focal-updates/InRelease is not valid yet (invalid for another 10h 25min 3s). Updates for this repository will not be applied.

## はじめに

phpが入っていなく、パッケージを更新しようとしたらエラーが発生した

 
実行コマンド
“`
sudo apt update
“`
 
## 本題

タイトルのように
“`
E: Release file for http://archive.ubuntu.com/ubuntu/dists/focal-updates/InRelease is not valid yet (invalid for another 10h 25min 3s). Updates for this repository will not be applied.
“`

エラーが発生した。
設定されている時間のずれが原因でエラーになる。
 
以下のコマンドで設定された時間を確認できる。
“`
date
“`
これで表示された時間とPC右下に表示されている時間があっているか確認する。
※自分の場合は10時間ほどずれていたので、すぐ気づいた。

 
### 以下の手順で直る。

#### 1.NTPを有効にして時刻を同期する
“`
sudo timedatectl set-ntp

元記事を表示

laravelを新規立ち上げ時にエラー2つ failed to open stream: Permission denied SQL[42S02]:Base table or view not found:1146 Table ‘laravel.sessions’ doesn’t exist

 
## はじめに
laravelを新規で立ちあげる時って必ず権限エラー発生しません?
久しぶりにやったら忘れてて少してこずったのでメモ書きしておきます。

初学者はハマるところなので参考にしていただけたらと思います。

## failed to open stream: Permission denied
![スクリーンショット 2024-10-05 223546.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3832683/36c053c3-14c7-8366-bdd3-ecfd266464d5.png)

必ずと言っていいほど新規立ち上げ時はこのエラーが出ます。
(この画面は初めて見ましたがエラーの内容は同じです。)
これは、「logの書き込み権限がない」というエラーです。

なのでlogの書き込み権限を付与しましょう!
プロジェクトの中までcdで移動してから以下のコマンド実行!
“`diff_php
$ sudo chmod 777 storage
“`

※sudoをつけないと権限の変更

元記事を表示

シニア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
起動に数秒時間がかかります。
:::

ユーザー:

元記事を表示

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`のメモリアドレスが渡されるため、追加のメモリは使用されません。

ただし、以下の点に注意が必要です:

– 小さなデータ型(整数や浮動小数点数など)の場合、値渡しと参照渡しのメモリ消費の差はほとんどあり

元記事を表示

OTHERカテゴリの最新記事