YYPHP#99「オレオレフレームワークってどう思う？」「Laravel Dacapo - Laravelのマイグレーションをよくするツール」「LaravelでのDIの基本」「PHPerでもTypeScriptを書いてみよう」

これは2019年9月6日に開催したPHPerイベント[YYPHP#99]のイベントレポートです。

[YYPHP#99]: https://yyphp.connpass.com/event/143746/
[YYPHP]: https://yyphp.connpass.com/

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

__今回の配信動画__

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">YYPHP#99 の配信収録の録画です😌<a href="https://t.co/7Xz21x1qxp">https://t.co/7Xz21x1qxp</a></p>&mdash; suin❄️TypeScriptが好き (@suin) <a href="https://twitter.com/suin/status/1169946591567859712?ref_src=twsrc%5Etfw">September 6, 2019</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

__過去回の配信動画__

https://www.youtube.com/playlist?list=PLpOeTEye3Bg6PodrLHHC72jWMJYZz8VbG

__前回__ →  [YYPHP#98「新人が業務で意識すべきこと」 「LaravelのFacadeは避けるべき？」 「1年半たってソースが汚く。リファクタリングどうしよう… 」 「Laravelに依存したDDDってあり？」 「SPAのセキュリティって何を注意したらいい？」 - Qiita](https://qiita.com/suin/items/7332b73489c69e1ee289)

# 雑談

## オレオレフレームワークってどう思う？ (わかば)

無条件にやらないという意見が目立つが、どうすれば受け入れられるのか？

* 否定的な理由
* 無条件に否定するのは良くない、が……
    * 実用なのか研究によって違う
    * フルスタックフレームワークを作ってみた経験
        * 時間がやっぱりかかる
        * 3年かかった
    * コストがかかる以上、ビジネスにおいてフレームワークを作ることが中心的な目的だったのか？という問題も。
    * ドキュメントも良くしないと、チームで使いにくい。
        * 作った人が退職すると、メンテできなくなる
* 目の前の課題を解決するためのFWに注力するのはどう思う？
    * 部分的に良いフレームワークを最小限の時間で作るのはいいと思う。
* ドキュメントがないと死ぬ？
    * 大量のドキュメントは不要
    * 十分わかりやすければ
        * 使い始めたり
        * やりたいことが書いてある
        * 別の社員の質問が減らす
* そのフレームワークに習熟したところで、転職したところで役に立たないとしたら、オープンなフレームワークを学びたいという人もいる。
    * 有名なフレームワークじゃないとだめ？
* できるだけオレオレじゃなくする方法もある
    * フレームワークのモデルが一般的で、その理論に基づいて実装されている
* [PatrickLouys/no-framework-tutorial: A small tutorial to show how to create a PHP application without a framework.](https://github.com/PatrickLouys/no-framework-tutorial)
* フレームワークを社内だけて使いたいのか、オープンにしたいのかにもよる
* 人の採用
    * オープンなFWなら、それを知っている人をターゲットに採用戦略がねれる
* BEAR.Sundayのような他にない強みがあると
* 業務にすごくフィットするもの
    * 業務の流れに沿って、そのままそれをコードに落とせるようなフレームワーク
* [PHP - PHPにおいて、独自フレームワークを採用するメリットを教えてください。｜teratail](https://teratail.com/questions/97624)
* 過去に作ったFWは公開されている
    * [ProjectICKX/fw2](https://github.com/ProjectICKX/fw2)

## Laravel Dacapo - Laravelのマイグレーションをよくするツール (ゆーきゃん)

自作のパッケージ開発の話

- https://speakerdeck.com/ucan_lab/laravel-dacapo-2019-09-06-yyphp-99
- https://github.com/ucan-lab/laravel-dacapo

* 初期フェーズのLaravelのマイグレーションの問題点
    * 初期フェーズはテーブル構成が頻繁に変わるため、マイグレーションファイルが増えがち。それに伴い次の問題が:
        * 最近のテーブルの形がわからない
        * テーブル変更コストが大きい
        * クラス名はユニークにする必要がある
        * up, downの整合性
* Dacapoの解決方法
    * schema.ymlに最新のテーブル状態を書く
    * マイグレーションファイルを全部削除し、
    * schema.ymlをもとに新しいマイグレーションファイルを生成する
* Dacapo v2は開発初期フェーズ用
* Dacapo v3は運用フェーズでも使えるようにしていく
    * 差分からマイグレーションファイル生成
* Dacapoの意味って何？
    * かぶらないやつで探してて、音楽用語で最初に戻って繰り返すの意味。
        * マイグレーションを最初からやり直すから
* Dacapoを使ってみて
    * Dacapoをやめるタイミングになって、Dacapoを外したら、急に辛くなった。
* READMEをちゃんとかいたほうがいい

## LaravelでのDIの基本について聞きたい (かきうち)

概要とか聞きたい。ゆーきゃんさんに。

・・・

* Laravel.sibuyaでDIについて分かりやすい資料があったので共有する
    * [DIとは何かを探す旅に出た話/di_travel - Speaker Deck](https://speakerdeck.com/yoshi1234/di-travel)
        * よしにゃんさん
* Laravel DIの機能とは
* [Laravelのサービスコンテナとサービスプロバイダはどういうものなのか - Qiita](https://qiita.com/kunit/items/adee0a6aa449d53602c0)
* 普通にnewするのとmake()するのの違いは？
* オブジェクト指向プログラミング
    * 構築のフェーズと実行のフェーズがある
* [Laravelのサービスコンテナで依存性注入（DI）を行う](https://www.ritolab.com/entry/108)
* DIとファクトリーの使い分け
    * DI: 構築が簡単なもの
    * ファクトリー: 構築に関して複雑な手続きが必要なもの

## cakephpのチュートリアルについて (かづまさ, リモート)

今この記事でチュートリアルを進めているのですが・・・
https://easyramble.com/cakephp-develop-tutorial.html


```
$ composer self-update && composer create-project --prefer-dist cakephp/app cms
```

でプロジェクトファイルを作ろ〜と思ったのですが

```
You are already using composer version 1.9.0 (stable channel).
Installing cakephp/app (3.8.0)
- Installing cakephp/app (3.8.0): Loading from cache
Created project in cms
Loading composer repositories with package information
Updating dependencies (including require-dev)
```

ここまで進んでいるのですが・・・

```
Set Folder Permissions ? (Default to Y) [Y,n]? Y
Permissions set on /path/to/cakephp_projects/cms/tmp/cache
...
```

この質問まで行かずに止まってしまっています。
どうしたらいいかな〜ってなってます。

このPathはありますか?

```
/path/to/cakephp_projects/cms/tmp/cache
```

すいませんPathってどうやって調べるんですか？


```
ls -l /path/to/cakephp_projects/cms/tmp/cache

エラー出たら↓
ls -l /path/to/cakephp_projects/cms/tmp
ls -l /path/to/cakephp_projects/cms
ls -l /path/to/cakephp_projects
```
No such file or directoryと表示されました。

`cms` ディレクトリで実行してるPHPの権限が無いのかも
```
ls -l /path/to/cakephp_projects
```


```
$ mkdir -p /path/to/cakephp_projects/cms/tmp
$ chmod -R 777 /path/to/cakephp_projects/cms/tmp
# $ find -type d | chmod 777
```

成功すると:

```
tmp
├── cache
│   ├── models
│   │   └── empty
│   ├── persistent
│   │   └── empty
│   └── views
├── sessions
│   └── empty
└── tests
    └── empty

6 directories, 4 files
```

## 認証について、CakePHP4.0から推奨されるAuthenticationプラグインの使い方 (ともや, リモート)

CakePHP4.0よりAuthコンポーネントが非推奨になることに伴い、認証基盤にはAuthenticationプラグインを使うことが推奨されています。
研究目的で使ってみていますがうまくいっていません。

[ドキュメント](https://book.cakephp.org/authentication/1.1/en/index.html)
[Authコンポーネントからの移行](https://book.cakephp.org/authentication/1.1/en/index.html)

Authコンポーネントでユーザー登録まで行った状態（テーブルにユーザー情報が入っている状態）でドキュメントにしたがってプラグインを導入したもののログインできませんでした。

Authenticationプラグインで認証が必要になっているもののアドレスとパスワードを入れてもログイン画面へリダイレクトされます。

ログイン失敗しているようです。
認証が必要な画面へ直でアクセスしてもログイン画面へリダイレクトされます。

本日のデバックログです。


```


2019-09-06 10:30:36 Notice: Notice (8): Undefined variable: result in [C:\xampp\htdocs\rd-plglogintest\src\Controller\UsersController.php, line 32]
Request URL: /users/login
Trace:
Cake\Error\BaseErrorHandler::handleError() - CORE\src\Error\BaseErrorHandler.php, line 159
Cake\Core\BasePlugin::{closure}() - ROOT\vendor\cakephp\debug_kit\config\bootstrap.php, line 42
App\Controller\UsersController::login() - APP/Controller\UsersController.php, line 32
Cake\Controller\Controller::invokeAction() - CORE\src\Controller\Controller.php, line 610
Cake\Http\ActionDispatcher::_invoke() - CORE\src\Http\ActionDispatcher.php, line 120
Cake\Http\ActionDispatcher::dispatch() - CORE\src\Http\ActionDispatcher.php, line 94
Cake\Http\BaseApplication::__invoke() - CORE\src\Http\BaseApplication.php, line 235
Cake\Http\Runner::__invoke() - CORE\src\Http\Runner.php, line 65
Authentication\Middleware\AuthenticationMiddleware::__invoke() - ROOT\vendor\cakephp\authentication\src\Middleware\AuthenticationMiddleware.php, line 121
Cake\Http\Runner::__invoke() - CORE\src\Http\Runner.php, line 65
Cake\Http\Runner::__invoke() - CORE\src\Http\Runner.php, line 65
Cake\Http\Middleware\CsrfProtectionMiddleware::__invoke() - CORE\src\Http\Middleware\CsrfProtectionMiddleware.php, line 119
Cake\Http\Runner::__invoke() - CORE\src\Http\Runner.php, line 65
Cake\Http\Runner::run() - CORE\src\Http\Runner.php, line 51
Cake\Routing\Middleware\RoutingMiddleware::__invoke() - CORE\src\Routing\Middleware\RoutingMiddleware.php, line 168
Cake\Http\Runner::__invoke() - CORE\src\Http\Runner.php, line 65
Cake\Routing\Middleware\AssetMiddleware::__invoke() - CORE\src\Routing\Middleware\AssetMiddleware.php, line 88
Cake\Http\Runner::__invoke() - CORE\src\Http\Runner.php, line 65
Cake\Error\Middleware\ErrorHandlerMiddleware::__invoke() - CORE\src\Error\Middleware\ErrorHandlerMiddleware.php, line 96
Cake\Http\Runner::__invoke() - CORE\src\Http\Runner.php, line 65
DebugKit\Middleware\DebugKitMiddleware::__invoke() - ROOT\vendor\cakephp\debug_kit\src\Middleware\DebugKitMiddleware.php, line 53
Cake\Http\Runner::__invoke() - CORE\src\Http\Runner.php, line 65
Cake\Http\Runner::run() - CORE\src\Http\Runner.php, line 51
Cake\Http\Server::run() - CORE\src\Http\Server.php, line 98
[main] - ROOT\webroot\index.php, line 40

```

３２行目（解決済みと思いますが）
```
        $result = $this->Authentication->getResult();
```

```
use Cake\Routing\Router;
```

https://book.cakephp.org/4.0/en/development/routing.html

## PHPerでもTypeScriptを書いてみよう (すいん)

* [TypeScript playground](http://www.typescriptlang.org/play/#code/MYewdgzgLgBAtgUwhAhgcwQLhtATgSzDRgF4YByACwQBsaQYB3EXGgE3IG4AoUSEGggB09NAApEydAgCUnIA)

# YYPHPは毎週やってます

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

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