laravel JP conference 19 memo

# Larvel jp

2019/02/16 東京

ふらっと久しぶりに出張ったので。

## Service Provider & Service Container

前田さん

- サービスコンテナー気になる人向け

https://speackerdeck.com/chiroroxx/serviceprovider-servicecontainer-ru-men

### ServiceConterner

サービス・自動注入・DI・サービスコンテナ・インターフェース の複合物。今回は DI/サービスコンテナに絞って。

### DI

例:

- SendGrid にコンタクトリストにユーザを追加する
- SendGridを使ってメールを送信する

ユースケース: ユーザ側と管理者側でAPIキーを分けることに。

```php
$this->service = new \SendGrid(config('services.sendgrid.key'));
```

これをどうする？

案:

1. UserSendGrid?AdminSendGrid? -> まぁ増えたらしんどいよね
2. getter/setter -> インスタンス管理がねー
3. DIかな？

Di = **インスタンスの生成に必要な設定をコンストラクタの引数で渡してあげること**。

今回は `\SendGrid(config('services.sendgrid.key'))` 部分をDIに。

```php
class SendGridService{

	public function __construct(SendGrid $sendgrid){
		$this->service = $sendgrid;
	}
}

...

$service = new SendGridService(.new \SendGrid(config('services.sendgrid.key')) );
```

-> これの問題点

1. これだと、サービス作る時に new するのでしんどいよね。
2. 設定やらが増えたら？

### サービスコンテナ

- 各処理ごとに毎回作る：サービスコンテナ

こんな漢字

```php
$conteinr = [
	'sendgrid' => SendGridService::class,
	...
];
```

どこからでも呼べる。 `resolv('sendgrid')` ←これ。 `app()` との違いは…？

### サービスプロバイダ

サービスプロバイダ: サービスの精製方法をまとめて管理

`register`メソッドを使ってデータを登録。`AppServiceProvider` のあれ。サービスごとに別けて、`app.php` に登録したほうが良いよ。

```php
class sendGridServiceProvider extends ServiceProvider {
	public function register(){
		$this->app->bind('sendgird', function($app){
			$sendgird = new SendGrid(config('services.sendgrid.key'));
			return new SendGridService($sendgird);
		});
	}
}

...

$service = resolve('sendgrid');

```


### まとめ

今回は DI の話。

### ちょっとした感想

多分ここらへんだけで、テストの話までなるから、どっかで一通りは聞いてみたいなーなー

## Larvel Package 管理

みかかねさん

laravel-package の話。

see: https://speakerdeck.com/mikakane/laravel-package-development

Laravel の機能が使える。

app フォルダーをスリムにして、見やすくする。

Routing `loadROuteFrom(__DIR__.'/routes/api.php')` みたいな形で使える

Migration `loadMigrationsFrom(__DIR__.'/path/to/migrations')` みたいな。昔はvendorでやってたよね。

View `loadViewsFrom(__DIR__.'/views/')` みたいな

Vendor.publish : 使う側にファイル展開

composer.json に `extra` section を追加すりゃ使えるよ。(確か Laravel 5.5以降よな)

### Package 管理面倒じゃね？

tagやらversionやら…

-> 気軽に始めるには？

psr-4 の app 以外に書き換えて、ええようにやっていく。

Type Path Repository => ？

親の composer.json に書くアレ

```
{
	'repositories' : [
		{'type': 'path', 'url': './modules/function1'}
	]
}
```

依存関係のパッケージインストールはこんな感じ

```
$ composer require chatbox-inc/mailsystem:*@dev
```


### APP しかできないこと

exception handler
service provider 管理
などなど


## RDB

そーだいさん。hateblog に置いてる。

### よくある話

- ユーザが増えて重くなった
- バッチが突き抜けた

開発速度と実行速度は同じぐらい大事 => だいたいは RDB が重かったりする。

今日は RDBS 限定の話。

婚活といえばオミカレですよー


クライアント　→　パーサ・リラいた　→　プランな・オプティマイザ　→　エグゼキュータ　→　データ	

だいたいはエグゼキュータが遅い　→　RDBMS が苦手な処理をしている　→　リレーショナルモデルになっていない

履歴・ツリー型はRDBMS の苦手。

`Explain` 文で見る。MySQLは5.7？から DELETE/INsert 文にも使える。


#### 活用できてない

- index 使ってない
- 不要な大きなデータを使ってる

	1. インプリシットカラムの例（SQLアンチパターン）
	2. where で小さくする
	3. from区で小さくる
	3. 不要なjoinをなくす

=> ORM/QueryBuilderが実行するクエリを知ることが大事

- テーブル設計が悪い => 積み木。マジカルな初期設計だと死ぬ -> RDBMS に適した設計が必要

Index が使えないパターン

1. 検索結果が多い・全体の件数が少ない
2. 条件にその列を使ってない
3. カーディナリティの低い列に対する検索（A/B だけの時にAが極端に多いのを、カーディナリティが低い）	
2. あいまい検索
3. 統計情報と実際のテーブルで乖離がある場合

sql-performance-experience.com ?

などなど

#### Framework 依存症

- foreing-key がねーよなどなど

絶対悪ではない。フレームワークに依存しない最適な設計を常に模索

## Laravel デプロイ戦略

鶴島さん

https://speakerdeck.com/ttsuru/laravelfalsetehuroizhan-lue-vpskaradocker-kubernates-saharesumate

speaker deck にあるっぽい。

Deployを考えなくていい状態がいいよね。

一番言いたい所：永続データ以外は廃棄しよう

PaaS => 乗っけられるかどうか見極め大事。無理だったら泥沼。

Docker Managed => Scale楽よ。


- NFS は意外と重い。
- aws だと code pipeline を始めに検討　-> gitlab, jenkins もあるよ
- docker/fargate 
- session などは dynamodb 

config : .env 使おう
file storage : s3 に。IAMの設定はしっかりね。
session : redis/memcached を使おう. dynamodb もオンデマンドキャパシティ使えばいいよ。
db : read/write 別けられる
queue : メール送信とか。
task scheduling : 意外と大変。schedule から Queueで動かすとか。

Docker : Laravel のソースが入っているコンテナを作ったほうが意外といい。開発は docker-composer up がいいよ。

ENTRY_POINT を使うと、PHP.iniの設定変えられるよ。

IAM の Role を？

ストレージの初期設定は、初期しかできないので。

Dockerの脆弱性スキャナを。

TImezone : よく忘れてるよ。
メール：外部サービス
ログ：なにかあると求められる。機密情報はログに入れないように。

stackdriver logging

例外ハンドラ : rollbar で。

Laravel職人もDocker職人に。


#### かんそー

個人的に一番欲しいなーというものなので、ありがたやありがたや。