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

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

【Laravel】外部APIをスタブにして単体テストを実施する

外部APIに依存している機能を単体テストする場合、外部APIをスタブにしてダミーレスポンスを設定してテストをすることが一般的です。

今回、Laravelの単体テストにおいて外部APIに依存している部分があったのでLaravelの単体テストにおける外部APIのスタブ化について纏めました。

# 結論
– Http::fakeを使う事で外部APIとの通信をスタブに置き換えることができる
– 呼び出し順によって応答内容を変える場合はHttp::sequence()を使う
– Http::fakeは上書きができない

# 基本形
“`php
Http::fake([
‘/signin’ => Http::response([
‘status’ => ‘Success’
], 200),
‘*’ => Http::response([
‘status’ => ‘OK’
], 200),
]);
“`
Http::fakeにAPIのURLごとに応答内容をHttp::responseを使って設定すればよい。
ワイルドカードも使用可

元記事を表示

Laravelでマルチバイト文字数のカスタムバリデーションを作る

### 開発環境
– Windows 10 Pro(64bit)
– PHP 8.1.9 (cli) (built: Aug 2 2022 14:17:26) (ZTS Visual C++ 2019 x64)
– Laravel Framework 10.44.0

### マルチバイト文字数を取得する
PHPで文字数を調べる場合、strlen関数を使いますが、マルチバイト文字を使用する場合は、mb_strlen関数(**事前に、php.iniでextension=mbstringを有効にすること**)を使います。
ただ、絵文字などの場合、正しく1文字と認識できない場合があるので、今回は、grapheme_strlen関数(**事前に、php.iniでextension=intlを有効にすること**)を使っていきます。

### カスタムバリデーションを作成する
今回は、カスタムルールとして、『**指定したマルチバイト文字数以下**』であれば、OKという風にします。

以下のコマンドでカスタムバリデーション用のファイルを作成
“`powershell
php artisan

元記事を表示

PHPUnit10以降のstaticなdataProviderでもステートフルなケースに対応する

PHPunit10以降ではDataProvider関数はstaticが推奨になりました。
https://docs.phpunit.de/en/10.5/writing-tests-for-phpunit.html#data-providers
staticなので `$this` を使ったテストクラスの状態を参照できなくなります。

そもそもDataProviderはテストケース実行前に呼ばれるため、setUpで作成したデータを参照できません。

“`php:実行順序の確認
class ExampleTest extends TestCase
{
private int $expectValue;

protected function setUp(): void
{
parent::setUp();
echo “setUp called\n”;

$this->expectValue = random_int(0, 9);
}

#[DataProvider(‘data’)]
publi

元記事を表示

【Laravel】マイグレーション 任意のカラムを外部キー指定

例えば、usersテーブルがあり、そのテーブルを参照するpostsテーブルがあるとします。
Laravelでは、usersテーブルとpostsを紐づける外部キーは`user_id`と命名するのが一般的でしょう。

usersテーブルの`id`(主キー)とpostsの`user_id`を紐づけを行いたい場合のマイグレーション。
“`ruby:sample.php
Schema::table(‘users’, function (Blueprint $table) {
$table->id();
$table->string(‘name’);
});

Schema::table(‘posts’, function (Blueprint $table) {
$table->id();
$table->foreignId(‘user_id’)
->constrained()
->onUpdate(‘cascade’)
->onDelete(‘cascade’);
});
“`

しかし、例えばusersテー

元記事を表示

PHP(7.1.33) 学習 備忘録 – preg_replaceの”\\1″

とある案件でPHPを触れて、学んだことを書いておく。

# preg_replace

https://www.php.net/manual/ja/function.preg-replace.php

PHPの正規表現を使った置換`preg_replace`の置換後文字列に`\\1`というのが使われていましたが、知らなかったので調べました。
正規表現としては、`$1`と同じく部分置換をするときに使うものです。

“`php

“`
[実行結果](https://php-play.dev/?c=DwfgDgFmBQAkDOAXATgAgLyoOSE6GQXQyC1DKoP0MgtwyBlDFgNzTQBuAhsgPoAmArgLZgAUCKAShr80mHmGQBTAObMpYADYMAxpJ4AiAPQ98BAah5lyAzeoA06gDqWATKmsB

元記事を表示

LaravelのAtomic Locksを使って多重送信を防止する

## はじめに

#### 多重送信ができてしまう

ボタンを連打したり、リロードしたり、色々システム操作の中で、同じフォームが重複して送信されることがあります。

開発しているシステムでも、こちらの対策をしておかないと、unique制約のバリデーションなどをすり抜けた上で重複して登録されてしまいます。

多重送信の対策として、Laravel 10 の環境下でやってみたことをメモします。

## 多重送信に備えて
### その1 2回目以降のボタン無効化
ボタンの連打対応です。
JQueryで、ボタンが1回クリックされたらそのボタンは非活性にして、そのあとサブミットします。
これで連打されても2回目以降のリクエストは送られません。
フロントエンドの対応として一般的、かつ必須の方法かと思います。

“`php:blade.php

“`
(`$route` には操作したいControllerへのルート名を指定します)

元記事を表示

PHPerがRuby(Ruby on Rails)を約3年経験した結果

# はじめに
Hubbleでバックエンドエンジニアをしている @power3812 です。オブジェクト指向大好きマンで、神クラスを作れないかと模索の日々です:innocent:

今回はHubbleに転職して約3年経つので、振り返りの意味も込めてPHPerで一切Rubyを触ったことがなかった僕が、約3年Rubyを使った所感を書こうと思います!

# 筆者のサマリ
大学は電子情報で大学院は技術経営を学んでしました。大学院は21卒なので21卒で就活をして、サマーインターンでWeb開発を知り、PHPと出会い、Web開発の沼にハマりました。

しかし、大学院にいるよりも早く実践を積みたいと、大学院を中退し、20卒としてソーシャルゲーム会社に就職しました。
ソーシャルゲームということで、PHPをそのまま経験、その後受託系の会社に転職し、そこにはPHPerKaigiの運営にも携わっている方にPHPの真髄を叩き込まれました。

その後、自分が完全未経験のRubyで開発しているHubbleに入社しました。

# 結論
RubyもPHPも本質はなにも変わらないです。
これはその通りと言えば、その通りのこ

元記事を表示

Laravelでcontrollerから受け取った変数をViewで表示する

4月からエンジニアとして働く初心者です。

今回はLaravelでView(bladeファイル)にControllerから受け取った変数の中身を表示する方法をまとめてみます。

## ControllerからViewに変数を渡す
### ①viewメソッドの第2引数
– 単一の変数を渡す
“`php
public function sample() {
$value = 5;
return view( ‘sample.index’ , [ ‘value’ => $value ]); // [ ‘view側で使うときの配列/変数名’ => $設定した配列/変数名 ]の形。
}
“`
– 第2引数で渡すとき、一般には連想配列(`[ ‘キー’ => 値 ]` )にする
– 渡す変数は配列でも良い
“`php
public function sample() {
$fruits = array(
‘tomato’ => 100,
‘apple’ => 150,
‘banana’ => 50,
);
r

元記事を表示

【PHP】PHPで外部のサイトを読み込む方法

# はじめに
こんにちは! 中学2年生のWardHamamatsu67です! 今回は、PHPで外部のサイトを読み込む方法について説明したいと思います。
# コード
“`php

“`
こんな感じです。結構短めにできます。なお、今回読み込むサイトは一昨日紹介した気持ち悪い信号機のページです。
# 説明
“`php
$url = “file:///C:/xampp/htdocs/traffic_light.html”;
“`
この部分では、**$url**という変数を指定し、その中に、読み込みたいサイトのアドレスバーに書かれているURLを書きます。
“`php
$output = file_get_contents($url);
“`
この部分では、**$output**という変数を指定し、先程指定された$urlのデータ

元記事を表示

PHPの具体例で理解する「結合度」

## そもそも結合度とは
– 結合度はモジュール間の依存性を表す指標。
– 結合度は低ければ低いほどよい。
– 依存性が少なくなり、修正・拡張がしやすくなるため。
– 各モジュールが独立して、再利用しやすくなるため。

## 結合度には7つの種類が存在する。
![結合度高画質.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3660857/a7309ce2-c7be-17e5-f0c6-c84e12f1fe37.jpeg)

## 7種類の結合度の詳細

### 1 : 内部結合(Content coupling)
あるクラスが別のクラスの内部構造や状態に直接依存する結合。
#### 内部結合しているコード
“` PHP
class User
{
public $is_admin = false;
}

class Admin
{
public function promote(User $user)
{
$user->is_admin = tr

元記事を表示

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

# 初めに
前回は[こちら](https://qiita.com/nnhkrnk/items/2ab36bd082385f62cd61)の記事で、Flowにおける認証処理(Authentication)について書きました。
今回はFlowで認可処理(Authorization)を実装してみましょう。

# 注意
:::note warn
この記事は[前回の記事](https://qiita.com/nnhkrnk/items/2ab36bd082385f62cd61)の続きになっています。
まだご覧になってない方はそちらからご覧ください。
:::

# 実際に作ってみる
早速作ってみましょう。
前回はログインしたらTOP画面に遷移するという処理を実装しましたが、ログインしてなくても遷移が可能になっていました。
今回は、**TOP画面をログイン状態でないと開けない**という設定を追加してみます。

プロジェクト構成は以下です。

“`
Packages/
├ Application/
| └ Neos.Welcome/
| ├ Classes/

元記事を表示

PHP ストリーム型のファイルの操作

# ストリーム型のファイルへの書き込み

参考: [fopen](https://www.php.net/manual/ja/function.fopen)
参考: [fwrite](https://www.php.net/manual/ja/function.fwrite.php)
参考: [fclose](https://www.php.net/manual/ja/function.fclose)

– `fopen`, `fwrite`, `fclose` の3つセットで記述する

#### `.contact.dat`ファイルを作成しておく

#### `test.php`を作成及び編集

“`php:test.php

元記事を表示

PHP ファイル操作の基本(ファイル名型) 振り返り

# テキストファイルの読み込み

#### ファイル名型 (ファイルを丸ごと操作する方法)
– PHPの標準関数 `file_get_contents`関数を使用してみる

参考: [file_get_contents](https://www.php.net/manual/ja/function.file-get-contents)

`.contact.dat`ファイルを作成及び編集 `txt`でもよい

“`dat:contact.dat
あああ
いいい
ううう
“`

`test.php`を作成及び編集

“`php:test.php

元記事を表示

[Laravel] Windowsで文字化けしないCSVのエクスポート機能を作ろうとしたら、意外と詰まった話

# はじめに
個人でシステム開発の仕事をしています。
管理画面を開発しているときに、Windowsのエクセルでも文字化けしないようなCSVインポート機能を実装しようとしたんですが、
SJIS変換してもBOMをつけてもなかなか解決できなかったので、その解決方法を備忘録として残しておこうと思います。

## 開発環境
– php 8.2
– laravel 10
– docker

# やりたいこと
header_1 | header_2 | header_2|
—— | —— | ——
body_a1 | body_a2 | body_a3|
body_b1 | body_b2 | body_b3|

上のようなCSVをエクスポートし、macでもwindowsでも文字化けせずにCSVを表示したい。

:::note info
– windowsではexcelで開くことを想定しています。
– headerはソース内で定義し、bodyはMySQLから持ってきた値です。
:::

# 試したこと
## SJIS-winに変換(うまくいかなかった)
まずは、単純にUTF-

元記事を表示

PHP(7.1.33) 学習 備忘録 – isset, is_null, empty

とある案件でPHPを触れて、学んだことを書いておく。

# 変数チェック

変数を宣言・定義しているか、NULLかなどをTRUE,FALSEで返してくれる関数を調べたのでまとめておきます。

PHPの前提として、NULLと変数宣言をしただけのものは基本的に同じです。

“`php
$defNull = NULL;
$defOnly;
“`

## is_null

https://www.php.net/manual/ja/function.is-null.php

:::note info
`is_int`や`is_string`など型ごとにチェックする関数があります。
:::

– 変数が宣言されていない
– NULLで定義されている

ならば、`True`が返ってきます。

“`mermaid
flowchart LR
s([Start])
t([True])
f([False])
d+nn{未宣言
OR
NULL}
s –> d+nn –>|Yes| t
d+nn –>|No| f
“`

ただし、未宣言の場合はおそらく*Notice*が出てくると思います。

元記事を表示

PHPで”Hello, World!”を表示させる方法を詳しく解説!初心者向けの手順とコード例あり

PHPを利用して **`「Hello, World!」`** を表示する方法について詳しく説明します。この手順は、PHPを初めて学ぶ方や、基本的な構文を確認したい方に適しています。

まず、ブラウザで **`「Hello, World!」`** を表示するためのPHPコードを紹介します。以下の手順に従ってください。



## PHPファイルを作成する

まず、テキストエディタ「VScodeなど」を開き、新しいファイルを作成します。このファイルの拡張子は **`.php`** になります。例えば、 **`hello.php`** という名前で保存します。

## PHPコードを追加する

元記事を表示

【PHP】PHPの開発環境、XAMPPの使い方

# はじめに
こんにちは! 中学2年生のWardHamamatsu67です! 今回は、プログラミング言語のPHPの開発環境であるXAMPPの使い方について説明したいと思います。
# What’s XAMPP??
XAMPPとは、先程も説明した通り、PHPの開発環境です。主にPHPのプログラムを実行するときに使います。たとえPHPのコードがきちんと書けていたとしても、XAMPPが正常に動いてなければ実行ができません。そのため、PHPをやる上で、XAMPPは必須なのです!!
# 使い方
先程、PHPをやる上でXAMPPは必須と言いましたが、XAMPPでやることは1つだけです。それはXAMPPにあるモジュールを動かすことです。やり方は、XAMPPを開いて、Actionsの下に「start」ボタンがあるのでそれを押します。しばらく待つとモジュールの色が緑色になります。そうなったら終わりです。以上!!![スクリーンショット 2024-03-27 203545.png](https://qiita-

元記事を表示

【PHP】Postリクエストを受取り、Bodyの内容を取得する

## はじめに
最近PHPをはじめました。
HTTPのPostリクエストを受取り、Bodyの内容を取得する方法が分からず調べてみました。

## 結論
下記コードで実現できました!

**Version**
PHP:5.5.3
Cake:2.5.8

“`PHP:
// POSTリクエスト以外はエラー
if (!$this->request->is(‘post’)) {
echo json_encode([“is_success” => false, “error” => “POSTリクエスト不使用”]);
return;
}

// リクエストボディの内容を取得
$json = file_get_contents(‘php://input’);
$data = json_decode($json, true);

// リクエストボディからuserIDを取得
$user_id = $data[‘user_id’];
“`

## 詳細
ChatGPTに聞きながら詳細をまとめました。

元記事を表示

【PHP】PHPで3の倍数と3がつく数の時にだけアホになるプログラム書いてみた(1から200まで)

# はじめに
こんにちは! 中学2年生のWardHamamatsu67です! 今回はプログラミング界で有名な、「世界のナベアツ」をPHPでやりたいと思います。本家は40までなのですが、今回は200までやります。
# コード
“`php
“;
} else {
echo $num.”
“;
}
}
?>
“`
結構短めに書くことができました。
# 解説
for文で$numという変数が1スタート200ゴールの範囲で1ずつ増えていく処理を書き、if文で$numを3で割ったときの余りが0になるか、$numに3がつけば、アホになり、それ以外は普通に$numの値を表示します。
# おわりに
意外と簡単にできました。「世界のナベアツ」は面白く、プログラミングの良い練習と

元記事を表示

【PHP】(多分)楽しい言語、PHP

# はじめに
こんにちは! 中学2年生のWardHamamatsu67です! 今回は、最近自分がはまっているプログラミング言語、PHPについて話していきたいと思います。
# PHPの良さ
– 難易度が**低め!!**
– 文法が独特で**楽しい!!**
– 将来性が**高い!!**
## 難易度が低め!!
まず、PHPは難易度が結構低めです。それはPythonやJavaScriptといった、初心者にお勧めとされる言語に匹敵します。”Hello, world!”の表示も、条件分岐も、変数も、繰り返し処理もPHPなら短く書くことが可能です。Web開発を極めたい方はPHPの学習もお勧めします!!
## 文法が独特で楽しい!!
PHPの文法は他と比べて独特です。例えば、”Hello, world!”を表示するとき、Pythonなどの言語ならもちろん、**print**を使います。しかし、PH

元記事を表示

OTHERカテゴリの最新記事