- 1. a-blog cmsで現在のエントリーを「関連エントリー」に登録しているエントリーを表示する
- 2. 【Laravel】PHPUnitでテストコードを書くときのTipsやサンプルコード
- 3. Ray.MediaQuery
- 4. PHPUnitとMockeryで単体テストつくる
- 5. Laravel のサーバー移行 ( PHP8の環境) 手順
- 6. AWS SDK for PHP を使って画像アップロードをサクッと実装する
- 7. 【PHP】ChromeDriverでPDFをダウンロードする方法
- 8. KMSで生成したキーペアを利用してJWTを作成するサンプル
- 9. Laravel の firstOrNew() firstOrCreate() をレースコンディション考慮で実用的に使う
- 10. カフェでプログラミングしてる風(でも何もやってない)php版
- 11. ファイルの操作
- 12. EC2 + RDS + Nginx + PHP8 + Adminer でWordpressを構築
- 13. 新卒エンジニアが先輩に指摘されたこと5選
- 14. 自作バルクアップデート
- 15. ざっくりcakephp2 vs cakephp4の違い
- 16. csvのヘッダー比較でつまづいた
- 17. 【Laravel】TALL stackなFilamentを使って爆速で管理画面を構築する
- 18. Amazon Linux 2のPHP 7.4環境に、APCuを導入する
- 19. PHPの遅延静的束縛 〜継承と委譲を添えて〜
- 20. PHPによる疑似的なイミュータブルとムーブセマンティクスモドキ
a-blog cmsで現在のエントリーを「関連エントリー」に登録しているエントリーを表示する
これは「a-blog cms Advent Calendar 2021」の、17日目の記事です。
https://adventar.org/calendars/6371
## 前置き
管理しているサイトで、数年前に「今表示しているエントリーが**関連付けられている**エントリーを表示できませんか」と相談されました。言い換えると現在のエントリーを**関連エントリーに登録している**エントリー、ということになります。
そのサイトでは、ブログを横断した関連エントリーを多用していました。ここでは*A→B*とします。
数十件くらい投稿してから、*B→A*の関連付けも追加して相互リンクにしようとしたところ、a-blog cmsの仕様上、エントリーBの編集画面へ行っても「関連付けをしているのがエントリーAである」ことがわからないので、AとBの編集画面を両方表示して作業している、とのことでした。これは非常に難しいです。a-blog cmsのタグだけでは「関連付けられているエントリー」を調べる方法がないからです。相談された方は「これができたら助かるなー」レベルのご相談だったので、まとまった作
【Laravel】PHPUnitでテストコードを書くときのTipsやサンプルコード
Laravel Advent Calendar 2021 17日目の記事です。
僕自身が書いた経験のある範囲でPHPUnitでテストコードを書くときのTipsやサンプルコードをまとめます。https://qiita.com/advent-calendar/2021/laravel
## はじめに
いきなりタイトルには直接関係ない小ネタを挟みます。
### テスト関連のコマンド
テストファイル作成
“`sh
# tests/Featureに作成される
php artisan meke:test SampleTest# tests/Unitに作成される
php artisan meke:test SampleTest –unit# ディレクトリを指定してファイル作成
# tests/Feature/User配下
php artisan meke:test User/SampleTest
# tests/Unit/User配下
php artisan meke:test User/SampleTest –unit
“`テスト実行
“`sh
Ray.MediaQuery
# ドメインとインフラ層のDIP
この記事は [BEAR.Sunday Advent Calendar 2021](https://qiita.com/koriym/private/32a4ad10f0601345767c)の記事です。
以前の記事、[Ray.Di](https://qiita.com/koriym/items/55101291b72cda899871)で[Dependency Inversion Principle(DIP)、依存性逆転の原則](https://ja.wikipedia.org/wiki/%E4%BE%9D%E5%AD%98%E6%80%A7%E9%80%86%E8%BB%A2%E3%81%AE%E5%8E%9F%E5%89%87)を紹介しました。その原則に従えば、ドメインから特定の永続化コンポーネント、特定ORMの実装に依存することはどうでしょうか?
ドメイン層からインフラ層の実装に依存するのではなく、その逆、ドメイン層のインターフェイスにインフラ層の実装を合わせる事を特定の状況下でより効率的に行うためのパッケージがこの[Ray.MediaQ
PHPUnitとMockeryで単体テストつくる
本記事は[ハンズラボAdvent Calendar 2021](https://qiita.com/advent-calendar/2021/handslab)の17日目です。
## はじめに
下記のようなクラスのテストを書きたいなーと思いました。“`php
class Hoge
{
private $clinet; // 外部に依存private function someMethod()
{
$return = $this->clinet->methodA(); // 外部に依存
$result = Fuga::staticMethod(); // 外部に依存
// なんかの処理
}public function callSomeMethod()
{
// なんかの処理(長い&外部依存あり)
$this->someMethod();
// なんかの処理(長い&外部依存あり)
}//
Laravel のサーバー移行 ( PHP8の環境) 手順
#はじめに
レンタルサーバーから、AWSEC2の移行する際に、苦戦したため、手順を記載します。
移行前は、apacheでPHP7、移行先はnginxでPHP8となっています。#前提条件
– VPC,サブネット,EC2,RDSは構築済み
– 移行前
– PHP7.1
– apache2.4
– Laravel 5.5
– phpmyadmin– 移行後
– `PHP8.0`
– `nginx`
– `Laravel6以上` (PHP8に対して、laravel6以上が対応しているため)
– RDS MYSQL
– adminer(phpmyadminでもよい)
– EC2 + RDS + Nginx + PHP8 + Adminer の構築は↓が参考になります。(wordpressのところは省きましょう)https://qiita.com/holdout0521/items/342afcee0736a7165e7d
#流れ
1. DBを移行
1. ディレクトリを移行
AWS SDK for PHP を使って画像アップロードをサクッと実装する
この記事は [PHP Advent Calendar 2021](https://qiita.com/advent-calendar/2021/php) 16日目の記事です。
15日目の記事は[@opy](https://qiita.com/opy)さん投稿の [PHPによる疑似的なイミュータブルとムーブセマンティクスモドキ](https://qiita.com/opy/items/f6cf96b2c0b62ab4f9a9) 、
17日目の記事は[@iamyukihiro](https://qiita.com/iamyukihiro)さん投稿の[私用のLinuxサーバーに、PHPのビルトインサーバーをデプロイした話](https://tech.quartetcom.co.jp/2021/12/17/built-in-server-deployment/)です。# 本記事の概要
[AWS SDK for PHP](https://aws.amazon.com/jp/sdk-for-php/) を用いて **S3 の指定バケットへ画像アップロード**をできるようにします。
–
【PHP】ChromeDriverでPDFをダウンロードする方法
Selenium+ChromeDriverでWebブラウザの自動操作をする際、リンクが貼ってあるPDFを保存することが出来ずに詰まりました。
Pythonでの解決記事はいくつかあったのですが、PHPでの記事はなかった(気がする)ので、残しておこうと思います。# PDFのリンクをクリックした時に直接ダウンロード
Google Chromeがデフォルトの設定のままだと、PDFファイルへのリンクをクリックした際、自動的にその内容がタブ内に表示される一方で、PDFファイルはローカルに保存されません。
よって今回は、PDFのリンクをクリックした際に直接ダウンロードするようにするChromeDriverのoption指定を紹介します。“`php5
$options->setExperimentalOption(‘prefs’, [
‘download.default_directory’ => $directory_path, //デフォルトのダウンロード先を変更(必須ではない)
‘plugins.always_open_pdf_externally’ => true /
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管理画面のサイトヘルスに致命的な問題の対応
1. SSL化#EC2の初期設定
##EC2
新卒エンジニアが先輩に指摘されたこと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