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

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

PHPの連想配列でUndefined indexを出さない実装:あなたはどちら派?

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

連想配列(個人的にassociation listと呼んだ方が親しみがある)を使って、該当するキーがないときにnullなどを返すようにしたい。例えば、以下のような連想配列`$arr`から`French`で検索すると、「PHP Notice: Undefined index: French」のエラーが出る。

“`php
$arr = [
‘Japanese’ => ‘こんにちは’,
‘English’ => ‘Hello’
];

echo $arr[‘Japanese’].PHP_EOL;
echo $arr[‘French’].PHP_EOL;
“`
そこでUndefined indexのエラーを出さないように、以下のコードが考えられる。`getValue1()`と`getValue2()`である。

“`php
function getValue1(&$arr, $key){
if (isset($arr[$key]))

元記事を表示

PHP7.4でEnumライクなものを実装してみた

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

PHPでもJavaのEnumのようなものを使いたい。最新のPHPでは提供されているようだが、PHP7.4にはなかったのでそれっぽいものを作ってみた。とりあえず、整数の`$ordinal`に対応する文字列を返す関数`value(int $ordinal):string`が提供できていればいいだろう。

“`php:Enum.php

元記事を表示

TryHackMe Writeup:RootMe

# はじめに
本記事はTryHackMeのWriteupです。
RoomはRootMeで、Difficulty(難易度)はEasyです。

RootMeは一般的なハッキングフローの流れに沿って、偵察行為を皮切りに発見したコンテンツから脆弱性を特定します。脆弱性特定後、攻撃手法を確立させてリバースシェルの取得及び、管理者権限(root権限)の取得等について学習します。

セキュリティの本質に関わる基礎的な部分を学習するにはうってつけのRoomだと思います。
Deploy the machineでマシンデプロイ後、以降のTaskについて解説していきます。

## Reconnaissance
はじめに偵察行為から行います。
偵察行為については以前書いた[Content Discovery Webアプリケーションに対する偵察行為](https://qiita.com/Brutus/items/6b89c9518ea90695232f)を参照。

### ポートスキャン
空いているポートを特定するためには**Nmap**を使用します。
ここでは事前に用意したシェルを介してポートスキャンを実行し

元記事を表示

PHP8.2に読み取り専用クラスが追加

## Proposal
クラスのすべてのインスタンスプロパティが読み取り専用となる。
“`php5
readonly class Foo
{
public int $bar;

public function __construct() {
$this->bar = 1;
}
}

$foo = new Foo();
$foo->bar = 2;
// Fatal Error: Uncaught Error: Cannot modify readonly property Foo::$bar

$foo->baz = 1;
// Fatal Error: Uncaught Error: Cannot create dynamic property Foo::$baz
“`

## Restrictions
型指定されていないプロパティと静的プロパティは、
読み取り専用クラスとして宣言できません。
“`php5
readonly class Foo
{
public $bar;
}
// Fatal error: Readonl

元記事を表示

PG見聞録 ~PHP編 例外処理 2~

今日は例外処理についてもう少し深堀していきたいと思います。
主に「スロー」についておさらいしていきます。

throw命令

例外というのは予め用意されたメソッドが発生させるだけではなく、自分で発生させることも出来ます。
これを「スローする」なんて言います。

“`php

元記事を表示

Laravelの自動テストでDBの汚染を避けようとした結果、DBのテーブルを全て吹き飛ばした話

# Laravelの自動テストでDBの汚染を避けようとした結果、DBのテーブルを全て吹き飛ばした話

タイトルの通りですが、自分のようにドキュメントを流し読みしてしまっただけで同じ過ちを犯してしまう人が出ないよう、また使用するライブラリのコードはきちんと読みましょうという自身への戒めを兼ねて記録します。

## 自動テスト実行時に生成されたレコードを共有開発環境のDBに残したくない

この問いに対してLaravelは有効な機能を提供してくれています。
今回の主役である **Illuminate\Foundation\Testing\RefreshDatabaseトレイト** です。

> 前のテストがその後のテストデータに影響しないように、各テストの後にデータベースをリセットできると便利です。インメモリデータベースを使っていても、トラディショナルなデータベースを使用していても、RefreshDatabaseトレイトにより、マイグレーションに最適なアプローチが取れます。テストクラスにてこのトレイトを使えば、すべてが処理されます。
https://readouble.com/laravel

元記事を表示

PHPで「お問い合わせ画面」を実装してみた

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

PHPの練習のため、お問い合わせの画面を実装してみた。画面遷移は以下の感じ。
![contact-states.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/39200/9e4058f0-8057-491d-6dd8-e4cac35dd5c3.png)
オブジェクト指向でモデルを実装する。クラス図は以下の感じ。
![contact-classes.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/39200/5d9686ab-635e-83ca-87b1-89f0ab3f97a3.png)

問い合わせのエンティティ(Contact)は、とりあえずシンプルに名前、メールアドレス、問い合わせの内容の3属性とした。setter/getterは割愛。今回は永続化していないので、エンティティ

元記事を表示

asdfでPHPやNode.jsをインストールしたかった

# はじめに

複数言語のバージョン管理ができる[asdf](https://asdf-vm.com)でPHPやNode.jsをインストールしたかったというお話。
結論、 PHPプラグインのAppleシリコン対応がまだ不十分なのでHomebrewでPHPをインストールしつつ、Dockerでマルチバージョン環境を作るのが良さそう。

## 環境

Mac mini m1

# asdf

https://asdf-vm.com

“`bash
brew install asdf
echo -e “\n. $(brew –prefix asdf)/libexec/asdf.sh” >> ${ZDOTDIR:-~}/.zshrc
“`

# Node.js

“`bash
brew install gpg gawk
asdf plugin add nodejs https://github.com/asdf-vm/asdf-nodejs.git

asdf list all nodejs lts
asdf global nodejs lts
“`

で現時点で最新のLTS(16.x

元記事を表示

Re:ゼロから始めるSNS作り生活(二週間目+α)

# どんな記事?
プログラミング初心者が、イチからSNSサイトを構築する過程を記録したもの。
誰かに「勉強の状況はどう?」と訊かれたときに提示できるよう、Qiitaの記事として投稿しています。
# 前置きや前提
### 完成品のイメージ
– コンセプトは「勉強記録をポストしたり、問題を出しあったりできるSNS」
– 自分の勉強記録をポストし、閲覧できる
– 友人の勉強記録に対し、コメントやミニクイズを投稿できる
– 自分と似た目標を持つユーザーを検索し、フォローできる
– フォローしている人の勉強記録を一覧表示する「タイムライン」もある
– 当然レスポンシブデザイン(本記事では未実装)
### 制作の目的
– プログラミング技術の向上
– あわよくば友人にこのSNSを使ってもらいたい
### これまでの経験や知識
– WordPressで構築されたサイトの調整経験
(2年弱従事していたため、HTML・CSS・PHPとも基礎はわかっていたつもり)
(通信をはじめバックグラウンドの知識はゼロ)
– 大昔にイチからサイトを構築した経験
(HTMLしか使用していない化石のようなサイトのみ)

元記事を表示

Laravel のトランザクションはネストできる

# 環境

動作させている環境は以下です。

Dockerで動かしています。

– PHP: PHP 7.2.28 (cli) (built: Feb 26 2020 13:38:14) ( NTS )
– Laravel: Laravel Framework 6.20.34
– MySQL: mysql Ver 14.14 Distrib 5.7.29, for Linux (x86_64) using EditLine wrapper

# 準備

Laravelアプリケーション上でトランザクションをネストしたときの挙動を検証するにあたって2つ準備をします。

1つ目がテーブルを作ることです。
2つ目がコマンドを作ることです。

今回はテーブルにデータを登録するコマンドを実行して検証していきます。コマンドである必要はありませんが、コンソール上で実行できれば楽なのでこれでいきます。

## テーブル

2つのテーブルを用いて挙動を確認します。
`id`カラムだけを持つテーブル(`table_a`, `table_b`)を以下のように用意します。

“`
mysql> desc ta

元記事を表示

autoloadの仕組み 知っていますか?

## psr-4

.jsonファイルの、psr-4でautoloadは設定されている。

下の例の、 “app/”の部分で、autoloadを掛ける場所を指定する。

“`
{
“autoload”: {
“psr-4”: {
“App\\” : “app/”
}
},
“require”: {
“nesbot/carbon”: “^2.29”
}
}
“`

その状態で、composer installをすると、venderフォルダというのが新しく生成される。

venderフォルダの中に、autoloadを動かすためのファイルが入っている。

元記事を表示

【phpコマンドでのエラー】ターミナルでの”zsh: command not found: php”を解決する方法

## はじめに
Laravelの開発環境を構築をしようと思い、phpのコマンドを叩いた際につまずいたので
同じような現象で困っている方の解決方法の一つになれば幸いです。

## 環境
・OS : macOS Monterey
・バージョン : 12.3.1

## 起きている現象
まず、PHPのライブラリ依存関係を管理する「Composer」をインストールするため
下記コマンドを入力。

“`
php -r “copy(‘https://getcomposer.org/installer’, ‘composer-setup.php’);”
“`

すると、、、

“`
zsh: command not found: php
“`

上記の内容が返ってくる。
※homebrewはインストール済みのため、一応phpのパスを確認 ↓

“`
brew –prefix php@7.4
“`
、、、
“`
/usr/○○/○○/php@7.4
“`

反応しないのかと思いきや、しっかりとパスは返却される。

## 結論
アップデートができておりませんでした。。。

元記事を表示

エンジニアが行動に出る時

シェークスピア氏は言った。転職するかしないか、それが問題だ。
(生きるか死ぬか、それが問題だ。live or die, that’s the question)

この数ヶ月、その事ばかり考える。

倒れて行く戦士達。私と同じ日に入社した同僚は先月転職を表明した。
更にその先月、最も有能なエンジニアが胃腸炎と共に退職した。
私自身も以前から企業のカジュアル面談を複数受けている。

1年前、入社した瞬間に、いかにこの会社がまずいかはすぐに分かった。
バージョン管理しない、自動テストしない、一番歴が長い先輩のIDEがdream weaver。

面接の時githubで管理してるって言ってませんでした?と聞くと、やる予定であってやっているとは言ってない、と。

## やるだけやったか
入社当日に退職を決意した訳だが、、否定するだけなら簡単である。
どんな環境でも一定、学ぶべき事柄、自身が活躍するスポットはあるはずで。

自分にできる事は何か。何をすべきか。
現状の分析から入った。

会社は受託メインで売上ているが、自社サービスが少数あり、全売上の2割を占める。社長はどんどん新サービスをリリー

元記事を表示

PG見聞録 ~PHP編 名前競合~

今日はトレイトやクラスの名前が競合してしまったときの挙動についておさらいしていきます。

名前競合時の挙動

クラスやトレイトの中にある関数が被ってしまったときは優先順位がつけられたり、エラーになったりします。

“`php

元記事を表示

【Laravel】画面遷移でエラー発生時、同画面にモーダル表示するようにhandler周りを拡張

Laravel6.x以降であれば使える手法かと思います。(6.x未満では未確認)

# やりたいこと
画面遷移でエラーした時、モーダルにメッセージ出したい。

## 前提事項

1. 各箇所毎にモーダルのタイトルやメッセージは違ってくる。
2. モーダルを表示する手法は既存ソース内で確立済み。しかし、ヒジョーに微妙な気がする。

※現状の手法
 各コントローラーやサービスにて、モーダル用のタイトルやメッセージを設定。
 ↓
 **各箇所でリダイレクト実施。 (うーんなんだかなぁ。。)**
 ↓
 各ビューで出力。

# 結論(最終的な落とし所)
* モーダル用のExceptionクラスを作成
* 例外処理も同クラスに定義 (Handlerクラスではなく)
* **コントローラーやサービスは同Exceptionにモーダル情報を設定して投げるだけ (スッキリ!)**
* ビューは渡されてきた情報を元にモーダル描画

それでは、具体的な内容に入っていきます。

# まず考えたこと、、
画面毎にモーダルのタイトルやメッセージは違うから、
やっぱりコントローラーでやるしかないかなぁ~

元記事を表示

JS 公開鍵 暗号化 => PHP 秘密鍵 複合

メモ。
[ここ](https://qiita.com/buntafujikawa/items/51de0847232a117b272a)を参考にしたけど、自分の環境だとcrypto モジュールがうまく設定できなかったので、JSEncrypt を使う。

“`shell
# JSEncryptを入れる
$ yarn add jsencrypt
“`

“`JavaScript:JavaScript
import JSEncrypt from ‘jsencrypt’;
import axios from ‘axios ‘;

// 公開鍵取得
const publicKey = await(async()=>{
const res = await axios.get(‘/crypt/publickey’);
return res.data || “”;
})();

// 暗号化
var encrypt = new JSEncrypt();
encrypt.setPublicKey(publicKey);
var encrypted = encrypt.encrypt(“ho

元記事を表示

Dockerで構築したLaravelアプリでStorageをホスト上の外付けHDDに紐付けした話

**ローカルでのみ開発するのにどうしてもファイルストレージを外付けHDDにしたかった。**

クラウドストレージサービスを使っても良かったのですが、 不要なHDDがあったのでそちらに画像などを保存したかった。
※月額料金が掛かるのが嫌だっただけ(笑)

**環境**
・OS :MacOs BigSur(M1 mac)
・Laravel(Docker)

XAMPでLaravel構築していればそのまま紐付けられたと思いますが、すでにDockerで構築してあったので、
なんとかMacに外付けしているHDDで出来ないかと思い試行錯誤しました。
あまり同じ事している人いませんよね。。

結果、、簡単でした。

コンテナイメージをビルドする時に,
docker-compose.ymlファイルにVolumesに紐付けるだけでした。
そりゃそうですね(笑)

**docker-compose.yml**
“`
services:
app:
build:
context: .
dockerfile: ./docker/php/Dockerfile

元記事を表示

Laravel 国籍を登録してそれ用のページを作る

Laravel.6においてレシピアプリを開発中です。

国別のユーザーごとのレシピを表示する機能を実装し、苦戦したので自分用にメモします。

前提として、usersにnational_idというカラムを持ちユーザー登録時にプルダウンで国籍が登録されるようにしています。

### ルーティングを定義
“`web.php
Route::get(‘/recipes/{country_key}’,’RecipeController@country’)->name(‘recipes.country’);
“`

### Viewにプルダウンを表示
“`recipes/index.php

@csrf

OTHERカテゴリの最新記事