PHP関連のことを調べてみた2023年02月05日

PHP関連のことを調べてみた2023年02月05日
目次

人は変わる、ソースは残る

チーム開発の話です。
フリーランスでいくつかの案件を経験して思うことは、仕事がしやすいチームと仕事がしにくいチームがあることです。

チーム開発の基本かもしれないですが、ある一つのことを理解してチーム開発をしている企業としていない企業があります。
**そのある一つのこととは、「人は変わるが、ソースは残り続ける」という事実です。**

正社員以外の働き方がメジャーになった現代では、チームの人の入れ替わりが激しいです。
半年前までバリバリ開発していた人が、今はもういない。
そういう場面をよく見かけます。
その代わり、もっとできる人が入ってきたりする場面もありますが。

つまり、**どの現場でも「人が変わる」ことを念頭に置いておく必要があります。**
システム開発以外の仕事でも同じかもしれませんね。

## 誰が入っても同じようになるツールを導入する

**「ソースを書く」**
多くのエンジニアは、ソースを書きます。しかし、人によってムラができてしまうと困ります。
どの人が書いても、ある一定はソースが担保されるツールを入れるべきです。

例えば、PHPであるならPSR(PHPのコーディング規

元記事を表示

Can’t log into phpMyAdmin: mysqli_real_connect(): (HY000/1698): Access denied for user ‘root’@’localhost’を解決する

# 初めに

久々の投稿になります。
簡単な備忘録となります。
ローカルのlaravelプロジェクトでphpmyadminを導入する際に題名のエラーメッセージが出てしまいました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/606803/86ef4a14-5e34-4b78-bc8a-9783efd6154a.png)

以下解決法

# 解決手順

“`
sudo mysql -p -u root
“`

①mysqlに入ります

“`
CREATE USER ‘ユーザー名’@’localhost’ IDENTIFIED BY ‘パスワード’;
“`

①ユーザー名とパスワードを作成します。
“`
GRANT ALL PRIVILEGES ON *.* TO ‘ユーザー名’@’localhost’ WITH GRANT OPTION;
“`

③ここで、新しいユーザーにスーパーユーザー権限を付与します

以上を行ったうえでphpmyadminから入りなおすと入れました。

元記事を表示

【PHP】S3 ファイル(オブジェクト)の有無をチェックする方法

# 概要
S3に保存したファイルの有無をチェックする方法がないかと思い調べたら、良い方法があったので、備忘録も含めてその方法を説明します。

# 設定方法
1. 最初に、AWS SDKをインストールします。インストール方法は、開発している環境によって異なる為、下記の公式ドキュメントを確認して行って下さい。
[インストール:AWS SDK for PHPバージョン 3](https://docs.aws.amazon.com/ja_jp/sdk-for-php/v3/developer-guide/getting-started_installation.html)

2. SDKとAWSを繋ぐ方法については、下記を参照して行って下さい
[AWS SDK for PHPバージョン 3 の基本的な使用パターン](https://docs.aws.amazon.com/ja_jp/sdk-for-php/v3/developer-guide/getting-started_basic-usage.html)

3. 公式内に`doesObjectExist`のメソッドがある為、そのメソッドを

元記事を表示

Composerの世界情勢ネタ #StandWithUkraine

“`
composer update
“`
をしてみると、、、
![スクリーンショット 2023-02-04 213851.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3005822/392a2d0a-90e3-7173-3272-7a0f999b5ecb.png)
**#StandWithUkraine**
とウクライナカラーで表示されるようになっています。

:::note info
国旗の青は空、黄色は小麦と農業を表しているみたいです
:::
こちらのコミットに載ってます。

https://github.com/composer/packagist/commit/86244a3695fcaaac9c5ba4257a4314eae1c6d981#

ただ、コメントを見てみると、
* **#StandWithPeace**を使用して欲しい
* ウクライナを応援してくれてありがとう
* テク

PHP で テキストのハッシュタグへリンクを貼る

 PHPで、テキスト文字列内のハッシュタグ(#から始まる単語)をリンクに変換する関数をChatgpt に聞きながら、作成してみました。その時のメモです。

Q.
“`
php で テキストのハッシュタグに検索リンクを貼るロジックを教えて
“`
A.
“`php
#$1“;
return preg_replace($hashtag_regex, $replace, $text);
}

$text = “こんにちは #PHP でハッシュタグをリンクに変換しましょう。”;
$linked_text = add_hashtag_links($text);
echo $linked_text;

“`

下記のサイトで確認したところ、全角スペースに対応していななたったので、
https://ja.functions-online.com

Why is CodeIgniter More Productive than Other PHP Frameworks?

![CodeIgniter for Web Development.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/199949/e0a1abd0-e595-8b4f-7135-e2fa9053d434.png)

PHP frameworks are widely used for their functionality and productivity. Most PHP-based frameworks make development fun as they reduce the long lines of code, courtesy of their in-built features. CodeIgniter is one such framework that has gained a lot of attention in recent times.

But what’s truly amazing is that it has managed to beat quite the re

laravelで個別にログファイルを出力する

まずは、ログ出力の設定から。
ログの出力設定はconfig/logging.phpで設定する

“`config/logging.php
‘hoge’ => [
‘driver’ => ‘daily’,
‘path’ => storage_path(‘logs/hoge/hoge_log.log’),
‘level’ => ‘info’,
‘days’ => 3, //保存期間
‘permission’ => 0664,
],
“`
あとは、出力したいControllerとかに
以下のログ出力用のコマンドを渡してあげればよい

“`HogeController.php
Log::channel(‘hoge’)->info(‘なんかのログ’, ここは配列);
“`

テストしたいだけだったら以下を入れてみる。
“`HogeController.php
Log::channel(‘hoge’)->info(‘test’);
“`

ApplicationGatewayとLaravelの合わせ技で通信が困った話

# 問題になったこと
AzureのApplicationGatewayを前段に置いて、後ろにLaravelのWebサーバーがある構成で、
何故かLaravelから生成されるURLが非SSLになって色々と困ったので備忘録

## 結論
### 原因
Laravelは特に指定がなければ、サーバー変数$_SERVERの値を使ってURLを生成する。
ApplicationGatewayより後ろを非暗号化httpで通信していたため、Laravel側はhttpのURLを生成していた模様。

### 解決方法
二種類ある
#### 1. Apache側でサーバー変数を書き換える
ApacheのVirtaulhostに下記の設定を追加
“`
SetEnv HTTPS on
“`
これで$_SERVER[“HTTPS”]が強制的にONになるので、
Laravel側でもhttpsのURLが生成されるようになる

#### 2. Laravel側でURL生成に使う値を強制的に変更する
下記の処理をAppServiceProvider.phpに加えることで強制的にURL生成に使い値を変更することが可能

Laravel コマンド一覧

# よく使うコマンド一覧
よく使うコマンドを一覧にまとめています。

| 項番 | 項目 | コマンド |
|:—-:|:————-|:————-|
| 1 | [バージョン確認](#バージョン確認) | php artisan –version |
| 2 | [ヘルプ](#ヘルプ) | php artisan help <コマンド> |
| 3 | [起動](#起動) | php artisan serve |
| 4 | [コントローラー作成](#コントローラー作成) | php artisan make:controller <コントローラー名> |
| 5 | [テーブル作成](#テーブル作成) | php artisan make:migration <クラス名> |
| 6 | [マイグレーション実行](#マイグレーション実行) | php artisan migrate |
| 7 | [シーダー作成](#シーダー作成) | php artisan make:seeder <シーダー名> |
| 8 | [シーダー実行](#シーダー

PHPのforeach文で一部だけ2次元の連想配列からキーだけを取り出す方法

# はじめに
備忘録
タイトルの通りです。
どなたかのお役に立てれば幸いです。

※追記
コメント欄にて、すっきりと書けるコードや、コードの補足情報を教えていただけました。
ぜひコメント欄の方も参照してください。
コメントしてくださったお三方、ありがとうございました!

# foreach文で一部だけ2次元の連想配列からキーを取り出す
例えば、以下のような2次元の連想配列があったとします。
“`php
$array = [
“aaa” => true,
“bbb” => “foo”,
“ccc” => [
“ddd” => “this”,
“eee” => “is”,
“fff” => “sample”,
“ggg” => “array”
]
];
“`
この場合は以下のように書くことで全ての次元からキーだけを取り出すことができます。
“`php
$key_array = [];
foreach ($array as $key1 => $value1) {
array_pus

【WordPress】the_contentで取得する本文にカスタムフィールドの値を入れる方法

プラグインなしでSEO実装をする案件にて。

カスタム投稿+カスタムフィールドの構築で、SEO対策として記事本文の最初の130文字をdiscriptionに入れてほしいという要望がありました。

本来なら、`th_content` から130文字抜くだけなので簡単ですが、カスタムフィールドだとそれができませんね。

なので、カスタムフィールドの値を全部取ってきて、`th_content` の中に自動で入れ込み、そこから130文字抜き出そうという実装です。

ポイントなのが、**柔軟コンテンツをループして1つのテキストにまとめる** です。

“`php
// the_contentで取得する本文に、カスタムフィールドの値を含める
function set_contents($post_id) {
if(!wp_is_post_revision($post_id) && get_post_type($post_id) === ‘contents’) {

remove_action(‘wp_insert_post’, ‘set_contents’);

【初心者の勉強記録】MAMPを使わずに、Laravel上でphpMyAdminを使えるようにしました。

:::note warn
PS:私は日本語ネイティブではありませんので、文法ミスや分かりにくいところがあれば大目に見てください(ぺこり)
:::

## 前書き

私はphpMyAdminをもう使い慣れたので、どのようにDocker環境でphpMyAdminを立ち上がるかを紹介します。

PHPの学習をしていた段階で、実はMAMPが愛用でしたが、ただ無料版はPHPのVersionを二つしか選べないですね。

初めてLaravel+MAMPを環境構築していた時に、選べる一番最新のバージョンでも古すぎて、逆にLaravelを使えなくなってしまいました。

StackOverflowで色々な方法を試行錯誤しても全く効かないということで、あの時の焦りがもう忘れません。最後にやむをえず、MAMP PROの無料試用版の力を借りてやっと接続ができました。

ということで、今回の転職ポートフォリオを作成し始めた段階でDockerのみで実装してみようと思います。

## 接続方法
Laravelのプロジェクトを一旦インストールした後、次にDBの接続と.envの初期設定を行います。

この方法は非常に初

Laravelインストール時に出たzipのエラー解決備忘録

# 環境
・OS : Windows11
・Composer : 2.5.1
・XAMPP : 8.2.0

# エラー
`composer create-project laravel/laravel:^8.* test`のコマンドで
インストールしようとした際に
`The zip extension and unzip/7z command are both missing`が下図のようにたくさん出て怖い
![2023_02_01_2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/240612/e3cba72f-5f46-8afa-3d8b-6fba9659127f.png)

# 解決法
・`php.ini`をVScode等で開く  `C:\xampp\php\php.ini`にある

・`zip`を文字検索などで検索すると`;extension=zip`が出てくる

・この`;`を外し、`extension=zip`にして保存する
![php.ini – php.png](https://q

【PHP】チューニングまとめ

# 処理速度まとめ
## 配列追加
:::note info
[]で追加する方がarray_pushよりも2倍早い
:::
### [ ]で追加
“`php
$val[] = “りんご”;
“`
### array_pushで追加
“`php
$val = arrray_push(“りんご”);
“`

【PHP】function内で使うreturnについて(早期リターンとは)

#### 早期リターンとは
function 中で return を使うことで if などによるネストを減らすことができるテクニックのこと。

#### if文と言えば
if(条件1){
trueの場合の処理
}else{
falseの偽の場合の処理
}

上記のイメージが強かったが、returnを使うことで

if(条件1){
return true;
}
return false;
}

と表記することができる。

#### なぜelse以下が省略されているか
>「関数内で呼び出されると、return文は***即座にその関数の実行を停止し、引数を関数の値として返します。***」(phpリファレンスより)

つまりtrueの場合、上記の例では true が返された時点で関数の実行が止まるので、それ以下の処理は実行されないということ。
そのためelse以下の記述は省略され、本来falseの場合に実行される処理がif文の外に出されている上記のような形式が成立する。

##

【Laravel】artisan コマンドが対話形式で使えるようになる

## 何が実現するのか?

2023 年 1 月 23 日に以下の PR がマージされました。

https://github.com/laravel/framework/pull/45629

そして 2023 年 2 月 1 日の v9.49.0 で上記変更分がリリースされました。

これにより、以下が実現します。

– **`make:*` コマンドが対話形式で使えるようになる**
– **既存のコマンドを対話形式に簡単に対応できるようになる**

一つずつ見ていきましょう。

## `make:*` コマンドが対話形式で使えるようになる

多くの Laravel ユーザーにとって真っ先に恩恵があるのはこれでしょう。今回の PR により、`make:*` コマンドが対話形式に対応しました。

例えば `make:model` だと、これまでは引数が足りない場合以下の通りにエラーが発生しました。

![](https://user-images.githubusercontent.com/4977161/212221423-c6b62de6-cf87-47fc-b55f-752c3

You are in ‘detached HEAD’ state. You can look around, make experimental changes and commit them, and you can discard any commits you make in this state without impacting any branches by switching back to a branch.

“`bash
Note: switching to ‘v5.5.28’.

You are in ‘detached HEAD’ state. You can look around, make experimental
changes and commit them, and you can discard any commits you make in this
state without impacting any branches by switching back to a branch.

If you want to create a new branch to retain commits you create, you may
do so (now or later) by using -c with the switch command. Example:

git switch -c

Or undo this operation with:

git switch –

Turn off this advice by

【php】CSVファイルのBOMを削除する方法

PHP(Laravel)のシステムにUTF-8形式のCSVファイルをアップロードする際、BOMを削除する方法です。

BOM付きの場合とBOM付きでない場合、両方に対応する必要がありました。

## 解決策

“`php:
$text = preg_replace(“/^\xEF\xBB\xBF/”, ”, $text);
“`

## 参考:BOMとは

– Byte Order Markの略
– テキストの先頭に付く
– CSVファイルを保存する際、Excelのバージョンや保存形式により、BOMが付く場合と付かない場合がある
– 16進法で「EF BB BF」と表される
– 「ファイルがUnicodeで書かれているか」や「[エンディアン](https://ja.wikipedia.org/wiki/%E3%82%A8%E3%83%B3%E3%83%87%E3%82%A3%E3%82%A2%E3%83%B3)の形式」を判別するために付いている(※ただし、UTF-8ではエンディアンは関係ない)

## 余談:`�`について

UTF-8の状態でデバッグした際、BOMは`�

【DDD】ドメインサービスとはなにか?Laravelでどう実装するのか。

## はじめに
業務でドメインサービスを扱う場面が出てきたので、改めて記事にして整理していきます。書籍等ではJavaでの実装が多いと思いますが、今回はLaravelで実装しているので、Laravelを普段使用している人には分かりやすい内容になっているのではないかと思います

## ドメインサービスとは
エリック・エヴァンスは著書『エリック・エヴァンスのドメイン駆動設計』において、ドメインサービスを下記のように記載しています。
> ドメインから生まれる概念の中には、オブジェクトとしてモデル化すると不自然なものもある。こうしたドメインで必要な機能を**エンティティ**や**値オブジェクト**の責務として押しつけると、モデルに基づくオブジェクトの定義を歪めるか、意味のない不自然なオブジェクトを追加することになる。
> (中略)
> ドメインにおける重要なプロセスや変換処理が、**エンティティ**や**値オブジェクト**の自然な責務でない場合、その操作は、**サービス**として宣言される独立したインターフェースとしてモデルに追加すること。モデルの言語を用いてインターフェースを定義し、操作名が

Amazon Linux 2 で PHP7.4 から 8.1 にアップグレードする方法

以前書いた記事の PHP 7.4 -> PHP 8.1 バージョンアップ版です。(Amazon Linux Extra を使用する前提)

以前の記事 -> [Amazon Linux 2 で Nginx, MariaDB, PHP7.2 から 7.4 にアップグレードする方法
](https://qiita.com/katzueno/items/0f2de17b719e9d16c749)

Concrete CMS をインストールしているサーバーで

– PHP7.4.x -> PHP8.1.x

にアップデートした時のコマンドメモです。

めっちゃくちゃざっくりです。

アップグレード元のバージョンが違ったり、レポジトリが違ったりあって、
いろんなケースの手順をまとめてます。

**PHP+MySQL のサーバーに詳しい人しか参考にしないでください。**

## 旧バージョンの Amazon Linux Extra のレポジトリを Disable

“`
sudo amazon-linux-extras disable php7.4
“`

## 新バージョンのレポジトリ