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

PHP関連のことを調べてみた2019年12月20日
目次

1年目エンジニアのコードレビューで指摘された事に対しての振り返り

# まえがき
[「株式会Ancar ~Advent Calendar 2019~」](https://adventar.org/calendars/4429) 20日目を担当させていただきます。

[中古車の個人間売買をオンラインで行うサービス](https://www.ancar.jp/)
[全国の中古車からお買い得な車を検索・比較できるサービス](https://www.ancar.jp/search/) を展開しております。

#### 軽い自己紹介
[株式会Ancar](https://ancar.co.jp/)のWebエンジニアをしている、keiと申します。
私は以前、メーカーで電気設計エンジニアとしてインフラ整備を行っていました。
主な業務内容は、フローチャートに示す処理手順にしたがって処理を行うようにシーケンス図を書いていました。
そこから現職に転職をしたので、webエンジニアとしては1年の振り返りではなく、実質5ヶ月間(8/1~)の振り返りになります。

## 当記事の内容
社内のコードレビューで先輩方からご指摘いただいた一部をまとめました。
主にLaravel、Sym

元記事を表示

MacでLaravel環境構築

MacでLaravelのローカル環境を構築したのでメモ。

## 1.phpをインストール
“`
brew install php@7.2

export PATH=”$(brew –prefix php@7.2)/bin:$PATH”
“`

## 2.composerをインストール

・ターミナルより以下を実行

“`
brew install homebrew/core/composer

Updating Homebrew…
==> Downloading https://getcomposer.org/download/1.8.5/composer.phar
:
“`
PHPも勝手にインストールされる?

## 3.larevelをインストールする
“`
brew install homebrew/core/composer

Updating Homebrew…
==> Downloading https://getcomposer.org/download/1.8.5/composer.phar
:
“`

## 4.composerのパスを通す
.

元記事を表示

Symfony4.4から導入されたNotificationEmailが気になったのでさわってみた

[Symfony Advent Calendar 2019](https://qiita.com/advent-calendar/2019/symfony) 20日目の記事です。
Symfony4.4から導入された[NotificationEmail](https://symfony.com/blog/new-in-symfony-4-4-notification-emails)。『NotificationなEmailとは?』となったので、実際に触ってみました。

## NotificationEmailとは
NotificationEmailはSymfonyのメールデータ生成クラスのひとつです。TemplateEmailの子クラスで、基本的にはTemplateEmailクラスと同じ使い方です。TemplateMailと大きく違うところは、テンプレートファイルを指定しなくて良いことと、themeというプロパティができたこと、markdown()というメソッドが追加されていることです。

テンプレートファイルはデフォルト定義されており、“` vendor/symfony/twig-br

元記事を表示

【Laravel初学者向け】頻出キーワードの語彙帳

フレームワークを勉強しようとした時に理解が進まなくなる瞬間があります、それは訳の分からない単語が出た時。
なのでこの記事では、単語の意味が解らない/理解が深くない単語が出た時に備えてそれなりに頻出されるキーワードを解説/紹介していこうと思います。

**なおこの記事は、辞典並みの正確性より、理解を深める事を優先にした作りにしています。**
また、似通った概念は「/」で1項目に括り、同時解説をする事で情報をまとめています。

#フレームワーク/ライブラリ

フレームワークもライブラリも、システム構築をする為の機能を提供してくれるものです。

では逆に、フレームワークとライブラリの違いはなんでしょうか?
フレームワークは「安全性、メンテナンス性、セキュリティ、拡張性」と言った基本的な機能を使うだけで半自動的に組み込んでくれます。
逆に、ライブラリは便利な機能がただ提供されるだけです。

Laravelフレームワークは、拡張性やセキュリティやメンテナンス性などを半自動的に提供してくれるものだと言えますね。

#MVC/Model/View/Controller

Model/View/Co

元記事を表示

SQLSTATE[HY000]: General error: 1364 Field **** doesn’t have a default value

# MySQLのフィールドにDefaultが設定されていない場合のエラー

サーバー移行が終わって、さてちょっと検証するか、と思ったら以下のエラーが。。

“`
SQLSTATE[HY000]: General error: 1364 Field **** doesn’t have a default value
“`
****にはフィールド名が入っています。

どうやら、データベースに登録しようとしたけれど、****のフィールドに何も入れてないからエラーになったよ、ということらしいです。

しかしおかしなことに、移行前のサーバーでは起きなかったんですよね。。

と思って調べたら、

### MySQLのバージョンによって動作が変わったみたいです。

#### 旧サーバーは以下

“`
# mysql –version
mysql Ver 15.1 Distrib 5.5.60-MariaDB, for Linux (x86_64) using readline 5.1
“`

まあ正確にはMariaDBですが。。

#### 新サーバーは以下

“`
# my

元記事を表示

Laravelプロジェクトのテスト変遷

## 概要

この記事は[DMMグループ Advent Calendar 2019](https://qiita.com/advent-calendar/2019/dmm) 20日目の記事です

DMM.comでサーバサイドエンジニアをやっている[juve534](https://qiita.com/juve_534)です。
現在は配信基盤のリプレイスプロジェクトにて、PHP×Laravelを使ったAPI開発やAWSを使ったインフラ構築を行っています。

今回は、自分たちのAPI開発における、テストコードの変遷を紹介したいと思います。

## 内容

### バージョン1
プロジェクトを始めた当初は、ServiceクラスやRepositoryのテストはインスタンスを `new` して、テストを書いていました。
コンストラクタインジェクションを使っているので、インジェクションするクラスはMockeryを使い、下記のように書いていました。

“`php

class HogeTest extend TestCase
{
public function testHoge($id)

元記事を表示

【 Eagerロード】コメントと、コメントに対する返信について、それぞれユーザー名を取得したい

#【 Eagerロード 】コメント&コメントに対する返信について、それぞれユーザー名を別テーブルから取得したい

2019年11月から、[Laravel歴数ヶ月の初心者が投稿型ナレッジベースのコミュニティサイトを作る](https://qiita.com/AkiYanagimoto/items/216ea9549e758342baab “投稿型ナレッジベースのコミュニティサイトを作る”)というチャレンジ中。作りたいアプリケーション→機能を因数分解→ググる→先人の轍をたどる(写経する)→ぬかるみにはまる→エラー解消の神を探す→解決を繰り返す日々( ·ㅂ·)و 。備忘録として、Qiitaに投稿しています。

##今回はハマったポイントを共有

投稿に対し、コメントがつけられ、さらにそのコメントに対して返信ができるような機能を実装しようとしていた時のこと。

一つの投稿に紐づいている**コメントとそれに対する返信を全て取得**し、viewファイルへ渡してあげたい。その際、**コメントしたユーザー**と**返信したユーザーについて、それぞれ名前をusers_tableから引っ張ってきたい**と

元記事を表示

PHPの便利なモックオブジェクトフレームワーク「Mockery」のケーススタディ

# はじめに

Mockeryのケーススタディをつらつらと書いていきます。
こういうケースでは、このようにコードを書いたら良さげ というように書いていきます。
[日本語で書かれてるドキュメント](https://readouble.com/mockery/1.0/ja/index.html)があります。感謝しかない。

# ケーススタディ

## クラスAのテストをしたいけど、クラスAはクラスBに依存してて、クラスBの影響を受けたくない

よくあるパターンですね。
クラスAはクラスBに依存している。(クラスAはクラスBが無いと動かない)
クラスAの単体テストを書きたいので、クラスBがうまく動いてなくてもクラスAのテストに影響を与えたくない。

### サンプルコード

“`php
class A
{
private $classB;

public function __construct(B $classB)
{
$this->classB = $classB;
}

/**
* foobarを取得する
*

元記事を表示

Laravel で Rails の抽象 ActiveModel みたいなやつが欲しくなった

# TL;DR

車輪の再発明してしまったのでソースコードの墓場にする記事

# 内容

データベースを使わないけど, `app/Services` 配下に置くような外部 API サービスのレスポンスエンティティを Eloquent ライクに使いたいニーズがあった。

最初 Eloquent Model を継承することも考えたが,意味のないメソッドがごちゃごちゃ入ってくるのが鬱陶しいので

– `HasAttributes`
– `HidesAttributes`
– `GuardsAttributes`

の3つのトレイトをベースに,足りないものや動作修正の必要があるものを適宜ケアして,最小限の記述で作ってみたのでここにぶん投げます。IDE でチェックしながらメソッド埋めやったのでエラーとかは起こらないはず…

“`php

元記事を表示

phpのenctype= multipart/form-data での文字化け

画像を載せるのに
formにenctype= multipart/form-dataを追加したところ
他の文字が文字化けしてしまいます。
print_r(mb_get_info());で確認したところ

“`
Array (
[internal_encoding] => UTF-8
[http_output] => UTF-8
[http_output_conv_mimetypes] => ^(text/|application/xhtml\+xml)
[func_overload] => 0
[func_overload_list] => no overload
[mail_charset] => ISO-2022-JP
[mail_header_encoding] => BASE64
[mail_body_encoding] => 7bit
[illegal_chars] => 0
[encoding_translation] => On
[language] => Japanese
[detect_order] =>
Array (
[0] => AS

元記事を表示

LaravelにSCSSの導入方法

### 前提
* Laravelのプロジェクトは作られている
* Laravelのバージョンは6.2を使用している

### 手順

1. Laravelプロジェクト配下で`npm install`のコマンドを実行する

2. sassメソッドでSassをCSSへコンパイルします
* プロジェクト配下のwebpack.mix.jsに確認をする

“`javascript:webpack.mix.js
mix.js(‘resources/js/app.js’, ‘public/js’)
.sass(‘resources/sass/app.scss’, ‘public/css’);
“`

この一行でwebpackがresources/sass/app.scssファイルをpublic/css/app.cssにコンパイルしてくれる

3.`npm run dev`でコンパイルする。

* npm run watchコマンドだと、app.scssファイルに変更が加わると自動でコンパイルしてくれるから便利!

4.app.cssを読み込む

`【Laravel】イベントとリスナーの関係について整理する

Laravelには、イベントとリスナーという機能があります。

[Laravelの公式サイト](https://readouble.com/laravel/5.5/ja/events.html?header=%25E3%2582%25A4%25E3%2583%2599%25E3%2583%25B3%25E3%2583%2588%25E3%2583%25AA%25E3%2582%25B9%25E3%2583%258A%25E3%2581%25AE%25E3%2582%25AD%25E3%2583%25A5%25E3%2583%25BC%25E6%258A%2595%25E5%2585%25A5)には、イベントとリスナーの作成方法は書かれているものの、イベントとはなにか、リスナーとは何かについては書かれていないようです。

エンジニアとして基礎中の基礎だから教えるまでもないということなのでしょうか。
残念ながら僕はその基礎ができていないようなのでイベントとリスナーについて調べてみました。

## イベントとリスナーの関係性

[https://www.ritolab.com/entry/3

元記事を表示

参照渡しでのエラー「Only variables should be passed by reference」について

最近コード書いてたら出くわしたエラーに関して忘備録として残しておきます。
間違えてる箇所がありましたら優しくご指摘お願いします。

「Only variables should be passed by reference」
ざっくりというと「参照渡しは変数しか使えませんよ〜」っていうエラーです。

下のコードのように、storeContactInfoの引数の中に直接「$id = null」を入れていたのですが、
このやり方ではダメっぽいです。

“`
foreach ($infoList as $info)
{
// 登録処理
$this->storeContactInfo($name, $id = null);
}

private function saveContactInfo(string $name, ?int &$id)
{
 (省略)
// DBに登録
$contact->save();
}
“`

そのため、一旦変数に入れてあげて、その変数を引数で使うようにしてあげたら無事に解決しました。

“`
foreach ($infoList as $

元記事を表示

CakePHP3をはじめて触ったときに読んだものをまとめておく

このエントリは、 [コネヒト Advent Calendar 2019](https://qiita.com/advent-calendar/2019/connehito) の19日目のエントリです。

# はじめに

今年7月にコネヒトに入社しまして、5ヶ月ほど経過しました [@takoba](https://twitter.com/takoba_) です。

コネヒトではサーバーサイドの主要言語としてPHPを採用しており、その上で採用しているアプリケーションフレームワークは [CakePHP](https://cakephp.org/jp) です。一方でぼくは、PHPの経験こそあれど入社するまでCakePHPを触ったことがありませんでした。

先日、同じような書き出しで [所感エントリ](http://takoba.hatenablog.com/entry/feeling-cakephp3) を書いたのですが、今回はCakePHPにはじめて触った際に、理解を進めたりするために読んだものをご紹介しようと思います。

# 前提

## 筆者のおおよそのスペック

– PHPは8年以

元記事を表示

composer経由でGuzzleをインストールしたらメモリエラーになったときの対処法

Guzzle https://github.com/guzzle/guzzle
をインストールしようとしたら以下のようなエラーが出た。

“`bash
Installation failed, reverting ./composer.json to its original content.
The following exception is caused by a lack of memory or swap, or not having swap configured
Check https://getcomposer.org/doc/articles/troubleshooting.md#proc-open-fork-failed-errors for details

PHP Warning: proc_open(): fork failed – Cannot allocate memory in phar:///usr/local/bin/composer/vendor/symfony/console/Application.php on line 952

Warn

元記事を表示

php7.4からついにクラスのメンバ変数に型宣言できるようになった

php7.4からクラスのプロパティは、新たに型宣言をサポートするようになりました。

遂に!って感じですね。
php7系、特に7.3など使用しているとアップデートするか悩ましいですね。
パフォーマンスの改善も結構されているみたいですし。

“`php

“`

上の例では、
“$user->id“にはintの値だけを、“$user->name“にはstringの値だけを代入できるように強制します。

[PHP 7.3.x から PHP 7.4.x への移行](https://www.php.net/manual/ja/migration74.new-features.php)

元記事を表示

macOS 10.15 Catalina 上で phpenv を使って PHP 5.6 を build するのにものすごく苦労した話

## はじめに

この記事は [GMOペパボ Advent Calendar 2019](https://qiita.com/advent-calendar/2019/pepabo) 19日目の記事です。

新しく入ったメンバーが macOS 10.15 Catalina 上で PHP 5.6 を build しようとしてハマっていたのを、いろいろ試行錯誤してなんとか解決した(というか回避した)ので、その話を書こうと思います。

## Mojave + XCode 10 から /usr/include がつくられなくなった

この話は、macOS 10.15 Catalina から始まった話ではなく、macOS 10.14 Mojave の仕様変更がそもそもの発端になっています。

どのような仕様変更があったかというと、Mojave + XCode 10 から `/usr/include` が作られなくなりました。 (`/usr/lib` は今まで通りあります)

じゃあ、ヘッダーファイルはどこにあるんだ?ということですが、次の場所にインストールされています。

– /Library/

元記事を表示

PHP7.4対応版Laradockを、ビルドしただけの話(2019/12/17時点)

この内容は2019/12/17時点の話です。
あなたがこの記事をご覧になっているころには、LaraDockが対策済みになっているかもしれません。
(きっとこの記事を書いている最中にでも修正されているに違いない。)

# 始めに
本記事はDocker ComposeのプロジェクトであるLaradockのPHP7.4対応版の、以下のサービスを動作させることを目的としています。

1. workspace
2. nginx
3. php-fpm
4. php-worker
5. mysql

他のコンテナの動作については言及しません。

# 各コンテナをビルドする際に変更したファイルと変更箇所
## 1. mysql/my.cnf
MySQL8を使いたいのでデフォルトに認証方式を変更する。

“`text:mysql/my.cnfの最終行に追記
+ default_authentication_plugin=mysql_native_password
“`

## 2. php-fpm/Dockerfile
–with-libzipオプションがなくなったから削除。

“`docker

元記事を表示

あの日見た言語の名前を僕はまだ知らない。~XAMPPでローカルDB(初歩)~

#初カキコ・・・ども・・・
俺みたいな専1でいきなりPHP触る、腐れ野郎他に、いますかって・・・・・・いるでしょう。

なぜ僕がPHPをやることになったのか、聞かれてはぐらかしていましたが、恥ずかしさを捨て去り此処に記します。
※前置きが長くなります。

#過去編
当時、僕は小学生でした。
毎日niconicoをニコニコしながら見ていた10年前のある時、ふと目に留まった動画がありました。それは・・・

**「絶対バグらないR〇G制作勉強会」**

当時、小学生高学年だった僕は「ウヒョー、ゲームだー」と飛びつきました。
長々と淡々に作り上げた、今は亡き制作したゲームの数々は古いPCと一緒に封印されました。

##~10年後~

実際にプログラミングでゲームを制作したことを覚えているものの、一体どうやって作っていたのか、なんの言語を使っていたのか。全て忘れてしまった僕「確か・・・HPS・・・?SPH・・・?PHP・・・?なら触ったことあるわいな・・・」等とコークハイを飲みながら友人と話した訳ですよ。

冬も訪れ寒くなってきたこの時期。私はPHPという2種3文字を見て、「へ、チョロいぜ!!」

元記事を表示

PHPStanによる静的解析をLaravelアプリケーションに導入するためにやったこと(レベル1編)

この記事は[Laravel #2 Advent Calendar 2019](https://qiita.com/advent-calendar/2019/laravel-2)の19日目です。
そして去年のアドベントカレンダーの記事の続きです。

[PHPStanによる静的解析をLaravelアプリケーションに導入するためにやったこと](https://qiita.com/ngmy/items/1a8ef21c76d74c1d4dfe)

—-

## はじめに

弊社サービス「リネット[^1]」のLaravelアプリケーションのPHPStanをレベル1に上げました。
そのためにやったことについて書きます。

[^1]: 「[宅配クリーニングの『リネット』](https://www.lenet.jp/)」「[クリーニング×保管の『リネット保管](https://www.lenet-hokan.jp/)」「[布団クリーニングの『ふとんリネット』](https://www.futonlenet.jp/)」「[靴クリーニングの『くつリネット』](https://www.kutsulene

元記事を表示

OTHERカテゴリの最新記事