PHP関連のことを調べてみた2019年10月30日

PHP関連のことを調べてみた2019年10月30日

PHPでCSVの読み書き

# メモ
これまでPHPでCSVを読み書きすることが何度かあったので、
なんとなくライブラリ化して置いといたもののメモです。

fgetcsv(でしたっけ?)は便利ですが、これだけだとその後に配列まわしてガチャガチャしないといけないのがめんどくさいです。
ので、オブジェクトに変換するところと、1レコードずつ処理する場合forとか書かないようにとラップしたものです。

# パッケージ
[mya-zaki/csvert](https://packagist.org/packages/mya-zaki/csvert)

# 使い方
## オブジェクトに変換
– 読み込むCSVの構造をRecordクラスを継承して定義。
– RecordクラスはArrayAccess, JsonSerializableをimplementsしている

“`

元記事を表示

[PHP] CentOS 8にPHPとOCI8をインストールするメモ

# はじめに

CentOS 8にPHPとPHPからOracle接続するための拡張をインストールします。

# 手順

## Oracle Instant Client をインストール

https://www.oracle.com/database/technologies/instant-client/linux-x86-64-downloads.html から RPM をダウンロードします。

BASIC パッケージと SDK パッケージです。

“`console
sudo rpm -Uvh oracle-instantclient19.3-basic-19.3.0.0.0-1.x86_64.rpm
sudo rpm -Uvh oracle-instantclient19.3-devel-19.3.0.0.0-1.x86_64.rpm
“`

クライアントバージョンをどれにするかは、Oracleのサポートドキュメントを参照してください。

https://www.oracle.com/database/technologies/faq-instant-client.html

元記事を表示

CakePHP3でdebug()関数が効かない時

# CakePHP3でdebug()関数が効かない時

メモ用。

変数やオブジェクトの中身を確認したい時、debug()関数が便利です。

“`
AppTests->find()->where([‘AppTests.id’ => $testId]);

debug($assets);
“`

上記のように記述することで、$assets変数の中を確認することができます。
ブラウザ上などで確認が可能。

## なぜか中身が見えない時

debug関数を使っても、中身が確認できない場合は、DEBUGモードがOFFになっている可能性があります。

### 「config>app.php」を確認
“`
true,
“`

上記のようにデバッグモードがtrueになっていたら問題ありません。

ただし、本番環境ではここをOFFにしてください。

元記事を表示

php7.1から「$this」の矛盾の修正がされている!?

phpでは`$this`は特別な意味を持ちますが、
php7.1から変数名として使ったり、値の代入ができないようにきちんとチェックをすように修正されているとの記述を公式のDocumentを見ていて知りました。

むしろ、当たり前のように使っていたからphp7.0まではチェックしていなかったことを知りませんでした…

以下、公式の引用

> PHP において $this は特別な変数という扱いですが、 これが他の場所で変数名として使われていたり再代入されていたりしないことを、 きちんとチェックできていませんでした。 これを修正してきちんとチェックするようになったので、 $this をユーザー定義の変数名として使ったり他の値を再代入したり、 グローバル変数にしたりすることはできなくなりました。

https://www.php.net/manual/ja/migration71.other-changes.php

元記事を表示

LaravelでAmazon MWS APIを使用し注文情報を取得する

## 事前準備
Amazon MWSのアカウント:申請してから1ヶ月くらいかかります。

## ファイルをダウンロードしてきます
Composerは使用できないので、以下より注文用のファイルをダウンロードします。
https://developer.amazonservices.jp/phpclients

## Laravelに追加
今回は `appp/Libraries`というディレクトリを追加し、
そこに上記でダウンロードした `MarketplaceWebServiceOrders` をフォルダごと追加します。

## composer.json に設定を追加
以下のようにします。

“`composer.json
“autoload”: {
“classmap”: [
“app/Libraries/Amazon/MarketplaceWebServiceOrders/Client.php”
],
// その他設定
}
“`
そして `composer dump-autoload` を実行

PHP5.6以降は以下でひっかかるので条件追加

“`php

元記事を表示

【忙しい人向け】カップ麺より早く作るDockerでLaravel開発環境構築

わずか3行。コピペするだけ。

“`shell-session
git clone git@github.com:ucan-lab/docker-laravel.git
cd docker-laravel
make create-project
“`

http://127.0.0.1:10080

## Build for Windows

https://github.com/ucan-lab/docker-laravel/wiki/Build-for-Windows

## GitHub

https://github.com/ucan-lab/docker-laravel

## 参考

– [Laravelの開発環境をDockerを使って構築する](https://qiita.com/ucan-lab/items/17c806973e69792ada99)
– [【初心者向け】20分でLaravel開発環境を爆速構築するDockerハンズオン](https://qiita.com/ucan-lab/items/56c9dc3cf2e6762672f4)

元記事を表示

【Laravel】Routingの書き方のおすすめは?

## この記事の意図

LaravelのRoutingはなかなか自由に書くことができます。なので一旦どう書くといいんだ?
的なことが僕には怒っています(いえ、起こっています)なので個人的におすすめを披露。

## RoutingのBestを探すメリット

– 探しやすい
– 可読性があがることで管理しやすくなる
– セキュリティー面で確認しやすい

## RoutingのBestを探すデメリット
– たぶんないのでレッツBest
– つかれるのかも

## 結論
いろんなパターンを書くのが面倒なのでいきなり結論。
結論についてだけ解説します。

まず、著者の著書を紹介するサイトだと想定してください。
なので著者は著書を大量に持っています。

“`PHP:web.php

元記事を表示

LaravelのwhereHasでの条件指定でクエリスコープが使える

## はじめに
Controller内での条件指定が複雑になり読みにくくなってしまったので、勢いで試してみたらできたのでそのメモです
(検証環境はver6.4)

## やってみた
前提として[公式のドキュメントあるある](https://readouble.com/laravel/6.0/ja/eloquent-relationships.html)のブログシステムで関連した多くのPostモデルを持つUserモデルでやってみる
(下記みたいなやつ)

“`php:\App\User.php
/**
* ユーザーの全ポストの取得
*/
public function posts()
{
return $this->hasMany(‘App\Post’);
}
“`

### よくあるパターン

“`php:下書きの記事(post.status=0)があるユーザーであるか
\App\User::find(1)->whereHas(‘post’, function (Builder $query) {
$query->where(‘status’, 0);
})-

元記事を表示

【Laravel】MySQL5.6→JSON形式のデータ→曖昧検索

##前提条件

テーブル:favorite_fruit

|id |data |
|—|—|
|1 |{“fruit”:[“apple”, “banana”, “orange”]} |
|2 |{“fruit”:[“plum”, “pear”]} |

検索ワード

“`
$keywords = [‘banana’, ‘melon’];
“`

MySQL5.6

##Laravel
“`
$fruit = DB::table(‘favorite_fruit’)
->where(function ($sub) use ($keywords) {
foreach ($keywords as $keyword) {
$sub->orwhere(‘favorite_fruit.data’, ‘like’, ‘%”fruit”:[%’. ‘”‘. $keyword. ‘”‘. ‘%]%’);
}
});
“`

##最後に
MySQL5.7からはJSONが普通に使える

元記事を表示

dockerでPHPの開発環境を作ってみた!

#目的
今後、仕事で生かすためにdockerで様々な開発環境を作ってみる。
その一環として、PHPの開発環境を作成する。

#作成する環境
・php:7.2
・apache
・mysql:5.7
・phpmyadmin

#手順
①docker-compose.ymlを作成
 ※コンテナの指示書
②php.iniを作成
 ※phpの設定ファイル。マウントする。
③コンテナ実行
 docker-compose up -d
④index.phpを作成
⑤webサーバにアクセス
 http://localhost:8080/
⑥phpmyadminにアクセス
 http://localhost:4040/
⑦コンテナを破棄する
 docker-compose down

#各作業抜粋

##①docker-compose.ymlを作成

“`docker-compose.yml
version: ‘3’

services:
php:
image: php:7.2-apache #apache込みphpイメージ
volumes:

元記事を表示

PHP UUID version4 を生成する

## 環境

PHP 7.3.1

## コード

uuid_v4_factory.php

“`php
$char) {
if ($char === ‘x’) {
$chars[$i] = dechex(random_int(0, 15));

元記事を表示

データを配列ではなく、オブジェクトの形で保存できるstdClassを使いましょう !!

# データを配列ではなく、オブジェクトの形で保存できるstdClassを使いましょう !!

バックエンドでAPIを作成しJson形式でフロントに渡す実装をする時、
ローカル環境とテスト環境で挙動が違ってハマった点を記載します。

## データを配列でJson形式に渡した時
“`
foreach ($payslipList as $key=>$value) {
//合計金額の計算
$total =$value->amount_tax -$rental_amount_tax;

//合計金額がマイナス時は一覧に出力しない
if($total > 0){
//API
$payslipData[$key][‘year’] = $year;
$payslipData[$key][‘month’] = $month;
$payslipData[$key][

元記事を表示

Laravelのログイン認証条件を追加しつつログイン維持条件も追加する

# やりたいこと

– Laravelの認証処理 `php artisan make:auth` を使用
– 作成される `User` テーブルに無効フラグを追加し、無効なユーザーではログインさせない

# やったこと

とりあえずググってみた結果、以下の内容がよく出てきた。

– 認証対象の項目を指定しているのは `AuthenticatesUsers` トレイトの `credentials`メソッド
– `LoginController` で `credentials` メソッドをオーバーライドして条件追加

“` php:LoginController.php

use Illuminate\Http\Request;

class LoginController extends Controller
{
protected function credentials(Request $request)
{
$arr = $request->only($this->username(), ‘password’);
$arr[‘disable’]

元記事を表示

LaravelでRedisにキャッシュしたキー一覧を取得する

## 環境
– Laravel Framework 6.0.3
– Redis 4.0.14 (非クラスタモード)

## 背景
Laravelの[Cache](https://laravel.com/docs/6.x/cache)APIではRedisを利用できますが、全てのRedisのコマンドが実装されているわけではありません。

どんなキーをキャッシュしたかキー一覧を取得したくても、[KEYSコマンド](http://redis.shibu.jp/commandreference/alldata.html#command-KEYS)が実装されていないため、GETコマンド等のように直感的に呼び出すことはできません。

“`
>>> use Illuminate\Support\Facades\Cache;
>>> Cache::put(‘key’,’value’);
=> true
>>> Cache::get(‘key’);
=> “value”
>>> Cache::keys(‘*’);
PHP Error: Call to undefined method Illumina

元記事を表示

forkしたrepositoryをcomposer requireでインストールする

## 背景

– 使用していたライブラリがアーカイブされてしまった?
– 代替パッケージへの乗り換えはコスト高くて難しい?
– いつ削除されるか分からなくて怖い?
– ライブラリをメンテナンスしたい?

## フォークしていれば、リポジトリは残る

アーカイブされたリポジトリは一定期間で削除されてしまう可能性があります。
数年後リポジトリが消えていきなり動かなくなったことを考えるとめちゃ怖い。

https://help.github.com/ja/github/administering-a-repository/deleting-a-repository

> プライベートリポジトリを削除すると、そのフォークもすべて削除されます。
> パブリックリポジトリを削除しても、そのフォークは削除されません。

フォークしとけば、上流リポジトリが消されても安心みたい!
(プライベートリポジトリに変更した上で削除されたらどうなってしまうんやろか…??)

## 手順

例として `package/foo` のパブリックリポジトリをforkして `mycompany/foo` のリポジトリを

元記事を表示

Laravelをバージョンアップしたらログインできなくなった

Laravel5.4から5.8へバージョンアップしたとき、APIログイン機能が動作しなくなりました。
バージョンアップに際して認証周りのコードを修正した覚えはなく、文字通り “なにもしてないのに動かない” みたいな状態になって結構焦ったので記録を残しておきます。
なおフロント側には触れず(詳しくないので)、バックエンド側の処理について書きます。

# 最終的に出ていたエラー
ブレークポイントを貼って一つずつ処理を追ってゆくと、最終的に **”CSRF token mismatch”** というエラーが出ていました。
なぜ5.4->5.8にバージョンアップしただけでこのエラーが出ているのかを探ってゆきます。

# APIログイン機能(コントローラー)
まずAPIログイン機能のコードはどうなっているのかというと、以下のように記述されています。この部分はバージョンアップに際して一切手を加えていない部分です。

“`php
/**
* ログインAPI
*
* @param Request $request
* @return array|\I

元記事を表示

質問です:FuelphpでURLからpublic/index.php削除し、最後にスラッシュを付けたい。。

###目的は
1.public/index.phpをURLから削除したい。
2.URL末尾にスラッシュをつけたい。
例:sample-project/test/001にアクセスすればsample-project/test/001/にリダイレクトさせたい。

###解決したのは
今のところpublic/index.phpは消すことはできました。
詳細は下記の通りです。
***sample-project/.htaccess***
“`

RewriteEngine on
RewriteRule ^(/)?$ /sample-project/test/public/index.php/$1 [L]
RewriteCond ${REQUEST_FILENAME} !-f
RewriteCond ${REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ /sample-project/test/public/index.php/$1 [L]

“`
###未

元記事を表示

[メモ] php開発環境 (Windows10, Vagrant, Docker, VSCode)

普段Web関連の開発してない個人の開発環境メモ.
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/75594/db85454c-c3e1-5198-617e-b55708fae436.png)

# 概要
Vagrantにて、VirtualBoxで centos/7 を起動して、Docker環境をインストール。
php(php:7.3-apache-stretchベース) + mysql(mariadb:10) + phpmyadminの環境を入れる。
Visual Studio Codeで、デバッグする。

# 環境
– Windows 10 64bit

# 手順

1. ホスト側の環境のセットアップ
git、Vagrant、VirtualBox、phpとvscodeをインストール

Power Shellを管理者で開いて、以下を実行

“`bash
Set-ExecutionPolicy Bypass

元記事を表示

CakePHP2.xで論理削除を実装する方法

#はじめに
今更ながらCakePHP2.xでの論理削除を実装したのでメモします。
論理削除の実装にはCakeDC/utilsのSoftDeleteBehaviorを使わせて頂きました。

今回論理削除を実装するにあたり色々調べたのですが、
githubからSoftDeleteBehavior.phpのファイルをダウンロードして、
直接プロジェクトのModel/Behaviorディレクトリに配置する方法は情報があったのですが、
composerでCakeDC/utilsをインストールして
Pluginディレクトリから使用する方法が見当たらなかったので記事にしようと思いました。

もはや需要はないかもしれない…

#環境
Windows7にて作業

PHP 7.3
CakePHP 2.10

#今回使用するプラグイン
[CakeDC/utils](https://github.com/CakeDC/utils)

#実装方法
###1.CakeDC/utilsをcomposerでインストール
プロジェクトディレクトリのルートにて以下のコマンドを実行する。

“`
composer re

元記事を表示

【Laravel】画像登録はModelでやると簡潔

## この記事の意図
Laravelは柔軟性があるフレームワークでどこでも(いいすぎかも)画像登録ができます。
その場合にどこで画像登録するのがいいの?ということがあるので、今回はModelでやることにします。

## 画像登録をModelでやるメリット
– Controllerが整理でき、可読性が上がる
– FormRequestでのvalidateが重要になるのでさらに可読性があがる
– Modelに集約しやすくなる

## サンプルコード
### User Model
“`php:User.php

元記事を表示

OTHERカテゴリの最新記事