YYPHP#44「デバッグのしかた、PHPを効率的に学ぶ方法、PHPをXAMPPとコマンドプロンプトで実行した時の動作の違い、valetとhomesteadのどちらがいい？Laravelの通知の仕組み、型宣言を書いてあるのに消さないとならなくなったとき、エンジニアの転職について」

これは2018年07月13日に開催したPHPerイベント[YYPHP#44]のイベントレポートです。

[YYPHP]は一言で「PHPerの部室」です。PHPについて、雑に、ゆるく、ワイワイ話し合う集いです。毎回お題を決めずに雑談を出発点にいろいろなことを突発的にやります。集まった人でコードリーディングをすることもあれば、一緒に開発ツールを触ってみたり、フレームワークについての情報交換をすることもあります。開催はほぼ**毎週**、高田馬場にて。

[YYPHP#44]:  https://yyphp.connpass.com/event/93168/
[YYPHP]: https://yyphp.connpass.com/
YouTubeでの配信映像はこちら-> [YYPHP #44【PHPの情報交換・ワイワイ話そう・仲間作り・ゆるめ・にぎやかめ】 - ](https://youtu.be/lwV_EMX3_ac)

![](https://qiita-image-store.s3.amazonaws.com/0/889/0051f99f-b555-6064-fcc9-3280e5543a1a.png)

## 参加者16名(うちリモート5名)

* PHP歴
    * 1年未満: 6名
    * 2年未満: 1名
    * 4年: 1名
    * 10年以上: 3名

## デバッグのしかたを知りたい

* デバッグ何を使っていますか？
    * `var_dump`
    * `dd()`
    * `print_r`
    * `\Log::debug()`
    * Laravelは`dd`
    * CakePHP3は`dump`
* xdebug
    * Eclipseでやろうとしているがうまくいかない
    * PhpStormに変えたほうがいい
* NetBeansはおすすめしない
    * メモリめっちゃくう
* vscode + xdebug
    * vscode使っている人、4名
    * vscodeは無料
    * [Check! Visual Studio Code で PHP をデバッグ実行 (Xdebug)](https://qiita.com/dz_/items/fb574782f4b4b30149a8)


## PHPを効率的に学ぶ方法

* Udemy、ドットインストールで基礎をざっと習っちゃうのがおすすめ。
    * Udemyはたまにキャンペーンやってて千数百円くらいで買える。
    * ビデオは補足説明がしっかりしてる。
    * 手を動かしながら学べる。
* yyphp-quiz で実践練習
* Smartyを効率的に学ぶ方法
* はじめはバッチ(CLIプログラム)としてPHPを組んでみたら、プログラムとしては学びやすいと感じた
    * Webアプリになると考えることが多くなるので最初大変。
    * Webサーバ、`$_SERVER`とか考えることが増える。
        * ポート空いてないとか
    * 本質的なプログラミングとして学ぶのはCLIがおすすめ
* 自分の作りたいものを見つけるといい
    * 勉強のためにやると成果があまり出ないと思う。
* 競技プログラミング 課題がいっぱいあるよ！
    * [AtCoder](https://atcoder.jp/?lang=ja)、TopCoder、CodeForces、CodingGame、yukicoder

## Picricさんからのご報告

* うごきましたありがとうございます

```
phpをxamppで実行した場合と、コマンドプロンプトで実行した時の動作の違い、みたいなものはあるのでしょうか？

今日windowsのタスクスケジューラでcmd.exeからphpを実行したいと思って試しに以下のコードを書いてみたのですが、xamppでは動作しますが、コマンドプロンプトで実行した時はエラーが出てしまいます。

---------------------------------------------------
<?php
$file = "test.txt";
$current = file_get_contents($file);
$current .= "hello\n";

file_put_contents($file, $current);

---------------------------------------------------
Warning: file_get_contents(test.txt): failed to open stream: No such file or directory

Warning: file_put_contents(test.txt): failed to open stream: Permission denied
```

* cliとapacheで実行ユーザが違っていて、パーミッションがなかった
* タスクスケジューラだと相対パスじゃないとダメだった。
    * タスクスケジューラだと実行ユーザがまた違う
* 3つ権限があんだろう
    * cli (自分)
    * apache
    * タスクスケジューラ
        *　getcwd
* ちなみにWindowsのエディション確認して、Docker使えるか確認できましたか？

## laravel初心者向けに、作ると面白いサイトの例が知りたい

* ログイン機能があってほしい
* タスクリスト(ToDoList)
* 既存サービスのクローンを作ってみる
    * Netflix
        * 動画配信
    * Tiktok
    * MyQiita
        * Qiita クローンいいですね！ちなみに、これも Qiita クローンですが、Laravel でつくられたそうです
        * [Crieit](https://crieit.net/)
* マグロガチャチャット
    * [マグロと寿司とWebSocket。Laravel+Vue.jsで簡易的なチャットを作る。 - Qiita](https://qiita.com/noplan1989/items/1be777f1d5f4f36ebe09)
* Franz https://meetfranz.com/
    * Skype、Slackなど、チャットアプリをまとめるツール
    * バッテリーめっちゃ使う
* [サービスのアイデア共有コミュニティ HIRAMEKI CAFE](http://hiramekicafe.com/)
    * ここから実装するネタを探す

## valetとhomesteadのどちらがいい？

* アンケート
    * Laravelユーザ: 4人
    * Valet 1名
    * Laradock 1名
* Valet
    * 仮想化ではない
    * 開発環境がMacならMacに直接入れる
    * インストールして10分以内に使えた
    * Valet はローカル環境を変えちゃうので、Homestead（Vagrant）がいいんじゃないですかね
* Laradock
    * Docker環境
    * Laradock は頻繁に変更されるので、一回入れて使い続けるならいいんですが、更新に追従しようとするとハマることが多々あり、イチから Docker のコンテナ作るほうがいいかもしれないです
* Homestead
    * homestead使ってましたが、最近dockerに移行気味です

## Laravelのデータベース通知（アプリ内通知？）の仕組みがイマイチわかりません by tosite

* 質問者さん解説お願いします！
[Notification](https://readouble.com/laravel/5.3/ja/notifications.html) のことです。
`User has many Groups`の関係があったとして、例えばGroupの名前を変えたことをGroupに属しているUser全てに通知する場合、

*補足：イメージ的にはLineのグループの名前を変えたときなどです。*


```php
// GroupController.php
$group_users = User::with(['groups' => function ($query) use ($group_id){ 
                   $query->where('id', $group_id);
               }])
               ->get()
;

foreach ($users as $user) {
    $user->notify(new \App\Notifications\WhenGroupChanged());
}
```

```php
// User.php
namespace App;

use Illuminate\Notifications\Notifiable;
use Illuminate\Foundation\Auth\User as Authenticatable;

class User extends Authenticatable
{

    use Notifiable;

    protected $fillable = ['name', 'email', 'password', ];
    
    public function groups () {
        return $this->hasMany('user', /* local_key */ 'id', /* foreign_key */'user_id');
    }
}
```

```php
// App/Notifications/WhenGroupChanged();
namespace App\Notifications;

use Illuminate\Bus\Queueable;
use Illuminate\Notifications\Notification;
use Illuminate\Notifications\Messages\MailMessage;

class WhenGroupChanged extends Notification {

    Protected $user_name;
    public function __construct ($user_name)
    {
        $this->user_name = $user_name;
    }

    public function via ($notifiable)
    {
        return ['database'];
    }

    public function toDatabase ($notifiable)
    {
        return [
            'user_name' => $this->user_name,
        ];
    }
}

```

といった形で通知すると思うのですが、この考え方で合っていますか？

* 要は通知の設計というか、そのあたりがあんまり理解できてないんだと思います。

    * notifyの部分がちゃんとQueueingされてブロックされていなければよさそう! by reoring
    * ShouldQueueをつかえたら使ったほうがよさそう by reoring
    * https://laravel.com/docs/5.6/notifications


##  Laravel初心者に難しいって言われてますが、どんなところが難しいと感じますか（もし難しいと感じている方がいたら）by nunulk

* 背景的に、レガシーな環境で働いているのと、そもそも独自フレームワークから入ったのが他のフレームワークでどう動いているのかがよく理解できていない。
* エンジニアに転職して1年ちょっとでなんとなく雰囲気でコードを書いているけど、用語とか理論とか基礎的なことがわかっていない
* 従業員が自分一人しかいないので、そもそも自分がやっているのが正しいのかどうかがよく分からず、他人がすでに書いたコードをもとに修正しながら知っていくしかない
* つまり、いまの開発フローについての理解が足りない。
* Laravel用語が多くて理解するのに時間がかかる気がします。 by tosite
* 未だにDIとかFacadeとかあんまり理解していない。 by tosite
* そもそもPHPの言語仕様自体が難しい。　(Laravelに限らず) by suin
* 概念が多すぎる
* CakePHPのほうが独特なイメージがある
* [PHP - The Wrong Way](http://www.phpthewrongway.com)
* 0からの手書き最強伝説
* PHP初心者xLaravel初心者
    * どっちも分からないという状態が一番つらいと思う
    * どっちがPHPの機能なのか、Laravelの機能なのか分からない
    * 基礎をふっとばして応用しているから分からなくなる
* 

(nunulk) 用語の難しさはあるかもしれないですねー（センスある名前でいいんですが、Eloquent とか Cashier とか。。直感的に分からないのはあるかもしれないです

↑ですよね。英語がそもそもNativeじゃないから難しい。 by nouphet

## 型宣言を書いてあるのに消さないとならなくなったときどうしたらいいか？

* array | stringをクラスで表現する
* array | stringの事前条件をassertで表現する
* そもそも再帰を使わなくてもうまくいく方法がある
* 入り口関数と、実際に処理する関数を分けた上で、入り口関数ではチェックして、実際に処理する関数ではチェックしない

## エンジニアの転職について

* Twitter転職
    * 企業がTwitterで探していることが多い
    * 「転職」というキーワードで検索してくる
* 会社と自分のやりたいことのベクトルが合っているかが重要
* フレームワーク何を使っているかは重要になるか
    * Laravelできますは間口が広まる
* [【ワタシハ　ララベル　チョットデキル】Tシャツ by ゆうき＠Webエンジニア ( yukisnow0704 ) ∞ SUZURI（スズリ）](https://suzuri.jp/yukisnow0704/723606/t-shirt/s/white)
* あこがれのエンジニア見つけて、そのひとと一緒に働きたい、とかのモチベーションでもよさそう
* 社風がマッチするか、とかも重要かもしれないですね

Twitter転職なんですか？↑ by suin

基本的にTwitterと勉強会の合わせ技です。 by tosite

## IsomorphicだったりPWAなアプリを作るのって大変だよね

* Isomorphic(アイソモーフィック)→サーバもクライアントもJavaScriptで作る


## YYPHPは毎週やってます

PHPについてワイワイ話したい方は、[YYPHPのイベント情報](https://yyphp.connpass.com/)をチェックしてみて下さい。

以上、YYPHPのレポートでした。次回もワイワイやっていきたいと思います！ では、また来週！