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

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

Laravelのメールをキュー投入してバックグラウンドで処理する

# はじめに
[前回の記事](ttps://qiita.com/fakefurcoronet/items/17323a2e11d3eb11c445)で2段階認証を実装したわけですが、[公式ドキュメント](https://readouble.com/laravel/9.x/ja/mail.html)にこんな記述がありました。

> 電子メールメッセージの送信はアプリケーションのレスポンス時間に悪影響を与える可能性があるため、多くの開発者はバックグラウンド送信のために電子メールメッセージをキューに投入することを選択します。

というわけで、2段階認証のコードを送信するメールをキュー投入してバックグラウンドで処理できるようにしたいと思います。

# databaseキュードライバの設定
今回、キュードライバはDBを選択します。
[公式ドキュメント](https://readouble.com/laravel/9.x/ja/queues.html)に従い、ジョブを保存するためのテーブルを追加します。

“`console
php artisan queue:table
“`
“`cons

元記事を表示

Laravelで2段階認証(2FA)を実装する

# はじめに
現代において、もはやログイン認証の強化は必須と言っても過言ではないでしょう。

そこで今回は、サインイン時にユーザーのメールアドレス宛にコードを送信し、そのコードを入力しなければログインできない、2段階認証(2FA)の仕組みをLaravelで実装した際のコードを備忘録として記したいと思います。

## 前提条件
– メールアドレスの確認ロジックを導入済みであること
https://readouble.com/laravel/9.x/ja/verification.html

# DBカラムの追加
2段階認証時に使用するコードや、コードの有効期限、2段階認証の利用有無を管理するカラムをusersテーブルへ追加します。

“`console
php artisan make:migration add_two_factor_auth_fields_to_users_table –table=users
“`

“`php:database/migrations/2024_01_01_000000_add_two_factor_auth_fields_to_users_

元記事を表示

PDO接続の2002:対象のコンピューターによって拒否されたための対処法

# エラー内容
PHPでのPDOを用いたDB接続において下記で接続できますが、つまずいたので残しときます。
“`
$dbh = new PDO(‘mysql:dbname=”データベース名”;localhost’, ‘ユーザ名’, ‘パスワード’);
“`
上記で接続を行うことができるはずですが画像の通り2002エラーがでました。

![error.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3776357/43069d1c-7e03-e5e8-3226-b884ee854527.png)

# 対処法
“`
xmapp\phpMyAdmin\config.inc.php
“`
上記の場所にconfig.inc.phpというファイルがあるので探してください。
このファイルにポート番号があるので確認していきます。
“`
$cfg[‘Servers’][$i][‘host’] = ‘localhost:3305’;
“`
このように記述された点を探すと、ポート番号が”3305″になっていること

元記事を表示

【CakePHP】MissingViewExceptionの対応方法

## はじめに
CakePHPでAPIを作成していてMissingViewExceptionが発生するため調べてみました。

## 結論
下記のコードを対象のメソッドに追加すると解決しました!
“`PHP
$this->autoRender = false;
$this->autoLayout = false;
“`

## ChatGPT曰く
>ビューの自動レンダリングが有効な場合: $this->autoRender がデフォルトの値である true のままだと、アクションメソッドがビューファイルを自動的にレンダリングしようとします。そのため、アクションメソッドに対応するビューファイルが存在しない場合、ファイルが見つからないというエラーが発生します。

>レイアウトの自動適用が有効な場合: $this->autoLayout がデフォルトの値である true のままだと、アクションメソッドがレイアウトを自動的に適用しようとします。そのため、レイアウトファイルが存在しない場合、またはレイアウトの設定に問題がある場合、レイアウトが見つからないというエラーが発生します。

とのことで

元記事を表示

ゼロからまなぶプログラミング原理 (副題: 初期値はnullか空の値か?)

## はじめに

クラスのメンバー変数にタイプヒントを使用しなかった過去のphpには、メンバー変数に直接初期化値を入れない限り、デフォルトでnullが初期値になりました。この傾向から、変数の初期値を空の値ではなくnullに設定するケースが多かったです。

“`php
class DefaultMember { public $variable; }
var_dump((new DefaultMember)->variable); // Null
“`

タイプヒントが導入される以前の過去のphpでは、多くの場合、変数は単に値を保存するために使用されました。変数を宣言する前に、変数をどのように使用するかについての意図を考えて作成されるべきですが、タイプに対する意識なしに何かを作成する必要があるから変数には適当な値が入って、意図なしで変数が宣言されたので多くの場合初期値としてnullを使用するケースが多かったです。このような昔の慣行で、現在でもnullを初期値として使用するケースがあります。

phpでタイプヒントが登場し、変数にnullを使用するために`?T`や`null | T`な

元記事を表示

OpenAIをAPI利用するPHPとjavascript

# OpenAI Assistants

ChatGPTをはじめとするAIっておもしろいですよね。
MyGPTsも良いですが、エンジニアとしてはAPI利用したいケースの方が多いと思います。
APIからGPTsを利用するために、AssistantsでInstructionsを作りますが
いざAPIを使おうとするとthreadとかmessagesとかrunsとか・・・色々クセを理解しないと
API利用するのも一苦労です。

ってことで、簡単にAPIを利用できるように**ライブラリ化**しました。
しかも、バックエンドとフロントエンドがたった1つのファイルで使えるお手軽さ(!)
リポジトリを公開しましたので、即利用したい方は以下からどうぞ。
↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓
 https://github.com/tri-comma/OpenAI_PHP_JS
↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑

## 解説

1つのファイルでPHPとjavascript??:thinking:
はい、そうです。GETとPOSTでレスポンスを切り替え

元記事を表示

Laravel Duskでブラウザテストを行う

### 開発環境
– Windows 10 Pro(64bit)
– PHP 8.1.9
– Laravel 10.10
– Laravel Dusk 8.2

Laravel Duskとは、ブラウザテストを自動化するためのLaravelのパッケージです。今回は、インストールしてから、簡単なテストをするまで記事に書きます。

1.[Google Chrome](https://www.google.co.jp/intl/ja/chrome/browser/welcomeback.html)の最新版をダウンロードして、バージョンを確認してください。確認方法として、僕の開発環境では、**C:\Program Files (x86)\Google\Chrome\Application** ディレクトリ内の**124.0.6367.119**ディレクトリがありますので、これがバージョンとなります。

2.以下のコマンドをプロジェクトのルートディレクトリで実行
“`bash
composer require laravel/dusk –dev
“`
3.ChromeDriverをインストー

元記事を表示

【Golang, PHP】PDFスライド画像変換&S3保存処理のパフォーマンス改善

大学の学部四年生でエンジニアをしている者です。
普段は業務委託でバックエンド開発をメインに行っています。
今回はPHPのプロダクト内で起きていた問題解消にGolangの機能(Go routine, channel)を使用して解消をしました。
その概要をまとめます。
コード自体はプロダクトに反映してしまったので載せるのは控えます。

## プロダクト使用技術
– AWS EC2 (t3.medium)
– AWS S3
– PHP (Laravel)
– poppler-utils (pdftoppmコマンド) ⇒ PDFの画像変換処理で使用
– Golang ⇒ 改善のために使用

## 開発機能詳細

ピッチ資料を生成する機能です。

https://www.hear.co.jp/recruit/saiyoupitch-100sen

機能の内部処理の流れとしては以下の通りです。(AS IS)
1️⃣ **ユーザーはPDFファイルをアップロード**
2️⃣ **アップロードされたファイルをローカルのディスクに一時保存**
3️⃣ **ローカルディスクに保存されているPDFスライドを画

元記事を表示

PhpModbus を使う

[PhpModbus](https://code.google.com/archive/p/phpmodbus/)

https://code.google.com/archive/p/phpmodbus/

PHPからModbusをアクセスする場合に便利なPhpModbusですが、2013年7月以後、エンハンスがされていない様子。まあ枯れた分野なので、ユーザ・サイドからしてもエンハンスしていただく必要はありません。
ただし、最終リリース版 0.8.r106 でも、そのままでは現在のPHPバージョンでは動きません。クラス ModbusMaster だけを使う限りでは、1ステップだけ修正する必要があります。他のクラスを使ったことはないので、他のクラスではどうなるのかは知りません。
1ステップだけの修正なので、エラーになっても臆せずに修正して使用してみてください。

## なにが問題なのか
最終リリース版 0.8.r106 しか使用したことがありませんが、コンストラクタ名称に起因するエラーが発生します。
PHP4までは当然であった「コンストラクタの名称はクラスの名称と同じ」は、現在のPHP

元記事を表示

シンボリックリンクに悩まされた

Laravelで画像を表示させるところで詰まったのでシンボリックリンクの学習も兼ねて忘備録

シンボリックリンクにハマる人は多いみたいでたくさんの方が記事をあげてくれていて、本当にありがたい。
その足しにでもなれば。

Laravelでは画像を表示させる際に必要なシンボリックリンクというものがある。
[【Laravel】画像を保存して表示する方法](https://inouelog.com/laravel-image-display/)


[【Laravel】”storage/app/public”に配置した画像へアクセスしてみる](https://tektektech.com/laravel-storage-app-public/#google_vignette)



# シンボリックリンクとは
>オペレーティングシステム(OS)のファイルシステムの機能の一つで、特定のファイルやディレクトリを指し示す別のファイルを作成し、それを通じて本体を参照できるようにする仕組み。
[シンボリックリンク 【symbolic link】 ](https

元記事を表示

インターフェイス

## はじめに

インターフェイスについてまとめる

### インターフェイスとは

配下のメソッドが全て実装を期待/強制するメソッドであるクラスのこと。
中身を持つメソッドやプロパティを定義できず、アクセス修飾子の指定もできない。

#### インターフェイスと抽象クラスとの違い

インターフェイスでは多重継承ができる。
抽象クラスでは多重継承はできない。

多重継承が可能なことで、メソッドを目的に応じて様々なインターフェイスに振り分け、サブクラス側では必要なメソッドを含むインターフェイスだけを選択的に継承(正しくは実装)する、ということができる。

#### インターフェイスの役割

インターフェイスの利用者に契約内容を約束し、裏側の実装を隠す。
そして、実装者にはその契約を守ることを求める。

#### 参考コード

`Triangle`クラスで`IFigure`インターフェイスを実装している。

“`php:IFigure.php
interface IFigure
{
function getArea(): float;
}
“`

“`php:Triang

元記事を表示

抽象クラス

## はじめに

抽象メソッド/クラスについてまとめる

### 抽象メソッドとは

サブクラスでオーバーライドされることを期待/強制したメソッド。
また、抽象メソッドを含んだクラスのことを抽象クラスという。

#### 参考コード

抽象メソッドを定義するには、`abstract`修飾子を使う
抽象メソッドはサブクラスで必ずオーバーライドされるべきメソッドなので、スーパークラスの側では中身を持つことはできない。

“`php:Figure.php
abstract class Figure
{
protected float $width;
protected float $height;

public function __construct(float $width, float $height)
{
$this->width = $width;
$this->height = $height;
}

protected abstract function getArea(): float;
}

元記事を表示

ポリモーフィズム

## はじめに

ポリモーフィズムについてまとめる

### ポリモーフィズムとは

同名のメソッドで異なる挙動を実現する。
多態性と訳される。

#### 参考コード

“`php:Figuer.php
class Figure
{
protected float $width;
protected float $height;

public function __construct(float $width, float $height)
{
$this->width = $width;
$this->height = $height;
}

public function getArea(): float
{
return 0;
}
}

“`

“`php:Triangle.php
require_once ‘Figure.php’;

class Triangle extends Figure
{
public function getArea()

元記事を表示

Laravelでページネーションを試したメモ

## はじめに
https://qiita.com/kenji123/items/a78e85ffc9309fad10bb
Laravelのコレクションに対し、ページネーションの使用を行っています。
今回のケースでは、データベースから直接ページネーションするのは断念し、Laravelのコレクションを使用してデータを処理し、その後でページネーションを適用しました。

## SQL vs コレクションベースのページネーション

通常、データを効率的にページネーションするためには、データベースクエリ自体で`paginate()`メソッドを使用するのが最も効率的です。これにより、必要なデータのみがデータベースから取得され、アプリケーションへの負荷が軽減されます。

しかし、データの加工が必要でクエリだけではページネーションが困難な場合は、データベースから全データを取得してからコレクションを使って加工し、`forPage()` メソッドや `slice()` メソッドなどを用いて手動でページネーションを行うことができます。

## コレクションベースでの対応

ID取得後、ページネーション適用に

元記事を表示

【PHP】マイナーフレームワーク「Flow」を試してみる~テンプレートエンジン編~

# 初めに
Flowでフロントエンドを実装する場合、テンプレートエンジンを用いて動的なHTMLファイルを作成することができます。今回は、Flowのテンプレートエンジンである「Fluid」の基本的な使い方をまとめていきます。

# Flowのテンプレートエンジン”Fluid”

動的ページを作成する場合、Controllerで取得した値を画面に表示したいということがあるかと思います。
Flowでは、Fluidというテンプレートエンジンを利用することで、ControllerからHTMLに値を渡すことができます。

## イメージ

こちらは、あるブログ投稿サービスを例に、投稿した内容が表示されるようなHTMLファイルの例です。
([Flowの公式ドキュメント](https://flowframework.readthedocs.io/en/stable/TheDefinitiveGuide/PartIII/Templating.html#what-does-it-do)から拝借しました)

“`html
{namespace f=Neos\FluidAdaptor\ViewHelpers

元記事を表示

【Laravel】Eloquentで更新をかけるとIllegal offset typeが発生する

# 発生した問題
以下でDBの更新、新規データ登録をしようとすると「Illegal offset type」が発生した。

“` php
public function updateSkillAction($datas,$skillId){
for($i=0; $i< count($datas->action_index); $i++){
if($datas->exist_action_flag[$i] === 1){
SkillAction::where([
‘skill_action_id’=>$datas->skill_id,
‘action_index’=>$datas->action_index[$i]
])->update([
‘skill_action_name’ => “スキルアクション名”,
‘skill

元記事を表示

【Laravel】FormRequestでバリデーション前に入力値を加工

# 環境
Laravel10
Windows11

# 目的
Postmanでform-dataを使用し、Requestを送信。受け取った値を加工したい。

・string型をint型へ変換
・array配列の中身をint型へ変換

# 公式ドキュメント
https://readouble.com/laravel/8.x/ja/validation.html

# prepareForValidation()
prepareForValidation()を使用することで、バリデーション前にデータを加工できる。

“`php:TestRequest.php

protected function prepareForValidation()
{
$this->merge([
‘subject_id’ => (int) $this->subject,
‘class_ids’ => array_map(‘intval’, $this->class_ids),
‘public_scope’ => (bool) $this->public

元記事を表示

コードゴルフ大会開催のために、コードが合っているかを判定する処理を作成する

# はじめに

こんにちは、エンジニアのkeitaMaxです。

今回は仲間内でコードゴルフ大会を開催しようと思い、そのために書いたコードがあっているかどうかを判定する処理を書こうと思います。

今回はPHPで実施する予定で、コードを送信するフロンタ側はNext.js、判定する処理を作成するAPI側はLaravelで書く予定です。

# コードゴルフとは

>コードゴルフはコンピュータプログラミング・コンテストの一種。参加者は与えられたアルゴリズムを、可能な限りもっとも短いソースコードで記述することを競う[1]。バイナリサイズではなく、ソースコードの文字数がスコアとなる。「Perl golf」など、トーナメントで使用されるプログラミング言語の名前がつけられることもある。ショートコーディング、コードパズル等とも呼ばれる[2]。
(引用:https://ja.wikipedia.org/wiki/%E3%82%B3%E3%83%BC%E3%83%89%E3%82%B4%E3%83%AB%E3%83%95)

Wikipediaでは上記のように書かれています。

あるお題に対して、どれだけ短

元記事を表示

AWS-SDK-PHP で Header value cannot be represented using ISO-8859-1. エラーの解決方法

## きっかけ

S3 の署名付 URL を使用してオブジェクトをダウンロードする際、response-content-disposition の filename が日本語だと、タイトルに記載されているエラーが発生していました。

自己解決の過程で、ファイルダウンロード周りの使用や文字コード周りの知見を増やすことができたので、備忘録的に記事にまとめたいと思います。

## エラー発生時の実装

下記のような実装でした。

“`php
‘ResponseContentDisposition’ => ‘attachment; filename=’ . $fileName
“`

## 解決後の実装

以下のような実装にすることで日本語のままダウンロードすることができました。

“`php
$fileNameEncoded = urlencode($fileName);

$cmd = $this->inner->getCommand(‘GetObject’, [
// ~中略~
‘ResponseContentDisposition’ => “attachment; fi

元記事を表示

継承/オーバーライドの禁止

## はじめに

継承/オーバーライドの禁止についてまとめる

### なぜ継承/オーバーライドを禁止するのか

継承可能なクラスには、実装/修正する際に派生クラスへの影響を考慮しなければならず、派生クラスの間でも、どのクラス/メソッドなら安全に継承/オーバーライドできるかを判別しなければならない。
このような問題を考えると、無制限に継承/オーバーライドを認めるのは避けるべきで、設計時点で継承/オーバーライドを想定していないならば、禁止してしまった方が良い。

### final修飾子

継承/オーバーライドを禁止する

#### 参考コード1

`BusinessPerson`クラスの`work`メソッドをオーバーライド禁止にしている。

“`php:Person.php
class Person
{
public $firstName;
public $lastName;

public function __construct($firstName, $lastName)
{
$this->firstName = $firstNa

元記事を表示

OTHERカテゴリの最新記事