PHP関連のことを調べてみた

PHP関連のことを調べてみた
目次

【PHP】マイナーフレームワーク「Flow」を試してみる~DB接続&データ登録編~

# 初めに
前回は[こちら](https://qiita.com/nnhkrnk/items/2b9f647d6130a098345f)の記事でマイナフレームワークFlowを使った簡単なAPI作成を行いました。
今回はMySQLにデータを登録するAPIを作成していきます。

# FlowにおけるDB接続処理
Flowはdoctrineと呼ばれるORMを内包しています。
今回はこのライブラリを用いてTBL作成やDB接続を行っていきます。

https://www.doctrine-project.org/

## doctrineでできること
doctrineはORM形式でDB操作を行います。
具体的には以下のような特徴を持ちます。
* SELECTなどのDMLを記載する必要がなく、doctrineで用意されているメソッドを利用してDB操作を行う。
* 事前のテーブル作成が不要。1つのTBL対応するデータクラスを作成し、doctrine のmigrateコマンドを実行することでTBL作成を行う。

# DB接続試してみた
ということで、DB接続を行うAPIを作成していきましょう。
今回は

元記事を表示

LaravelのEloquentでorderByを使うとメソッドチェーンの補完が効かなくなるわけについて備忘録

以下のようなページングを想定した一覧情報を返すAPIコントローラ処理を書いていた時のこと
“`php:ArticleController.php
private const PER_PAGE = 30;

public function index(IndexRequest $request): AnonymousResourceCollection
{
$query = Article::query();
// withとかwhereとかいろいろ省略
$articles = $query->paginate(self::PER_PAGE);

return ArticleResource::collection($articles);
}
“`

一覧について「作成日の降順で取得」という仕様が抜けてたので以下のように修正しました

“`diff_php:ArticleController.php
public function index(IndexRequest $reque

元記事を表示

phpenv install で発生したエラーと解消方法

# はじめに
– 普段、PHPを書くことが多いのですがプロダクトによってPHPのバージョンが異なるので簡単にバージョンを切り替えられるようにphpenvのセットアップを行いました
– `phpenv install`でPHPをインストール時、`エラー → 解消 → エラー → 解消 → …`をひたすら繰り返しかなり疲弊しました…(特に7.x系)。ので、インストール成功までに実施したことをマシン交換時などに困らないようここに書き留めておきます

## 環境
– macOS Monterey 12.7
– Apple M1
– zsh 5.8.1 (x86_64-apple-darwin21.0)
– anyenv経由でphpenvインストール済み

## PHP7.3.33インストール時に発生したエラーと解決方法
– 環境変数のオプション指定について
– `~/.anyenv/envs/phpenv/plugins/php-build/share/php-build`配下にある`default_configure_options`というファイルに記述する方法もあるみたいな

元記事を表示

【個人開発】マイクラの建築物配布サービスを作ったメモ

## きっかけ
今年9月から無職になったので、以前からあたためていたサービスをつくってやろうと思い立ちました。

## つくったもの
https://poscra.com/

マイクラ統合版のPC版では(統合版とはって感じですが)、ストラクチャーブロックによって作成した建築を外部ファイルとしてエクスポートできます。
また建築物の3Dモデルのエクスポートもでき、3Dviwerなどでぐりぐり観察することもできます。
それらをつかってマイクラ建築のカタログみたいなものをつくりたいと考えました。

## 技術スタック
### アプリケーションフレームワーク
当初はNextJSを使おうと思っていました。
しかし、まちがったイメージかもしれませんがNextJSはクラウドサービスの使用前提な印象で、
– ファイルアップロード
– ログイン認証

などを使いたい+構成はスリムにしたい(一つのサーバで完結)+ファイル操作など慣れているPHPでやりたい 
等で結局『Laravel』を使用することにしました。

### フロント周り
デザインはLaravelに最初からついてくる『TailwindCSS』とど

元記事を表示

phpでのMQTT開発ガイド

![MQTTをPHPで使う方法](https://assets.emqx.com/images/c8bd6eeb524d0999ff879b95dbd10ba0.png?imageMogr2/thumbnail/1520×684)

英語ブログ:https://www.emqx.com/en/blog/how-to-use-mqtt-in-php

[PHP](https://www.php.net/)は、広く使われているオープンソースの多目的スクリプト言語で、HTMLに埋め込むことができ、特にWeb開発に適しています。

この記事では、PHPプロジェクトで`php-mqtt/client`クライアントライブラリを使って、[MQTTクライアント](https://www.emqx.com/en/blog/mqtt-client-tools)と[MQTTブローカー](https://www.emqx.io/)間の接続、サブスクライブ、サブスクライブ解除、メッセージの受信と送信の機能を実装する方法について主に紹介します。

## MQTTクライアントライブラリの選択

この記事では、Com

元記事を表示

PHP v8.3.0 のリリースと変更点

# PHP v8.3.0 リリース

PHP v8.3.0 がリリースされました。 :tada:

https://www.php.net/releases/8.3/en.php

# 新機能や変更点

Qiita に投稿されている PHP 8.3 の新機能や変更点についての記事です。

https://qiita.com/rana_kualu/items/91111443105a75a55e2f

https://qiita.com/HaruKado777/items/54e74936406262b2b39c

https://qiita.com/HaruKado777/items/bd26322cf467ecf0dccd

# 詳細

詳細は以下をご覧ください。

https://www.php.net/ChangeLog-8.php#PHP_8_3

上記のページを機械翻訳したものを掲載しておきます。

> PHP 8.3.0、2023年11月23日リリースの変更点は以下の通りです:
>
> – Bcmath拡張で数値から末尾のゼロを取り除くバグを修正。
> – CLIに`p

元記事を表示

Laravelでの日付処理: Call to a member function format() on string エラーの解決法

最近、Laravelのviewファイルで Call to a member function format() on string というエラーに直面しました。原因は、文字列として認識されているプロパティから format() メソッドを呼び出そうとしたためでした。

解決方法は複数存在するようですが、モデルで日付フィールドを明示的に指定する方法が一番簡単に思えたので採用しました。(Laravelでは、日付や時刻を扱う際にCarbonインスタンスの使用が一般的とのこと)

例として、以下のコードではBorrowモデルに$castsプロパティを追加し、borrowed_atフィールドをCarbonインスタンスとして扱うようにLaravelに指示しています。(型変換=キャスト)

“`Borrow.php

class Borrow extends Model
{
// …

protected $casts = [
‘borrowed_at’ => ‘datetime’,
];

// …
}
“`
この変更により、$borr

元記事を表示

Laravel9 Eloquent 便利そうなリレーションまとめ

Laravel9の便利そうなクエリビルダをまとめました。

https://readouble.com/laravel/9.x/ja/eloquent-relationships.html

## has
リレーション先にレコードがあるレコードのみ取得
“`php
// commentが少なくとも1つ以上あるすべてのpostを取得
$posts = Post::has(‘comments’)->get();
“`
## whereRelation
リレーション先のテーブルでwhereをすることができます。
複数の条件を指定したい場合は`whereHas()`を使用します。
“`php
// users → companies.name === $name のユーザーのみ取得
$users = User::whereRelation(‘company’, ‘name’, $name)->get();
“`
## orWhereRelation
`orWhere`のRelation版です。
“`php
// users → companies.name === $name or

元記事を表示

Macで brew を利用してPHP複数バージョンを切り替える方法

`brew` を使用して複数の PHP バージョンをインストールし、切り替える方法は、`brew` の `php` タップを使用することで簡単に行えます。以下に手順を示します。

### 1. Homebrew のアップデートとアップグレード:

まず、Homebrewを最新の状態にアップデートし、アップグレードします。

“`bash
brew update
brew upgrade
“`

### 2. PHP 7.4 のインストール:

次に、PHP 7.4をインストールします。

“`bash
brew install php@7.4
“`

### 3. PHP 8.1 のインストール:

同様に、PHP 8.1もインストールします。

“`bash
brew install php@8.1
“`

### 4. バージョンの切り替え:

#### a. PHP 7.4 を利用する場合:

“`bash
brew unlink php
brew link –force –overwrite php@7.4
“`

#### b. PHP 8.1 を利用する

元記事を表示

Guzzleへの移行: PHP開発者が直接cURL関数を使うべきでない理由

## 導入

長い歴史を持つ[cURL関数](https://www.php.net/manual/ja/ref.curl.php#ref.curl)ですが、近年では[Guzzle](https://docs.guzzlephp.org/en/stable/)というHTTPクライアントライブラリが主流になっている気がします。
なので使えるならGuzzle使ったほうがいいんじゃないかな〜って話を書きたいと思います。

※ 外部へリクエストを送信する方法として`file_get_contents`,`file`などの関数も存在しますがこれらも使わないようにすると幸せになれます。

## cURL関数の欠点

cURL関数はHTTPリクエストを行うためのPHPの標準的な手段で、cURL拡張さえ入っていれば外部のライブラリを必要とすることなく動きます。
ただ設計自体がかなり前にされたものなので、ユニットテストや複雑な構文など色々と問題になってきます。
問題を洗い出してみましょう。

### 1. 複雑な構文と設定

cURL関数は多くのオプションと設定を抱えており、これらを正確に設定することは

元記事を表示

【Mac/VSCODE】PHP intelephenseを使うために四苦八苦したメモ

## 概要
Mac OS 11とかの古めのMacでPHPにコード整形用にPHP intelephense (※1)を入れようとするも、
Macに入っているPHPのバージョンが古いと整形時にエラーが出てしまうため、いろいろ処理までに対応したぞというメモです。
既存のいろんな情報を寄せ集めての対応でしたが、この流れがどこかの誰かの助けになればと思い記録。

(※1 VScodeの拡張機能。割とメジャーですてき)
(※2 自分は7.3でした。)

## エラー詳細内容
すみません、忘れました。。初っ端から。。
具体的には忘れてしまいましたが、あんたのphpバージョンだと使えねーからエラーやで!
アップデートせえ!みたいなのがvs codeで出てたとおもいます。
結果、紆余曲折な旅に出ました。

## phpのバージョンが古いならアップデートしよう!
→ この辺の手順で行いました。
https://www.stub-create.com/blog/php/mamp-brew.html

が、mac osのバージョンが少し古くなってきているので落とせず。
ここもエラーは残してないので忘れた!

元記事を表示

TruthyとFalthy JavaScriptとPHPの違い

## Truthyとは
動的型付け言語において、真偽値型に変換されたらTrueになる値のこと

## JSとPHPで異なる例
#### ‘0’(文字列の0)
JSではtrue、PHPではfalse
“`test.js
‘0’ == true // true
“`
“`test.php
‘0’ == true // false
“`
#### [](空配列)
JSではtrue、PHPではfalse
“`test.js
[] == true // true
“`
“`test.php
[] == true // false
“`
ちなみに、JSでは{}(空オブジェクト)もtrue
“`test.js
{} == true // true
“`
#### 公式
https://developer.mozilla.org/ja/docs/Glossary/Truthy

https://developer.mozilla.org/ja/docs/Glossary/Falsy

https://www.php.net/manual/ja/types.comparisons.p

元記事を表示

Neither the property “_token” nor one of the methods “_token()”, “get_token()”/”is_token()”/”has_token()” or “__call()” exist and have public access in class “Symfony\Component\Form\FormView”

CSRF保護が有効になっているのが原因

symfony 2.8 で作成されたウェブサイトを symfony 6 台で再構築している時に表題のエラーが表示されました。
Symfony では CSRF (クロスサイト リクエスト フォージェリ)からの保護がデフォルトで有効になっているようです。

通常のウェブサイトの運営であれば有効な方が良いとは思いますが、
今回は、ひとまず開発を先に進めるため旧サイトの設定(CSRF保護は無効)に合わせ、有効化についてはクライアントと相談する事にします。

①CSRF 保護有効/無効のパッケージをインストール
“`
composer require symfony/security-csrf
“`

②config/packages/framework.yaml の framework以下に csrf_protection: ~ を追加します(CSFR保護の無効化)。
“`
framework:
csrf_protection: ~
“`
公式ドキュメント通りなのですが、エラーメッセージで検索してすぐに分からなか

元記事を表示

amazon comprehendをPHPで動かす

## はじめに
個人開発しているwebアプリで機械学習による自然言語処理を使った機能を実装するため、phpから[amazon comprehend](https://docs.aws.amazon.com/ja_jp/comprehend/)を使えるようにしましたが、なかなか苦戦したのでやり方を残しておきます。

## 対象者
– amazon comprehendを外部からweb apiのように使いたい人

## 結論
phpから感情分析が行えるようになりました
“`php:example.php
‘ap-northeast-1’,
‘version’ => ‘latest’
]);

$result = $client->detectSentiment([
‘LanguageCode’ => ‘ja’, // REQU

元記事を表示

LAMPスタックの基本ガイド

## はじめに
LAMPは、Linux、Apache、MySQL、PHP(またはPerl、Python)の頭文字を取ったもので、ウェブアプリケーションを構築するためのポピュラーな技術スタックです。この記事では、初学者向けにLAMPスタックの基本的な概念と各コンポーネントの役割について説明します。

## LAMPとは?
Linux (オペレーティング システム): LAMPの基盤となるOS。安定性とセキュリティが特徴です。

Apache (Webサーバー): ウェブサーバーとしての役割を果たし、クライアントからのリクエストを処理して静的および動的なコンテンツを提供します。

MySQL (データベース管理システム): データベースの作成、読み書き、更新、削除などのデータ管理を担当します。

PHP (スクリプト言語): 動的なウェブページを作成するためのスクリプト言語。データベースとの連携が得意。

## LAMPの特徴
#### オープンソース
LAMPコンポーネントはすべてオープンソースであり、無料で利用できます。これは特に初学者にとって負担のない環境を提供します。

####

元記事を表示

PHP 定数について

# 対象読者
[こちらの記事と同様](https://qiita.com/bpg_ts/items/1a25f6bd3d4656fb0bda#%E5%AF%BE%E8%B1%A1%E8%AA%AD%E8%80%85 “対象読者”)

# 定数とは
### 定数
「データを入れるための箱」、「名前を付けることができる」という点は、変数と役割は一緒。**変数との大きな違いは、「再代入が不可能」であること**。

### 定数を使う場合、使わない場合の比較
一度定数を定義すると、プログラム中で使い回せる。また、メンテナンス性が向上するのも便利な点だ。以下に、定数を使わない場合と使う場合のコードの比較を示す。実行結果は同じ。
##### 定数を使わない場合
“`php:定数を使わない場合
‘;
print (200 * 1.1).’
‘;
print (300 * 1.1).’
‘;

/* 実行結果
110
220
330
*/
?>

元記事を表示

【PHP】マイナーフレームワーク「Flow」を試してみる~API作成編~

# 初めに
前回は[こちら](https://qiita.com/nnhkrnk/items/003a21f31bc8d0546c08)の記事でFlowの環境構築を実施しました。
今回はJson形式のレスポンスを返す簡単なAPIを作成してみたいと思います。

# さっそく作ってみた
プロジェクト構成は以下です(今回の話で出てこないものは割愛しました)。
“`Neos.Welcome“`の下にTestControllerを新しく作成していきます。

“`
Quickstart
└ Packages/
├ Application/
| └ Neos.Welcome/
| ├ Classes/
| | └ Controller/
| | ├ StandardController.php
| | └ TestController(★)
|

元記事を表示

ScoopでPHPをインストールする

勉強するためにWindows環境でXAMPPを利用していて、Macユーザーになったので、Dockerを使いだし、Windowsの方でもDockerを主に利用していたのですが、諸事情でScoopでPHPだけインストールすることにしてみた走り書き。

# とりあえずScoopのアップデート
“`
scoop update
“`

“`
Updating Scoop…
Updating ‘main’ bucket…
error: Your local changes to the following files would be overwritten by merge:
bucket/amass.json
bucket/bombardier.json
bucket/drmemory.json
bucket/dynamorio.json
bucket/gitleaks.json
bucket/gosec.json
bucket/grype.json
b

元記事を表示

良いユニットテストって何だろう

# はじめに
私が今所属しているチームでは、バックエンドをPHPとLaravelで開発しています。
今までチームとしてユニットテストを書いていなかったのですが、これから機能開発をする際にはユニットテストを書いていこうということになりました。

ユニットテストに対する知見がチームとして薄いので、いい機会だと思い社内で勉強会を開催しました。
この記事は、その第一回目でチームに共有した内容です。今回はあくまで理論的な話で、具体的なコードはでてきません。

参考にした書籍は、[Good Code, Bad Code ~持続可能な開発のためのソフトウェアエンジニア的思考](https://www.amazon.co.jp/Good-Code-Bad-%EF%BD%9E%E6%8C%81%E7%B6%9A%E5%8F%AF%E8%83%BD%E3%81%AA%E9%96%8B%E7%99%BA%E3%81%AE%E3%81%9F%E3%82%81%E3%81%AE%E3%82%BD%E3%83%95%E3%83%88%E3%82%A6%E3%82%A7%E3%82%A2%E3%82%A8%E3%8

元記事を表示

【Laravel】大文字・小文字・数字が1文字以上含まれるパスワードの生成方法

## 概要

下記の条件を満たすパスワードの生成

– 大文字が1文字以上含まれる
– 小文字が1文字以上含まれる
– 数字が1文字以上含まれる
– 文字数は8文字

### 環境

– Laravel Sailでの環境構築
– Laravel 10.30.1
– PHP 8.2.12

## 実際の記述

“`php
private function generatePassword(): string
{
$password = Str::password(8);

if (preg_match(‘/^(?=.*[A-Z])(?=.*[a-z])(?=.*[0-9]).{8,}$/’, $password)) {
return $password;
}

return $this->generatePassword();
}
“`

## 補足

– `Controller`内のprivateメソッドに定義した際の記述
– ハッシュ化(`Hash::make()`)はメソッドの呼び出し先で処理
– 他の文字

元記事を表示

OTHERカテゴリの最新記事