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

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

KMSで生成したキーペアを利用してJWTを作成するサンプル

## 目的

JWTを利用することが増えてきましたが、都度払いだした鍵の管理が業務を圧迫するため
KMS管理のキーペアでJWTを作成する備忘録です。

## コード

KMSでは秘密鍵を取得することができないため、直接署名しています。
公開鍵は取得できるため、decodeは既存ライブラリ利用の想定です。

エンタープライズ環境では [lcobucci/jwt](https://github.com/lcobucci/jwt) のSigner実装として組み込むなどをお勧めします。

“`PHP
use Aws\Kms\KmsClient;

class JWTEncoder
{
/**
* JWT生成
*
* @param KMSClient $kms
* @param string $key
* @param array $claims
* @return string
*/
public static function encode(KMSClient $kms, string $key, arr

元記事を表示

Laravel の firstOrNew() firstOrCreate() をレースコンディション考慮で実用的に使う

# TL;DR

– Laravel の `firstOrNew()` `firstOrCreate()` `updateOrCreate()` 等はレースコンディションが全く考慮されていない
– 普通はユニークキー制約エラーを拾ってリトライするだけで十分
– `updateOrCreate()` 相当の処理で厳格にロストアップデートを回避する場合,悲観ロックまたは楽観ロックのいずれかの適用が必要。 Laravel 8.10 以降は `upsert()` という選択肢もある
– **[ライブラリ](https://github.com/mpyw/laravel-retry-on-duplicate-key)** を作ったので使ってね
– Laravel 8.10 の `upsert()` は,使われ方が全く違うので差別化はできている

# ご挨拶

Qiita ではご無沙汰しております。最近は専ら走り書きが多く,ネット上で技術にフォーカスした記事らしいものを書くのはかなり久しぶりです。以下の転職エントリが多分最後だと思います。

https://note.com/mpyw/

元記事を表示

カフェでプログラミングしてる風(でも何もやってない)php版

こんにちは!

久しぶりの投稿になります。kamotetuです。

[こちらの記事](https://qiita.com/torifukukaiou/items/b70dc5476762225cd4a2)を読んでたら、まだphpがなかったので作ってみました。

後発ですが、そんな大した内容ではないので暇つぶしに読んでもらえたらと思います。

あと、英語苦手なので、ターミナルに出力される英語はニュアンスで感じ取ってください。

php7.3
os mac

### 実際の挙動

![ezgif.com-gif-maker (1).gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/480146/ffa7dfc0-f2fd-1748-cf8c-e7a6db5f46e6.gif)

こんな感じになります。

processて何のプロセスやねんて感じですが、まぁIT知らない人が後ろから覗き込んだら「おぉ!?」てなるんじゃないかと。
あと、イメージしたのはdockerのbuildとhomebrewのインストールをイメ

元記事を表示

ファイルの操作

## ファイルの操作
仕事で使ったもの学んだもの、プライベートで使ってみたもの学んだもののメモのまとめです。
随時更新します。
### 関数
| 関数 | 説明 |
| —- | —- |
| file_get_contents(ファイル名) | ファイルの内容を全て書き込む |
| file_put_contents(ファイル名, 文字列) | 文字列をファイルに書き込む |
| fgets() | ファイルのデータを一行ずつ取得する |
| fopen() | ファイルへの接続をオープンし、ファイルにアクセスする際に使用する変数としてファイルポインタ(ファイルハンドラ)を返す |
| is_readable() | ファイルの読み込みに関するアクセス権(パーミッション)を点検、読み込み可能であるかどうかを知る |
| chmod(変更するファイル名, 変更後のパーミッション) | パーミッションを変更する |
| fclose() | オープンされたファイルポインタをクローズする |
| fread() |

元記事を表示

EC2 + RDS + Nginx + PHP8 + Adminer でWordpressを構築

#はじめに
nginxとphp-fpmの設定の兼ね合いで一部苦戦したため、書き留めます。

#前提条件

– vpc,ec2,rds作成済み
– rds作成時、databaseを一つ作成しておく![スクリーンショット 2021-12-15 20.15.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/988747/fc347a1c-d547-1d16-527e-3c057f2d74fe.png)

– PHP 8.0.8
– PHP-FPM 8.0.8
– nginx 1.20
– DB管理ツール:adminer
– ルートディレクトリ:/usr/share/nginx/html/test

#流れ
1. EC2の初期設定
1. EC2にPHPとnginxをインストール
1. nginx.confの設定変更
1. php-fpmの設定変更
1. DB管理ツールadminer導入
1. wordpress管理画面のサイトヘルスに致命的な問題の対応

#EC2の初期設定
##EC2ポートの変更
E

元記事を表示

新卒エンジニアが先輩に指摘されたこと5選

# はじめに
2022年も同じことを指摘されないように、先輩に指摘していただいたことをまとめてみました。
入社してから9ヶ月も経ち、2021年も終わるなんて…時の流れは本当早いですね。

# 1. 関数の引数はできる限り減らす
### 引数なし
“`php:index.php
public function getValueByCurrentRoute()
{
$route_values = [
‘a_route’ => ‘A’,
‘b_route’ => ‘B’
];
$current_url = url()->current();

return $route_values[$current_url];
}

$value = getValueByCurrentRoute();
“`

### 引数あり

“`php:index.php
public function getValueByCurrentRoute($current_url)
{
$route_values = [

元記事を表示

自作バルクアップデート

## ざっくりBULK INSERT(バルクインサート)の説明

複数のINSERT処理を行う場合、1行ごとにINSERT文を書いてSQLを流すことで処理することができます。

“`sql
/* 例文 */
INSERT INTO users (name, age) VALUES (‘tanaka’, 23);
INSERT INTO users (name, age) VALUES (‘suzuki’, 29);
INSERT INTO users (name, age) VALUES (‘makihara’, 26);
“`
ただ、上記の記述ではSQLが1行1行処理されるためデータの数が多くなる程処理が重くなっていきます。

それを軽くするのがバルクインサート
1行にすべてのINSERT文をまとめて書くことで処理が軽くなっていきます

“`sql
/* 例文 */
INSERT INTO users (name, age) VALUES (‘tanaka’, 23),(‘suzuki’, 29),(‘makihara’, 26);
“`

## BULK INSERTを

元記事を表示

ざっくりcakephp2 vs cakephp4の違い

### はじめに
>
CakePHPとはRuby on Railsの概念の多くを取り入れ、Rails流の高速開発とPHPの機動性を兼ね備えたPHPフレームワークです。
現在baserCMS5に向けてucmitzプロジェクトの開発に取り組んでいるのですが、cakephp2→cakephp4への移行にかけて大きな変化があったのでその問題についてざっくりまとめていこうと思います。

**baserCMSを利用している場合[こちら](https://baserproject.github.io/5/ucmitz/index#%E9%96%8B%E7%99%BA%E4%B8%8A%E3%81%AE%E6%B3%A8%E6%84%8F%E7%82%B9)もcakephp2→cakephp4移行の参考になるのでチェックしてみてください**

***
### 目次
– **共通の変更点**
– 名前空間について
– 初期化について
– **コントローラーの変更点**
– requestなどがget~/with~形式になっている
– AuthComponentがAuthe

元記事を表示

csvのヘッダー比較でつまづいた

csvの内容を登録する機能を実装していた時に詰まった話です。

## 結論
BOMに気をつけましょう

https://ja.wikipedia.org/wiki/%E3%83%90%E3%82%A4%E3%83%88%E9%A0%86%E3%83%9E%E3%83%BC%E3%82%AF

## 何が起きたか
### 実装内容

csvのヘッダーを比較して項目に過不足がないか確認する為に下記のような実装を行なった。

“`php

元記事を表示

【Laravel】TALL stackなFilamentを使って爆速で管理画面を構築する

# はじめに
TALL stackという技術スタックをご存知でしょうか?僕は最近知りました。

– Tailwind
– Alpine.js
– Laravel
– Livewire

の頭文字を取って**TALL**。
_Laravelコミュニティのメンバーによって作られたフルスタック開発ソリューション_(引用:[tallstack.dev](https://tallstack.dev/))だそうです。
> Laravelを学び、Tailwindで簡単にスタイルを作り、Laravel風のLivewireコンポーネントを書き、Alpine.jsをひとふりすれば、フルスタックのリアクティブでインタラクティブな創造のプラットフォームができあがります。

(引用:[tallstack.dev](https://tallstack.dev/))
本記事ではこの技術スタックを採用している[Filament](https://filamentadmin.com/)というライブラリを利用してリアクティブでインタラクティブな管理画面を爆速で構築してみます。

# 開発環境
全てローカル

元記事を表示

Amazon Linux 2のPHP 7.4環境に、APCuを導入する

# What’s?

PHP 7.4に、APCuを導入したいなと。

PHPの動作環境は、Amazon Linux 2で。

# APCu

APCuについては、こちら。

https://www.php.net/manual/ja/book.apcu.php

用途がシンプルに書かれています。

> APCu は、PHP で動くインメモリの key-value ストアです。 キーは文字列型で、値は任意のPHPの変数を保存できます。

https://www.php.net/manual/ja/intro.apcu.php

# 環境

今回の環境。

“`shell
$ cat /etc/os-release
NAME=”Amazon Linux”
VERSION=”2″
ID=”amzn”
ID_LIKE=”centos rhel fedora”
VERSION_ID=”2″
PRETTY_NAME=”Amazon Linux 2″
ANSI_COLOR=”0;33″
CPE_NAME=”cpe:2.3:o:amazon:amazon_linux:2″
HOME_URL=”htt

元記事を表示

PHPの遅延静的束縛 〜継承と委譲を添えて〜

## はじめに

すみません、タイトルは遊んでいます。
PHPと遅延静的束縛と、オブジェクト指向の継承、委譲について解説します。

前提としてオブジェクト指向の継承を理解しているものとします。
そのため、オブジェクト指向の継承について理解できていない場合は、より混乱すると思われます。

## この記事を書いた動機、または背景

弊社のサービス拡張を実装している中で
共通処理をSuperクラスに定義してパラメータをSubクラスから変更する意図をもった既存コードがありました。

今回の拡張ではパラメータだけではなく、SuperクラスのメソッドをSubクラスでオーバーライドして
オーバーライドしたメソッドをSuperクラスの共通処理から呼び出したかったため遅延静的束縛を利用しました。

なお、そもそもの話としてSuperクラスからSubクラスでオーバーライドしたメソッドを呼び出すことの是非、
及び継承関係を利用した実装より委譲を利用した実装にするべきではないか、ということも検討してみます。

## サンプルコード1

前提として下記のコードがあります。

“`php

元記事を表示

PHPによる疑似的なイミュータブルとムーブセマンティクスモドキ

# [PHP Advent Calendar 2021](https://qiita.com/advent-calendar/2021/php) 15日目

https://qiita.com/advent-calendar/2021/php

前日は@hanhan1978さんの[複雑度の上がったLaravelをミドルウェアから眺める方法](https://qiita.com/hanhan1978/items/c572c1daa92f995f31e0)でした

早速本題というか軽い説明と実装に入ります

# 【実装】イミュータブル

イミュータブルとは不変である事を意味しますが、今回は**再束縛・再定義・再代入全ての意味で不可**という意味で使います
簡単に言うとjavascriptのconstです

phpによる実装の前に`nodejs`と`deno`における`const`の確認から始めます
### nodejsのconst

“`js
Welcome to Node.js v17.2.0.
Type “.help” for more information.
> cons

元記事を表示

非同期ってナンダ

# 前書き

本記事は非同期についてひたすら大雑把に綴っています。主にPocketMine-MPを利用している開発者の方々へ、またphp前提のお話となっております。

# 1. 非同期?

### 疑問

しばしば目にする単語ではありますがイマイチ概要のつかめない、得体の知れないものだと思います。他人のプラグインをのぞいてみると、`AsyncTask`なんかを使っていたり。

非同期ってなんなんだろう…

### 答え

非同期とはズバリ、**メインスレッド**に対して**処理や通信の内容が別の場所で実行される**ものです。

下記のコードを参考にしてみましょう。`echo “1”`が実行された後`async()`という非同期関数が実行されると、この場合`echo “2”`が`async()`の実行結果を**待たずに**実行されます。

“`php
echo “1”;
async();
echo “2”;
“`

### つまり?

要はメインスレッドで重い処理をしてしまうと、**その処理が終わるまで次の処理に移行できない**わけです。別の場所に役割を分担できればその分早く処理

元記事を表示

Github Actions を使った PHP の静的解析

Hamee Advent Calendar 2021 15日目の記事です。
https://qiita.com/advent-calendar/2021/hamee

## はじめに

Q. 綺麗にコード書きたくね?
 
A. はい。

## 静的解析とは

>静的コード解析(static code analysis)または静的プログラム解析(static program analysis)とは、コンピュータのソフトウェアの解析手法の一種であり、実行ファイルを実行することなく解析を行うこと。逆にソフトウェアを実行して行う解析を動的プログラム解析と呼ぶ[1]。静的コード解析はソースコードに対して行われることが多く、少数ながらオブジェクトコードに対して行う場合もある。

Wikipediaより引用

つまるところ、機械的にコードを分析して悪いところ見つけてくれるってことですね。
例えば、IntelliJ にある PHP の静的解析は以下の画像ような指摘をしてくれます。
![ 2021-12-14 16.30.53.png](https://qiita-image-store.s3.ap-n

元記事を表示

Laravelで❝サービスクラス❞を排除したクリーンな設計

## はじめに

普段は FuelPHP で書かれたレガシーなアプリケーションの開発をおこなっているのですが、新規サービス立ち上げに伴い Laravel を導入することになり、四苦八苦しながらクリーンな設計を模索しました。

以下、本記事を読むにあたっての注意点です。

* マルチページアプリケーションでMVCモデルの設計である

* Eloquent Model の機能をフル活用するため、リポジトリパターンは諦めている

* 多目的な❝サービスクラス❞がないだけで、サービスクラス的なものは存在する

## ❝サービスクラス❞の問題点

サービスクラスはその性質上、いろいろな場所から呼ぶことができるため、適切に責任を分離しておかないとなんでもかんでも詰め込まれてしまい、すぐに肥大化してしまいます。

そして、いろいろな場所から呼ばれているがために、一度肥大化してしまうと、それを適切なクラスに分離していくという作業はとてつもなく労力がかかります。

また、サービスクラスにきちんと制約を設けていないと、いつの間にかなんでもありのクラスになり(個人的には名前がいけないと思う)、1つのサービス

元記事を表示

クラスチャットを作る #1

# はじめに
クラスチャットを作りたい方、いないとは思いますが、一応備忘録としてここに書いておきます。

:::note warn
必ずしも動くとは限らないので自己責任でお願いします。
:::

# 使用言語・ライブラリ等
言語は

– PHP
– JavaScript
– HTML
– CSS

てな感じで、ライブラリは

– jQuery

コレだけ。

# サービスの形態

– マネージャシステム(管理・運用)
– リアルタイムチャット
– 課題・アンケート機能
– チャネル機能
– ログイン機能(クラスの人一人一人にアカウントを付与)
– タイムライン機能

みたいな感じです。
クラスの人に好評だったらこれを元にSNSサービスでも作ろうかと。

:::note warn
いかにもできそうな感じで書いてはいますが、全然できないかもしれません。
:::

# おわりに

クラスチャットの記事は一旦寝るので中断。また明日出します。
好評であればGitHubで公開でもしようかな。

元記事を表示

【PHP】月を配列で取得する方法(Carbon, CarbonPeriod)

## まず初めにCarbon とは

phpで日付処理を行う時にとっても便利なのがCarbonです。
今日の日付や指定した日付など、支持してあげれば欲しい日にちを持ってきてくれます。

### 使えるようになるまで(インストール)
“`
composer require nesbot/carbon
“`

“`
//Laravelなら、利用したいファイルでuseしよう
use Carbon\Carbon;
“`

## 基本的な利用法

“`php
$date = new Carbon();
$date = Carbon::now(); // 現在時刻
“`

とまぁ、こんな感じで便利に利用できるのがCarbonさんです。
今回は、Carbonさんを利用して以下のような配列を作ってみようと思います。

“`
現在 2021年12月14日
array:49 [▼
0 => “2019年12月”
1 => “2020年01月”
2 => “2020年02月”
3 => “2020年03月”
4 => “2020年04月”
5 => “2020年05

元記事を表示

複雑度の上がったLaravelをミドルウェアから眺める方法

この記事は、[PHP Advent Calendar 2021](https://qiita.com/advent-calendar/2021/php)の20日目です。

https://qiita.com/advent-calendar/2021/php

## 複雑度の上がったLaravelとは

[採用情報](https://corp.kaonavi.jp/recruit/list/#engineer)にも記載のある通り、私の所属するカオナビ社では PHP(Laravel) でWebアプリケーションを作成しています。

カオナビがビジネスとして成長していく中で、提案・要望による機能追加・仕様追加が行われてきました。これに伴って、理解しなければならない条件・情報も増え、プログラムのファイル数、ディレクトリ数も増えていき、アプリケーションは複雑になっていきます。このような状況を、**複雑度が上がる**と表現します。

サービスが続く限り、どうしても複雑度は上昇していきます。しかし、人間の認知能力には限界があります。一度に脳内に詰め込んで考えることが出来る量には限りがあり、かつ劇的に

元記事を表示

ホリデープロジェクトの安全性を確保する

今年もまた、一年間待っていたプロジェクトを中断することなく進められる季節がやってきました。新しいコンテンツ管理システムの構築でも、お気に入りのオープンソースプロジェクトのプラグインでも、ホリデーシーズンは開発者が1年中待っていた特別なプロジェクトを作り上げることができる時期です。

ただし、プロジェクトの安全性を確保すること、特にオープンソースのライブラリやコンポーネントに可能な限り脆弱性がないことを確認することが重要であることを忘れないでください。脆弱性の可能性がないかコードをスキャンするだけでなく、プロジェクトを安全に保ち、エンドユーザーを可能な限り安全にすることが非常に重要なのです。

この記事では、Snyk CLIを使ってSCAとSASTのスキャンを行うことで、プロジェクトの安全性を保つ方法を見ていきたいと思います。このツールを使うと、パッケージマニフェストをスキャンしてオープンソースの脆弱性を探したり、コードをチェックして安全性を確認したりすることができます。

## いくつかのコードで遊んでみましょう

休暇中の最大の問題は、どのプロジェクトを行うかを選ぶことです。アイデ

元記事を表示

OTHERカテゴリの最新記事