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

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

laravel Unitテスト 作成したテストクラスでsetUp関数をオーバーライドしたらエラーが出た

# 概要

– laravelのUnitテストにて作成した独自のクラスにsetUp関数を使って継承元の関数をオーバーライドしようとしたときにエラーが出たのでまとめる。

# エラーまでの経緯

– 下記のように独自のテストクラスにsetUp()関数を記載した。(継承元のsetUp()も実行しないと行けない。)

“`FooTest.php
public function setUp()
{
parent::setUp();

// その他のテスト実行時の初期処理
}
“`

# エラー

“`
当該テストクラス名::setUp() must be compatible with テスト継承元クラス名::setUp(): void in 当該テストクラス名
“`

# 解決までの経緯

– エラーを見るとどうやら当該テストクラスで定義しているsetUp()関数は返却値をタイプヒンティングで指定して上げる必要があるようだ。(継承元の関数をオーバーライドしたいなら戻り値の宣言も含めて同じ記載をしないと行けないっぽ

元記事を表示

PHP マジックメソッド __invoke()について

# 概要

– PHPのマジックメソッドの一つである`__invoke()`について簡単にまとめてみる。

# マジックメソッド

– マジックメソッドが何たるかについては公式ドキュメントに記載されている。
– [https://www.php.net/manual/ja/language.oop5.magic.php](https://www.php.net/manual/ja/language.oop5.magic.php)
– ようは「特定の動作をさせたときに実行する関数」みたいな感じっぽい。(違ったらすみません。)

# `__invoke()`

– このマジックメソッドは「インスタンス変数を関数のように呼び出したときに実行される関数」らしい。
– 下記を実行すると`xxx`が出力される。

“`php

元記事を表示

Laravel開発時エラー、やったこと覚えている範囲で・・・

# 学習を進めた時のエラー解除?やってみたこと(自分用メモ)
動画を見ながらLaravel開発環境構築をしていましたけど、なかなかうまくはいきませんでした。
## Laravelを立ち上げるときに発生したエラー
まずはどこに立ち上げたのかわからなくなってしまったけれど、userの直下ディレクトリ内にできたらしい。
そのtodoを引っ張ってきてvscode内に展開、npmもアップデートしないといけないようなエラーが出たけど、なんかよくわからないけど解消されたらしい。
Laravel自体のバージョンは最新のものらしい(todo)の名前で立ち上げたものは・・・
`$ php artisan serve`
このコマンドを打つと、あら不思議!
Localhost:8000番で開発サーバーが立ち上がってくれる!
composer.lockやcomposer.jsonに書いてあるものとバッティングしていてlarval/uiのDLがやりにくかったけれど、version指定を外したら最新のUIが実装できました。

`$ composer require laravel/ui “^1.2″` ←クォーテー

元記事を表示

ここがつらい! Slack API

– 半分ネタ記事です。あんまり真面目に書きません。
– 項目数が多いので,気力でなんとか書きます。分類は諦めます。
– 他にもある!っていうのがあったらコメント欄で教えて下さい。気が向いたら追記します。

## 公式の TypeScript 型定義がもはや型定義を諦めている

`辛い度: ★★★★★`

辛い中でもこれはかなり上位に来るやつ。

https://github.com/slackapi/slack-api-specs

こちらに OpenAPI 形式で仕様が定義されていて,

– https://github.com/slackapi/node-slack-sdk/tree/main/packages/web-api/types

ここに仕様に基づいて TypeScript の型定義ファイルが吐かれるようになっています。 Git 管理されていないので,実際のリリースを見てみましょう。

– https://unpkg.com/@slack/web-api@6.7.2/dist/response/ReactionsGetResponse.d.ts

元記事を表示

Laravel 8.xで天気予報のWeb APIを作成 (2)

Laravel 8.83.11で天気予報のWeb APIを作成しました。ソースコードは下記のgithubリポジトリで公開しています。

https://github.com/fukagai-takuya/weather-forecast

– 天気予報データは他のサイトからWeb APIで取得してデータベースに格納するようにしています。Laravelを使ってWeb APIを用意した簡単なプログラムになります。

– この投稿にはプログラムを作成した際に実行したコマンドとソースコードの内容を記載しました。プログラムの概要と動作確認方法は[こちらの投稿](https://qiita.com/fukagai-takuya/items/9049712734cc1fdb04e9)に記載しました。

– 今回は、Routing、Controllers、Eventsの部分のコードを作成したときに使用したコマンドとコードの内容についてまとめました。残りは別の投稿に記載する予定です。

– 日時は全てUTCです。

# 1. [Installation](https://laravel.com/docs

元記事を表示

MySQL テーブル構造の md を作成

## マイグレーションで積み上げたテーブル構造を可視化する

Laravel でデータ構造を管理するのに困るのは、マイグレーションを積み上げすぎて、現在の構造が把握できないこと。

ということで、次のコマンドでマークダウンファイルが作成できるように artisan コマンドを書いてみた。

“`
php artisan schema:md
“`

– `database/schema/mysql-schema.md` を出力する。
– mysqldump が使える前提。
– 解析に必要な dump ファイルはテンポラリに作成して破棄しているので、`mysql-schema.dump` とは独立。

実行すると次のようなマークダウンファイルを作成する。開発中はソースコードと一緒に確認できる。納品時にはマークダウンを pdf や xlsx にするとか。
マイグレーションでは、カラムはもちろんテーブルにもコメント付けに徹底しておく。

“`md
# Table Definition of `example`
## companies (会社)
|COLUMN

元記事を表示

Eloquent 前提の MySQL データベース設計

#### 大前提

– **Laravel の Eloquent リレーションを前提** とする。
– 原則として **DB ビルダー は使わない**。つまり、SQL クエリ(が想像できるコード)は書かない。
– たとえ DB ビルダーを使ったとしても **as でテーブル名の省略しない**(**可読性優先**)。
– Eloquent で **Join 禁止**。子テーブルの値を参照するならリレーション、検索判定するなら hasWhere がある。
– 原則として select も書かない。
– select で絞るほど多数のカラムがあようなら、「横持ち」から「縦持ち」に設計しなおすべき。

ゆえに、生の SQL クエリ(DBビルダー含む)を書く前提である巷のベストプラクティスとは、真っ向から反する命名規則となる。

## Eloquent 前提の命名規則
#### テーブル、カラム共通
– テーブル名、カラム名ともに小文字でスネークケース(foo_bar)
– ローマ字禁止。英語でがんばる。
– 省略語は禁止。
#### テーブル名
– テーブルは原則複数形。
– 複数単語

元記事を表示

laravel9 Password系のバリデーション

# 概要

– laravel9からのバリデーションで、パスワード文字列の複雑さチェックを管理するものが追加されたので簡単にまとめてみる。
– ちなみに細かい内容は公式にわかりやすく記載されているのでそちらを参照いただきたい。
– [パスワードのバリデーション](https://readouble.com/laravel/9.x/ja/validation.html#rule-current-password)

# 記載方法

– パスワードバリデーションでは下記の内容がチェック可能である。
– 最低文字数 `Password::min(最低文字数)`
– 最低1つの文字が必要 `Password::min(最低文字数)->letters()`
– 最低1つの数字が必要 `Password::min(最低文字数)->numbers()`
– 最低1つの記号が必要 `Password::min(最低文字数)->symbols()`
– 最低大文字小文字が1文字ずつ必要 `Password::min(最低文字数)->mixedCase()`

元記事を表示

laravel バリデーション sometimes

# 概要

– キーが送信された場合のみ設定されているバリデーションチェックを行う`sometimes`についてまとめる。

# 記載方法

– このバリデーションは若干filledと似ている。
– [laravel バリデーション filled](https://qiita.com/miriwo/items/1223bb644fe65b5da5dc)
– しかし`filled`は「キーが送られた場合、空ではないこと」をバリデートしている。
– 今回の`someimes`は「キーが送られた場合、その他の設定されているバリデーションチェックを行う」というルールである。
– キーが有るときだけ 「`filled`は空でないことだけのチェックを実施」「`sometimes`は空でないことを含むその他のチェックを実施する事ができる(その他のバリデーション設定次第)」という違いのようだ。
– 下記のように記載する。(content_1のキーが送られた場合「’required’, ‘integer’」のチェックが行われる。)

“`formRequest.php
/**

元記事を表示

laravel バリデーション filled

# 概要

– キーが送られた場合、空ではないことをバリデートする`filled`についてまとめる。

# 記載方法

– このバリデーションルールは「キーが送られている」 & 「値が空」の場合弾く。
– 逆に「キーが送られている」 & 「値が入っている」と「キーが送られていないとき」は特にエラーを出さない。
– なので、更新系の処理などの不特定の「不特定数のキーが送られてくるが、送られたキーの必須は許したくない」ときに使える。
– 下記のように設定する。(content_1キーが送られたとき値が空ではないことをチェック)

“`formRequest.php
/**
* Get the validation rules that apply to the request.
*
* @return array
*/
public function rules()
{
return [
‘content_1’ => [‘filled’],
];
}

元記事を表示

laravel バリデーション rangx

# 概要

– POSTされた値の範囲をバリデートするバリデーションルール`rangx`についてまとめる。

# 記載方法

– バリデートしたい値の範囲は正規表現を用いて定義する。
– 「ハイフン無し郵便番号を文字列で受け取りたい。しかし数字だけに限定したい。。」場合などに使えそう。
– 下記のように記載する。
– 「文字列OK、ただし0~9までの数字のみ」のルールを記載する。(`stringバリデーションルールと組み合わせているがrangx`だけでも使える)

“`formRequest.php
/**
* Get the validation rules that apply to the request.
*
* @return array
*/
public function rules()
{
return [
‘content’ => [‘string’, ‘regex:/^[0-9]+$/’],
];
}
“`

– 「文字

元記事を表示

laravel バリデーション in

# 概要

– POSTされた値が指定した値のいずれかであることをバリデートするバリデーションルール`in`をまとめる。

# 記載方法

– 下記のように記載することで`in`バリデーションルールを設定できる。
– 配列で指定する方法(POSTされた値が0 or 1であることをバリデートするルール)

“`formRequest.php
/**
* Get the validation rules that apply to the request.
*
* @return array
*/
public function rules()
{
return [
‘content’ => [‘in:0,1’],
];
}
“`

– 配列で指定する方法(POSTされた値がint型の0 or int型の1であることをバリデートするルール)

“`formRequest.php
/**
* Get the val

元記事を表示

Laravel 8.xで天気予報のWeb APIを作成

Laravel 8.83.11で天気予報のWeb APIを作成しました。ソースコードは下記のgithubリポジトリで公開しています。

https://github.com/fukagai-takuya/weather-forecast

* 天気予報データは他のサイトからWeb APIで取得してデータベースに格納するようにしています。Laravelを使ってWeb APIを用意した簡単なプログラムになります。
* この投稿ではプログラムの概要と動作確認方法のみについて記載しています。プログラムを作成した際に実行したコマンドとプログラムの内容については別の投稿に記載する予定です。(プログラムの作成方法と内容については[こちらのブログ](https://www.leafwindow.com/create-a-weather-forecast-web-api-with-laravel-2/)にすでに記載しております。)

# 1. 作成したプログラムの概要

1.1. Web APIで日時を指定した問い合わせがあったら、その日時のニューヨーク、ロンドン、パリ、ベルリン、東京の5都市の天気デー

元記事を表示

Chapter3 サービスとビューコンポーザ

# サービスとビューコンポーザ

## ビューコンポーザーとは

コントローラから呼び出されたビューテンプレートをレンダリングする際に、
自動的に実行される処理を用意するための部品。

## サービスとサービスプロバイダ

**サービス**:機能強化のための仕組み。
**サービスコンテナ**:DIと呼ばれる機能を使ったシステムでLarabelの仕組み。

**DI(Dependency Injection)**:依存性注入

**サービスプロバイダ**:
サービスを登録するために用意されている部品で、
必要に応じて特定のサービスを組み込んで使えるようにするためのもの。

## サービスプロバイダの基本形

サービスプロバイダは`ServiceProvider`というクラスを継承して作成されます。

“`ServiceProvider.php

元記事を表示

【PHP基礎⑧】if構文-3

[問題]
整数値を入力させ、値が正であればpositiveと表示するプログラムを作成しなさい。ただし0は正に含まないものとする。

# コード
“`php
$a = intval(fgets(STDIN));
if($a > 0){
echo ‘positive’;
}
“`

↓ 「2」と入力

# 結果
“`
positive

“`

元記事を表示

【PHP基礎⑦】if構文-2 否定の条件分岐

[問題]
整数値を入力させ、値が0ならばzero、0でない場合はnot zeroと表示するプログラムを作成しなさい。

# コード
“`php
$a = intval(fgets(STDIN));
if($a == 0){
echo ‘zero’;
}else{
echo ‘not zero’;
}
“`

↓ 「6」と入力

# 結果
“`
not zero
“`

☆否定の条件分岐
if(条件){
条件を満たす場合に行う処理;
}else{
条件を満たさない場合に行う処理;
}

元記事を表示

LaravelのPHPUnitでS3へのアップロードテスト

PHPUnitでファイルアップロードのテストを書いたのはいいけども忘れそうなので備忘録として。。

# 前提
filesistems.phpとか
.env.testingファイルなどは作成、設定済みとします。

# やりたいこと
APIでs3にファイルをアップロードして該当ファイルがあればOK、なければNGとするMiddlewareを実装したかった

# テストコード
“`
/**
* Middleware Check(OK)
* @return void
* @group upload_test
*/
public function middleware_upload_check_ok(): void
{
        //実際のs3ではなく仮のストレージを割り当てる
Storage::fake(‘s3’);
//対象ファイルがないことを確認
Storage::disk(‘s3’)->assertMissing(‘/maintenance_test/maintenance.txt’);

// ミドルウェアのチェックもしたいのでなんかしらA

元記事を表示

Windowsで開発したPHPをCentOSにデプロイしたときに起きやすいエラー

|[../](https://qiita.com/taconana/items/d382d08a83a2a67f3b6a) |
|—|

Windowsで開発したPHPをCentOS Stream 8環境にデプロイしたときに、いくつかエラーやワーニングが出ていたのでメモしておく。軽微な内容です。

## DBの接続先を切り替えておくこと

DBの接続情報が異なる場合、例えば、dbname,user,passwordが異なると、以下の感じのエラーになる。
“`
PHP Fatal error: Uncaught TypeError: Return value of common\\integration\\PersistenceBase::pdo()
must be an instance of PDO, null returned in /common/integration/PersistenceBase.php:45
“`
環境を判別して制御を切り替えるように記述しておくこと。
“`php
public static function isWindows() :

元記事を表示

CentOS Stream 8にPHP PDOのMySQLドライバをインストールする手順

|[../](https://qiita.com/taconana/items/d382d08a83a2a67f3b6a) |
|—|

CentOS Stream 8でMySQLをインストールし、PHPからアクセスを試みるが、PDOの接続で「could not find driver」のエラーが出た。
“`
could not find driver
Uncaught TypeError: Return value of PersistenceBase::pdo() must be an instance of PDO, null returned in …
“`
MySQLコンソールで接続できることは確認し、dsnやuser/passwordを間違えていないことは確認済み。
“`
// dsn = mysql:dbname=test;host=localhost;port=3306;charset=utf8
// user = root
// password = xxx

# mysql -uroot -p test
enter password: xxx
“`

元記事を表示

「オブジェクト指向による簡易版ブラックジャックゲームの実装(PHP)」のクラス図修正案

https://qiita.com/daitennn/items/19798b5a0613589ecaa8

上記記事のクラス図の誤記をコメントしようと思ったのですが、以前の指摘でブロックされてしまったようなので、記事にて修正案を書いておきます。

Qiitaのガイドラインにも書いてありますが、間違いなどをみんなで改善していきたいですね。

https://help.qiita.com/ja/articles/qiita-community-guideline

> ☝ 記事の価値はみんなで高めよう
> 読んでみて「この記事が役に立った!」と思ったら、LGTMやコメントなどでぜひその気持を伝えてください。 記事の中に間違いや追記すべき内容などがあれば、非難するのではなくみんなで改善をしていきましょう。Qiitaには編集リクエストなどの、記事をみんなで改善しあえる機能が備わっています。みんなでいまある記事の価値を高めましょう。

## クラス図修正案

* クラスの継承は親クラス側に三角形
* Card と BlackJackGame の依存の向きが逆
* 引数で渡すオブジェクトはコンポ

元記事を表示

OTHERカテゴリの最新記事