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

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

PHPのメモ

## 日付と時間
[strtotime](https://www.php.net/manual/ja/function.strtotime.php)
UNIX タイムスタンプに変換する
[date](https://www.php.net/manual/ja/function.date)
UNIX タイムスタンプを書式化する

“`timestamp.php
// デフォルトのタイムゾーンを設定する
date_default_timezone_set(‘Asia/Tokyo’);

date(“Y-m-d”, strtotime(“now”)); // 2022-12-16
date(“Y-m-d”, strtotime(“-5 day”)); // 2022-12-11
// “Y-m-d H:i:s”: MySQLのDATETIME
date(“Y-m-d H:i:s”, strtotime(“now”)); // 2022-12-23 11:56:09
“`
:::note warn
注意
日付の足し算・引き算を行うことはおすすめしない
→DateTime オブジェ

元記事を表示

【PHP】in_arrayではなくissetとarray_key_existsを使おう

# in_arrayではなくissetとarray_key_existsを使おう
## 理由
* in_arrayよりもissetやarray_key_existsの方が断然処理が早いから。

## 使用方法
### issetの場合
“`php
$array = array(
“orange” => true,
“banana” => true,
“lemon” =>true
);
if(isset([‘orange’])){
echo “これはオレンジです”;
}
“`

### array_key_existsの場合
“`php
$array = array(
“orange” => true,
“banana” => true,
“lemon” =>true
);
if(array_key_exists(“ora

元記事を表示

PHPでMutationTesting(Infection)をして、十分な単体テストを書く

MutationTestingってのが世の中的にどの程度一般的なのかはわかりませんが、会社的に微妙に盛り上がっていて、PHPでも実行できるがそこまで記事がなさそうなので書いてみます。

## MutationTestingとは

単体テストが十分に必要なだけ書けているかを測る手段で、単にテストの際にその部分を通っているかというカバレッジだけでなく、質的な面でもどうなのかがわかるものです。
コードに少し変更を加えてそれでも単体テストは成功するのか失敗するのか、コードに変更を与えたのだからテストは失敗するべきでそういうテストが書けているか、というのを判定していって質を判定します。

例えば、カバレッジは通っているかだけなので

“`php
if ($a > 0) {
// hoge
}
“`

このコードで言えば$a = 3をテストすれば、単体テストは通るしカバレッジ的にもOKなわけですが、falseのテストパターンはなくて、

“`php
if (true) {
// hoge
}
“`

と書き換えてもテスト全体を通して失敗がない(mutantが生き残る)ため質が

元記事を表示

ちょうぜつソフトウェア設計入門を読んだ

[ちょうぜつソフトウェア設計入門 ――PHPで理解するオブジェクト指向の活用:書籍案内|技術評論社](https://gihyo.jp/book/2022/978-4-297-13234-7)
を読んだ。

## 感想
とても良い本だった。
オブジェクト指向は何でないか、というところを核にして、SOLID原則、デザインパターンやTDDといった広く知れ渡っている概念を時系列や要求に沿って説明してくれる本だった。
今まで、設計に悩んでいて手当たり次第に本を読み、何となく分かっているつもり、書けているつもりのところを改めて整理してもらったので、他人と話すときもある程度自信を持って話せるようになりそう。

## 読んでいたときのメモ
### p26. 最初はちょっと分けすぎぐらいで十分
完全初心者から脱却すべくDRYを意識して…でコードを書くと、どれぐらい似たようなコードをまとめられるか、というところに目線を置いてしまいがちだったなということを思い出した。
最近はとりあえず分割して書いておいて、後から共通点が見つかればモジュールとかにまとめようとしているところだったので、その方針が間違っていな

元記事を表示

Laravel FortifyのレスポンスをJSONで返す方法

## 背景
通常、Laravel Fortifyを使用してログインに成功すると、Fortifyはアプリケーションの`fortify.php`内の `home`設定オプションで設定した URI にリダイレクトします。ログイン要求がXHR要求であった場合、200HTTPレスポンスを返します。

ただし**SPAの構成などをとっている場合は、レスポンスをJSON形式で返したい**こともあリます。そんな時に行う設定を備忘録がてら記載していきます。

## FortifyのレスポンスをJSONで返す方法
早速結論ですが、`App\Providers\FortifyServiceProvider.php`内の`register`メソッドに下記コードのように実装します。返すJSONの構造は適宜変更してください。
“`php:App\Providers\FortifyServiceProvider.php
use Laravel\Fortify\Contracts\LogoutResponse;

public function register()
{
$this->app->instan

元記事を表示

【Laravel】オリジナルのバリデーションルールを作る

# 何を作るのか

Laravelは色々なバリデーションをかけることができますが、オリジナルでバリデーションルールを追加したい場合もあります。BLOCSで、オリジナルのバリデーションルールの作り方を説明します。BLOCSでは、入力フォームへのバリデーションをテンプレートで指定します。オリジナルのバリデーションルールも`data-validate`で指定します。`data-validate`の詳しい説明は[こちら](https://blocs.jp/reference/data-form_data-validate.html)で。

https://qiita.com/hyada/items/11597f88102ed1c45407

# ルールを作る

artisanでオリジナルのルールを作ります。

“`sh
php artisan make:rule Myrule
“`

作成したルールを編集して、ルールを作ります。まず、コンストラクタで汎用性を持たせるために、倍数を検証する数字を設定できるようにします。

“`php:app\Rules\Myrule.php
pub

元記事を表示

【Laravel】Sailを使った環境構築

# 前提条件

– Windows環境の場合、WSLを構築しておく必要がある。
– Ubuntuターミナル上でgenie起動

# 環境構築

以下のコマンドを実行する

“`bash
$ curl -s “https://laravel.build/{プロジェクト名}?with={使用するサービス(カンマ区切り)}” | bash
“`

## 使用するサービスについて

利用可能なサービスは以下になります。

– mysql
– pgsql
– mariadb
– redis
– memcached
– meilisearch
– minio
– selenium
– mailhog

サービスを指定しない場合は

mysql、redis、meilisearch、mailhog、selenium

のサービスが設定されます。

上記コマンドを実行するとlaravelのディレクトリが作成されます。

![スクリーンショット 2023-01-15 18.48.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.

元記事を表示

PHPerが学ぶGo言語② 関数・構造体

豚さんです。
今回は関数・構造体について書いていきます。

Go言語にはクラスが存在しないという事前知識はあり、
代わりに構造体というものが存在するということは
調べて何となく知っている所からスタートです。

まずは、関数の説明を書いていき構造体の説明に移っていきます。

※ 注意:内容はPHPか何かの言語を書いたことがある方向けなので、
説明を割愛している箇所は多々ありますので、ご了承ください。

**go version go1.19.4 darwin/amd64**

# 1. 関数
前回の記事では、とりあえずmain関数で実行していましたが
どういうことか理解していませんでした。
Go言語はmainパッケージのmain関数で実行されるんですね。
“`sample.go
// Goのプログラムはmainパッケージから実行する
package main

import “fmt”

func main() {
fmt.Println(“テスト”)
}
“`
“`
$ go run sample.go
テスト
“`

では、

元記事を表示

➁バッチ処理機能、タスクスケジュール機能(Laravel)

## 始めに
Laravelのバッチ処理機能を実装したので
備忘録として記事にしました。
2部構成となっております。
 ➀:バッチ処理機能(https://qiita.com/fuku_rin/items/546494332e666482a9eb)
 ➁:タスクスケジュール機能(Laravel機能)

➀から引継ぎついでいる内容となっております。
ご了承願います。

バッチ処理:特定の日時に指定した処理を実行できる処理のこと。
タスクスケジュール機能:Laravel内でバッチ起動の日時を設定することができる機能

## 環境
| 開発環境 |バージョン |
|———–|————|
| __Laravel__ | 8.83.19 |
| __PHP__ | 7.3.10 |
| __MySQL__ | 15.1 |
| __MariaDB__ | 10.5.10 |
| __Server__ | Amazon Linux |

## 手順
__1, Kernel.phpの編集設定__
__2, 日時の設定__
__3, cronと

元記事を表示

➀バッチ処理機能、タスクスケジュール機能(Laravel)

## 始めに
Laravelのバッチ処理機能を実装したので
備忘録として記事にしました。
2部構成となっております。(➀、➁)
 ➀:バッチ処理機能
 ➁:タスクスケジュール機能(Laravel機能)

バッチ処理:特定の日時に指定した処理を実行できる処理のこと。
タスクスケジュール機能:Laravel内でバッチ起動の日時を設定することができる機能

## 環境
| 開発環境 |バージョン |
|———–|————|
| __Laravel__ | 8.83.19 |
| __PHP__ | 7.3.10 |
| __MySQL__ | 15.1 |
| __MariaDB__ | 10.5.10 |
| __Server__ | Amazon Linux |

## 手順
__1, Laravel内にcronとの連携処理を登録する__
__2, Laravel内に処理したい内容を実装する__
__3, cronに実行コマンドを登録、実行する__

## 1, Laravel内にcronとの連携処理を登録する

バッチ登録用の

元記事を表示

【CakePHP】入門記事

# 0. はじめに
## 0-1. 全体の流れ
> [1.教材](#1-教材)
> [2.基礎](#2-基礎)

## 0-1. TL;DR
– CakePHPの教材や基礎参考リンク集まとめ

## 0-2.
# 1. 教材
https://book.cakephp.org/4/ja/tutorials-and-examples/blog/blog.html

https://book.cakephp.org/4/ja/tutorials-and-examples.html

https://book.cakephp.org/3/ja/tutorials-and-examples.html

https://dotinstall.com/lessons/basic_cakephp_v2

https://dotinstall.com/lessons/basic_cakephp

# 2. 基礎
https://book.ca

元記事を表示

生PHPでAPIルーティング, リフレクションで動的にクラスメソッド実行

# 生PHPで、APIルーティング
要件
`api/class/method`でのAPIリクエストを想定。
リフレクションで動的に実行する。

“`php index.php
/api/index.php
// var_dump($script_name[‘REQUEST_URI’]); => /api/class/method

// URI`api/hoge/fuga?aa=1`から、`hoge/fuga`を取得
// デリミタは、URIの`/`と被らないように指定
$delimiter = ‘~’;
$pattern = $delimiter .dirname($_SERVER[“SCRIPT_NAME”]).’/([\w]*)/([\w]*)’ . $delimiter;
$result = preg_match($pattern, $_SERVER[“REQUEST_URI”], $matches);

// 正規表現より、`Index Out Of Bounds`は起きな

元記事を表示

【Laravel】ジョブとキューの基本

## キューとは

ジョブを貯めておく箱。基本的には先入先出法(FIFO)で処理を実行する。

キューの候補として、MySQLといったRDBやRedisのようなNoSQL、Amazon SQSが候補として挙げられる。

## ジョブとは

キューに格納する処理そのものこと。ユーザが応答を待たず、バックグラウンドプロセスで動かしたいもの。

## 環境

Laravel 9.35.0

PHP 8.1.2

## 事前準備

今回は、データベースのテーブルをキューとして検証してみます。

以下のコマンドでキュー用のテーブルを作成します。

“`shell
$ php artisan queue:table
$ php artisan migrate
“`

.envファイルの以下の箇所をsyncからdatabaseに変更します。

“`php
QUEUE_CONNECTION=database
“`

## サンプル実装

例えば、ユーザ作成処理の後処理としてメールで完了通知を送るケースがあったとします。

まず、以下のコマンドでジョブクラスを作成します。

“`shell
$

元記事を表示

LaravelのEloquentでtoArrayを使う場合はタイムゾーン設定が反映されないことがある

# 結論
Eloquentのattributeが、config/app.phpのtimezoneの設定が反映されずにUTCで取得されることがあります。
この条件は下記の通りです。
– toArrayまたはtoJson呼び出し時
– $castsプロパティにてdatetimeへのキャストが設定されているattribute

必要に応じてModelクラスのオーバーライドなど対策を行いましょう。

# 環境など
Laravel9系

# 理由
$castsにてdatetimeへキャストを設定したattributeをjsonserializeする際、CarbonのtoJsonメソッドが呼ばれます。
このメソッドは必ずUTCの値を返すため、結果としてEloquentのtoArrayやtoJsonメソッドの結果もUTCになってしまいます。

CarbonのtoJsonを呼び出している箇所: \Illuminate\Database\Eloquent\Concerns\HasAttributes::serializeDate

# 対策例
\Illuminate\Database

元記事を表示

php artisan migrateでエラー(SQLSTATE[HY000] [2002] Connection refused)

こんにちは、しほです。

Laravelを使って簡単なアプリ作成に挑戦中なのですが、migrationで早速詰まったので備忘録を残します。

# 環境
– Docker 20.10.14
– PHP 8.0.27
– Laravel 6.20.44

# 状況
– 以下のサイトを元にDocker + Laravelの環境構築
https://www.torat.jp/laravel-docker-lemp/
– php artisan make:model モデル名 -mcでモデルとコントローラとマイグレーションファイルを作る
– マイグレーションファイルを編集してカラムを追加する
– php artisan migarateでエラー

### エラー文
“`
SQLSTATE[HY000] [2002] Connection refused
“`

# やったこと
① 以下のサイトを参考に、.envのDB_HOSTをdockerのDBのコンテナ名(docker-compose.ymlの「container_name」で設定している名前)に変更
https://qiita.com/

元記事を表示

【Laravel】デプロイの際やっていおいた方が良いこと

## オートローダー最適化

本番環境へデプロイする場合、アプリケーションの自動ロードを高速化するクラスマップを作成して、Composerが、指定されたクラスのファイルを素早く見つけ、ロードできるようにします。

“`shell
$ composer install –optimize-autoloader –no-dev
“`

もしくはcomposer.jsonの中身において

“`php
{
“config”: {
“optimize-autoloader”: true
}
}
“`

と設定すれば

“`shell
$ composer install –no-dev
“`

で済みます。

上記コマンドを実行すると、return arrayの箇所に変更が入り、クラスマップを作成してくれます。

“`php:vendor/composer/autoload_classmap.php

元記事を表示

再実行のやり方とGotoとエラー処理

仕事で開発やっていて、phpの仕様について誤解していたので反省がてら。

とりあえずコード。
下は、try内容がエラーになった時、3回は再実行し
それ以降は対応できなかったとアラートを出して終了するという処理だ。

“`test.php
//変数宣言と初期化
$i = 0;
repeat:
try {
//try内の内容
echo (12/0);

} catch ( Exception $e ) {
//エラーしたら行われる処理
//4回以下なら上に戻る
if ($i <= 2){ $i++; print($i.'回目の再実行をします'); goto repeat; } else { print('3回再実行をしましたが、対応できませんでした'); exit; } } finally { //エラーしてもしなくても実行される処理のはず //エラー処理の場合は、exitされるはずなので、

元記事を表示

【Laravel】アクセサ/ミューテタの基本

# アクセサとは

アクセサは、Eloquentのプロパティにアクセスが合った時に値を変換する処理のこと

# ミューテタとは

ミューテタは、Eloquentのプロパティを設定するときに、その値を変換する処理のこと。

# どういう時に便利か

例えば、ユーザ追加APIがあったとします。その機能では、ユーザテーブルにメールアドレスを登録するとき、暗号化して登録する必要があるとします。

その場合、メールアドレスを暗号化する処理をコントローラもしくはサービスに実装するかと思います。復号処理についても同様です。

しかし、仮に友達追加APIみたいなのがあった場合、上記の方法だと友達追加APIのコントローラ、サービスにも暗号化の処理を実装する必要があります。

見ての通り、各機能ごとに毎回記述するのは冗長した記述とも言えます。

そこで、メールアドレスを登録する際に**ミューテタ**を使用すれば、暗号化部分の処理を毎回記述する必要がなくなるのでシンプルになります。

# ミューテタの記述方法

ミューテタの記述方法は以下の通りです。

“`php:User.php
/**
* emai

元記事を表示

【EC-CUBE】 プロジェクトをpublic_html配下にインストールする方法

# 初めに
どうも、フランスでプログラマーとして働き始めて1週間ほどの新人エンジニアです。

今回、案件でEC-CUBEのインストールからやらせてもらった時に、詰まったところを

備忘録として残します。

## 状況
EC-CUBEの4.2をインストールしたかったので下記を参考にした。
https://doc4.ec-cube.net/quickstart/command_install
上記の公式ドキュメントでコマンドからインストールする手引きでインストールを行うと、
`public_html/ec-cube/`配下にインストールされてしまう。

サーバー:Xserver
OS: Linux

### やりたいこと
ドキュメント直下に配置したい。

## 解決方法
一度`public_html/ec-cube/`配下にインストールする

その後中身の階層を一階層上げる

## やり方
①まずはpublic_htmlにcomposer.pharをインストールする

②ec-cubeをインストールするコマンドを打つ(この時にec-cubeディレクトリが作成される)
“`
php co

元記事を表示

エンジニアインターン2日目

今日はLPのチェックボックスの修正を行った。
JavasctiptやjQueryを使ってチェックの位置を変更しようとした。
そこでnet::ERR_ABORTED 404のエラーが発生した。
調べたところパスがずれていることが問題だった。
この前新しくjsのファイルを作成したところjsファイルを読み込ませようとlinkを読み込ませたところが問題であった。このことを先輩エンジニアに質問したところ一瞬で解決した。linkを消すだけのことだった。
簡単なエラーだったからこそ恥ずかしいし悔しかった。しかし、エラーを解決するための考え方を学ぶことができた。
今はとにかく何でも吸収することが大切であると思う。一日中コードに向き合えるこの機会を大切にしていきたい。

元記事を表示

OTHERカテゴリの最新記事