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

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

PHP strrev関数のマルチバイト対応

この記事はPHP 8.1.11を使用しています。

## マルチバイト非対応
PHP標準関数のstrrevはマルチバイト対応に対応していないためstrrevにマルチバイト文字列を使用すると文字化けします。
“`php
$str = ‘https://hogehoge.jp/りんご/バナナ/山田太郎/’;
echo(strrev($str));
“`

“`
‘/��㎃骤尔籱匀�/��⊃㊃㐃㝀�/��━㓂㊂㙀�/pj.egohegoh//:sptth’
“`
## マルチバイト対応
マルチバイト対応として
文字列を1文字ずつ配列化 -> 要素を逆順 -> 文字列化します。
“`php
$str = ‘https://hogehoge.jp/りんご/バナナ/山田太郎/’;
echo implode(”, array_reverse(mb_str_split($str, 1, ‘UTF-8’)));
“`

“`
‘/」郎太田山「/”ナナバ”/’ごんり’/pj.egohegoh//:sptth’
“`

## 関数化
関数化するとこのようになります。
“`php
publ

元記事を表示

個々のblade.phpファイルの中でそれぞれvueを記述する

## 環境

– Laravel: 8.6.2
– Vue.js: 2.6.12
– PHP: 8.0.8
– Composer: 2.5.1
– Node.js: 19.3.0

“`zsh
$ composer create-project –prefer-dist laravel/laravel:^8.0 project-name
$ php artisan migrate:fresh
$ composer require laravel/ui
$ php artisan ui vue –auth
$ npm install && npm run dev
$ php artisan serve
“`

## 1.resource/views/layouts/app.blade.phpにyieldを追加する

既に用意されているhome.blade.phpに追記する形を取りたいと思います。
そこでhome.blade.phpを見てみると、**layouts.appを継承**していることがわかるので、継承元のlayouts.appにscriptを記述するためのyieldを追加

元記事を表示

2022年のEC-CUBEを振り返る

EC-CUBE コミュニティマネージャーの梶原です。

EC-CUBE Advent Calendar 2022 ラスト(25日目)は、毎年恒例となりました、今年2022年の振り返りをしたいと思います。

引き続きコロナ禍ですが、少しずつリアルの繋がりやイベントも戻ってきた1年でしたね。
EC-CUBEでも約2年半ぶりとなるリアルイベントを実施できて、改めてコミュニティの楽しさやすばらしさを感じる1年になったと思います。
W杯の印象が強い今年でしたが、改めて振り返ってみると冬のオリンピックも今年だったらしいですね。
なんだか今年は長い1年だった気がします。
まあ、そういうことで、ここからEC-CUBEの1年を振り返りをしていきますので、皆様もご一緒にこの1年を是非振り返ってみてくださいませ。

## 2021年12月末

2022年を振り返っていく前に、昨年2021年12月末でとても重要なページを公開しましたので、先にそちらを紹介させてください。

![SnapCrab_NoName_2022-12-25_19-42-38_No-00.png](https://qiita-image

元記事を表示

DoctrineとEloquent比較大全22: 論理削除する

day22(から3日遅れ)の今日は論理削除のやり方について見ていきます。
論理削除とは、レコードを削除する操作を行ったとき、実際にはDBMS上からDELETEせずに削除フラグや削除日時をUPDATEで書き込むことで、「ゴミ箱に入れる」のように復活可能な削除を行うことです。

## Doctrine

“`php:Enity/Book.php

元記事を表示

DoctrineとEloquent比較大全21: レコードの更新日時・作成日時を自動で保存する

day21(から4日遅れ)の今日は、DoctrineやEloquentでレコードを保存するときに、作成日時・更新日時を自動保存する方法を見ていきます。

## Doctrine

“`php:Entity/Book.php

元記事を表示

【PHP】nヶ月後の日付を計算したい!

## とりあえず書いてみる
突然ですが、与えられた日付のnヶ月後を表示する必要が発生しました。
とりあえず書いてみます。

“`php
function addSomeMonthsToTargetDate($targetDate, $months)
{
return date(‘Y-m-d’, strtotime(“+{$months} month”, strtotime($targetDate)));
}

$result = addSomeMonthsToTargetDate(‘2022-10-25’, 2);
var_dump($result); // 2022-12-25
“`
一回strtotimeでUNIXタイムスタンプに変換して、計算してから戻せば良さそうです。
ただ、strtotimeは2038年問題が発生するので避けたほうが良いと聞いたことがあります。
とりあえず確認します。
“`php
$result = addSomeMonthsToTargetDate(‘2037-10-25’, 3);
var_dump($result); // 1970-01-

元記事を表示

DoctrineとEloquent比較大全20: viewの利用

day20(から5日遅れ)の今日はビューを利用する方法を見ていきます。

下記のような著者ごとの著作数を表すビューに対して、それぞれのORMでデータを読み出すやり方を示します。
“`sql
CREATE VIEW `author_stat` as select authors.id, authors.name, count(books.id) as books_count from authors left join books on books.author_id = authors.id group by authors.id, authors.name;
“`

## Doctrine

“`php:Entity/AuthorStat.php

元記事を表示

Ray.Di アプリケーションから BEAR.Sunday を呼び出す

# はじめに

[BEAR.Sunday Advent Calendar 2020](https://qiita.com/advent-calendar/2020/bear-sunday) で以下の記事を投稿しました。

https://qiita.com/NaokiTsuchiya/items/b4df3e880a9265ed4aba

上記記事中において `Fornt & Backend` のケースとして他の PHP アプリケーションから BEAR.Sunday を利用する以下の記事を紹介しました。

https://qiita.com/koriym/items/9bf5ed9dcb1441ce5e89

今回は [Ray.Di for Laravel](https://packagist.org/packages/ray/ray-di-for-laravel) を使い、既存の Ray.Di アプリケーションから BEAR.Sunday アプリケーションを利用する例を紹介します。

# 実現すること

以下のようなことを実現します。

* Ray.Di for Laravel を適

元記事を表示

DoctrineとEloquent比較大全19: n+1を避ける

day19(を6日過ぎた)今日はn+1問題を避けるためにまとめてデータを取得する方法を見ていきます。

## Doctrine

“`php:Entity/Author.php

元記事を表示

【PHP8】match 式のこれまでとこれから

PHPer のみなさん、`match` は好きでしょうか?

私は結構好きです。

というのも、`switch` だと以下のように書く必要があるものを……

“`php
$say = “”;

switch (date(“w”)) {
case “0”:
$say = “weekend!”;
break;
case “1”:
case “2”:
case “3”:
case “4”:
case “5”:
$say = “weekday :(“;
break;
case “6”:
$say = “weekend!”;
}

echo “Today is $say”;
“`

`match` では以下の通り短く記述することができるからです。

“`php
$say = match (date(“w”)) {
“0” => “weekend!”,
“1”, “2”, “3”, “4”, “5” => “weekday :(“,

元記事を表示

パーフェクトPHP MiniBlogアプリケーション メモ

# 開発環境
– xampp
– アプリケーション名
– MiniBlog
– 配置場所
– xamppのhtdocsの直下

– ヴァーチャルホストの追加
– ヴァーチャルホストの追加は追加せず `localhost`でいく
– パーフェクトPHPでは ヴァーチャルホストの追加している
– `http://Mini-blog.localhost`
– ドキュメントルート
– ドキュメントルートは変更せず アプリケーションが入っているディレクトリにはアクセスできないように`.htaccess`で制限する。
– xampp の `htdocs` のまま。
– パーフェクトPHPではドキュメントルートを変更をしている
– `htdocs/MiniBlog/web`がドキュメントルートになる。
– [ヴァーチャルホストの追加とドキュメントルートの変更](https://qiita.com/kennsukea/private/c7125648b67a9f8d2855)

– パーフェクトPHPのフレームワークの概要

元記事を表示

アルゴリズムを知ろう

こんにちは!
CYBIRD Advent Calendar 2022 25日目担当の@S_onizawaです。
24日の記事は@min1osさんの「Nuxt3を0から勉強した学習フローをまとめてみた」でした。

# 1 自己紹介
私は今年で社会人2年目のサーバーサイドエンジニアです。
主にPHPを使って仕事をしておりますが、最近はGO言語も使った開発に携わらせていただいています。

# 2 概要
まず大前提に、アルゴリズムとは。
「問題を解決するための手順や計算方法」のことを言います。
アルゴリズムを知るにはどうすればいいのか、知ることのメリットなどを記載します。
書いてあることは結構基本的なことだと思いますが、初心に帰って見てもらえればと思います。

# 3 アルゴリズムを知る

実際アルゴリズムを知るには、直接調べてみたり、私が今回phpで書いたようにコードにしたりすると良いと思います。
アルゴリズムの教科書や情報技術者試験などでよく出てくる、ソートのアルゴリズムを例に出したいと思います。
今回はバブルソートとマージソートについて記載したいと思います。

## 3.1 バブルソー

元記事を表示

Laravel の Eloquent 拡張機能を作った

# Eloquent Method Expansion

## 機能概要

Eloquent を拡張し、where 句と orderBy 句を拡張し新しいメソッドを追加します。

(※正確には**拡張しているのは QueryBuilder** なのですが、リポジトリ名を先に決めてしまっていたので…)

## 使用条件

php8以上、Laraevel9 以上
(みなさんに使っていただけるよう、今年中に使用可能なPHP, Laravelのバージョンを下げていく改修をしたいと思います)

## github

https://github.com/kanagama/laravel-eloquent-method-expansion

## packagist

https://packagist.org/packages/kanagama/laravel-eloquent-method-expansion

## 作成の経緯

いくつかのプロジェクトに参画して思ったのですが、(同一プロジェクトでも)人によって Eloquent where の書き方が全然違っていて

1つの where(

元記事を表示

Kubernetes 環境におけるバッチのメトリクス収集のために公式ブログにある NewRelic Agent の構成パターンを考察&検証してみた

この記事は [NewRelicアドベントカレンダー2022](https://qiita.com/advent-calendar/2022/newrelic) の 25日目の記事です。

## はじめに

Chatwork のサーバーサイド開発部の @shi_no_oit です

現在 [Chatwork](https://corp.chatwork.com/ja/) では、PHPでのシステムを EC2 → Kubernetes に移行する取り込みを行なっております。

以前からシステムの大部分は Kubernetes 環境への移行が完了していたのですが、バッチ周りのシステムがまだ EC2 環境に残されており、移行に伴ってバッチのメトリクスを収集するための NewRelic Agent(NewRelic APM Agent 以降は NewRelic Agent と記載) をどのようにデプロイするか?を公式ブログにも投稿されている、[コンテナ環境におけるPHPエージェントの構成パターン](https://newrelic.com/jp/blog/best-practices/php-i

元記事を表示

VSCodeでLAMP環境(Amazon Linux 2/Apache/PHP8.1)のDockerコンテナに入って、Xdebugでデバッグする。

# はじめに

Visual Studio Code の拡張機能 Remote Development を利用して、 LAMP 環境(Amazon Linux 2 / Apache / PHP8.1)の Docker コンテナ内で、 PHP のデバッガ Xdebug を設定する方法です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/527226/aa27ce58-ffec-d5b2-3176-931557e80d14.png)

## 環境

– **macOS** Big Sur 11.6
– **Visual Studio Code**(VScode) 1.70.2
– **Remote Development** 0.21.0(VSCode の拡張機能)
– **PHP Debug** 1.29.0(VSCode の拡張機能)
– **Docker Desktop** 4.7.0
– **Docker Engine** 20.10.14
– **PHP**

元記事を表示

Laravelで開発始めるなら「TALL Stack」でしょう!!!

::: note warn
この記事では環境構築の説明はしていません。
ただのTALL Stackの推し活するだけの記事です。

推し活記事です。(大事なことなので2回言い申した)
:::
※恵美押勝ではない

# なんなんすかそれ?
### TALL
* TailwindCSS
* Alpine.js
* Livewire
* Laravel

これらの頭文字を並べて「TALL」と呼んでいます。

# よいとこ
### ①ファイルの数を削減できる
TailwindCSSはHTML要素に直接スタイルを書くので、基本的にCSSファイルは無くてもOKです。
Alpine.jsもどうようにHTML要素に直接JSを書くので、JSファイルを別で作らなくてOKです。

この2つを使う時点で、基本的にphpファイルだけで開発できてしまいます。

::: note

長いコード/少ないファイル ⇔ 短いコード/多数のファイル

この二者はトレードオフな関係だと思いますが、TALL Stackでの開発は「長いコード/少

フレームワークの設定をする、”Framework Bundle”

[Symfony Component Advent Calendar 2022](https://qiita.com/advent-calendar/2022/symfony-component)の25日目の記事です。

## 最初に
[Symfony](https://symfony.com)はPHPのフレームワークのひとつです。しかし、公式サイトの説明文には

> Symfony is a set of PHP Components, a Web Application framework, a Philosophy, and a Community — all working together in harmony.
(SymfonyはPHPコンポーネントのセットで、Webアプリケーションフレームワークで、哲学、そしてコミュニティです。それらがハーモニーを奏でながら動作しています。)

と書かれている通り、PHPコンポーネントのセットで、たくさんのコンポーネントを提供しており、それらを組み合わせてひとつのフレームワークとして動作しています。Symfonyのコンポーネントは、S

zerofill型のコードマップのkeyの型には気を付けて

# zerofill型のコードマップのkeyの型には気を付けて

## やっぱりコードマップだよね
俺はコウヘイ。エンジニアマスターを目指して開発修行の旅に出ている。DBのカラムのコードマップを作っていた時のお話。

MySQL< zerofillだぞ 僕< なるほど、0埋めね 僕< このカラムのコードマップをアプリケーションに組み込みぞ! ```php const MONSTER_CODE = [ '01' => ‘ドラゴン’,
’02’ => ‘スライム’,
’03’ => ‘おばけ’,

’99’ => ‘吸血鬼’,
];
“`

僕< DBからfetchするとstringになるしkeyの型はstringにしておくか ## 上手くいかない分岐 僕< どうやらNo99は存在してはいけないモンスターらしい。分岐処理で表示を分けるか ```php foreach (BOKEMON::MONSTER_CODE as $key => $val) {
if ($key === ’03’ || $key === ’99’)

【Laravel】SQLの確認は$query->dd()が便利

こちらは [Laravel Advent Calendar 2022](https://qiita.com/advent-calendar/2022/laravel) 21日目の記事です。
遅ばせながらクリスマスイブの本日に投稿します!

# 検証環境
Laravel v8.83.8

# $query->dd()は良いぞ
「Laravel SQL 確認」で検索すると下記の方法をよく見かけますが、

“`php
$query = User::where(‘id’, 1);
dd($query->toSql(), $query->getBindings());
“`

同じ処理を“$query“から直接実行できます。

“`php
$query = User::where(‘id’, 1);
$query->dd();

// 出力結果
// “select * from `users` where `id` = ?”
// array:1 [▼
// 0 => 1
// ]
“`

公式サイトにも記述されています。

https://laravel.com/docs/8

phpspreadsheetで使ったメソッド

一部CakePHPのコードが混ざっています。
適宜変換してください。

– 雛形ファイルからインスタンス化して出力するまで

~~~php
load($filepath);

// ここにシートに書き込む処理を書く

$writer = new XlsxWriter($spreadsheet);

// ダウンロードさせないとき