Laravel まったくわからん

# Laravel まったくわからんので，わかるようにしていく過程を載せる

- Laravel 6.x
    - Illuminate
- PHP 7.x

## Eloquent (ORM)

- `firstOrFail` / `findOrFail`
    - `RecordNotFoundError` が出る
- `fill`
    - モデルオブジェクトに値を設定できる
- `with`
    - ActiveRecord で言うところの `joins` / `includes` したい
    - with → eagloerLoad
        - https://github.com/laravel/framework/blob/7e82e1a272a72d75b4cd7f35a2267e9af5d642c2/src/Illuminate/Database/Eloquent/Builder.php#L1066-L1070
    - `load` は，ロード済みのCollection (Model) に使うもの？
- `has`
    - exists を確認する
- `getChanges`
    - save 済みだと，過去の値は取れなそう．
- factory
    - state で特定の値のセットを使うことができる

## Arr (Illuminate\Support\Arr) / ヘルパー

- `Arr::only`
    - assoc から指定したキーのみ含む assoc を作る
- `Arr::random`
    - array からランダムで1つ選択する


## PHP / array

- `array_keys`
    - assoc からキーの配列を取り出す
- `array_key_exists`
    - array のキーの存在チェック
- `array_merge`
    - assoc をマージする
    - `...` だと assoc をマージできない？
- [range](https://www.php.net/manual/ja/function.range.php)
    - `range(string|int|float $start, string|int|float $end, int|float $step = 1): array`
- [array_diff](https://www.php.net/manual/ja/function.array-diff.php)
    - `array_diff(array $array, array ...$arrays): array`


## PHP / String

- explode

## PHP / 関数

- 呼び出しに `...` を使うことで Traversable を実装した値を実引数に展開できる
    - 定義にも使える

## PHP / trait

- `use`
    - インポート的な

## PHP

- `self::`
    - クラスメソッドを instance メソッド内で読んだり
- `=`
    - オブジェクトはリファレンス，それ以外はコピーする．
    - `list` を使うと分割代入できる．キー指定もできる．
- `ReflectionProperty`
    - プロパティに対するリフレクションオブジェクトを作る．
    - アクセス権で無理したいときに使う
- `static`
    - 静的なメソッドとかプロパティの宣言
- `?`
    - 型名の前に付けてオプショナルの宣言
- `"｛$nam｝"`
    - 文字列展開
    - [PHP: 文字列 - Manual](https://www.php.net/manual/ja/language.types.string.php#language.types.string.parsing)
- `is_null`
    - https://qiita.com/mpyw/items/51bf42fe1ad8a7e535aa
    - `!== null` がいいとある．

## PHP スコープ

- グローバルスコープ
    - include したファイル側でも見れる
- ローカル関数スコープ
    - グローバルスコープを見るために，`global` 宣言が必要
- static 変数 (ローカル関数スコープ)
- Closure
    - `use` で渡される変数は，コピー？
        - 外で変えても変わらない
        - https://www.php.net/manual/ja/functions.anonymous.php
        - `&` を付けてリファレンスで渡す

## PHPUnit

- `expectException`
    - 例外を期待する
- スコープの記載が無いので，ヘルパーはstatic にして関数スコープの変数を使うと良さそう？
- matcher が欲しい
- 時間を操作したい
 - [Pest - An elegant PHP Testing Framework](https://pestphp.com/)
    - まだ変えるメリットは強くなさそう
- `Storage`
    - `Storage::fake`
    - `\Illuminate\Support\Facades\Storage`
        - `assertExists` とか使える
- データプロバイダー
    - テストの共通化になるのであまり使いたくない．
    - テストメソッドに `@dataProvider` アノテーションをつけて，メソッドを指定する．
    - データプロバイダーメソッドは，array を返す．それぞれがテストメソッドの引数に渡される
    - `setUp` / `tearDown` は各テストメソッドが実行される前に実行する．

## テスト関連

- `Faker\Generator` が使える
    - https://fakerphp.github.io/
    - https://readouble.com/laravel/6.x/ja/database-testing.html#writing-factories
- `UploadedFile` が使える
- Mockery が使える
    - `shouldAllowMockingProtectedMethods`
    - `app->instance()` を使うと刺さるらしい．
        - https://qiita.com/aberyotaro/items/145a941b150258f53e49

## Carbon 日付

- https://carbon.nesbot.com/docs/#api-testing
    - `startOfMonth()`
        - なんで **start** やねん……
    - `endOfMonth()`
    - `timestamp`
        - `time()` 関数を使わない方がいいかも．
    - `now()`
    - `withTestNow()`
        - freeze できる．`Carbon::now()` とかを使うと良さそう

## Blade / view

- `{{}}` / `{!! !!}`
    - 埋め込み．エスケープするかしないか
- `$request->session()->flash('status', 'finished')`

## Routes

- resource

## Vim

- https://github.com/dense-analysis/ale/issues/3342
    - wrapper じゃなくて，command を指定しろってことか

```shell:workdir/fixer
#!/bin/sh

root=`dirname $0`

# skip 'fix' subcommand
if [[ $1 == 'fix' ]]; then
  shift
fi

( cd $root && docker compose exec php php artisan fixer:fix --path "${@}" )
```

```vimscript
let g:ale_fixers = {
  \ 'php': ['php_cs_fixer'],
  \ }
let g:ale_php_cs_fixer_use_global = 1
let g:ale_php_cs_fixer_executable = $HOME . '/workdir/fixer'
let g:ale_filename_mappings = {
  \   'php_cs_fixer': [
  \       [$HOME . '/workdir', '/var/www/src'],
  \   ],
  \}
```

```zsh:.zshrc
function vi {
  if [[ $(pwd -P) = "${HOME}/workdir" ]]; then
    TMPDIR=$PWD/var/tmp vim "${@}"
  else
    vim "$｛@｝"
  fi
}
```

## 雑感

- PHP関数名難し過ぎるだろ……
    - Collection に寄せていった方がいいんだろうか？

## Refs

- [PHP: PHP マニュアル - Manual](https://www.php.net/manual/ja/)
    - [PHP: 変数のスコープ - Manual](https://www.php.net/manual/ja/language.variables.scope.php)
- [Installation 6.x Laravel](https://readouble.com/laravel/6.x/en/installation.html)
    - [Eloquent: Getting Started 6.x Laravel](https://readouble.com/laravel/6.x/en/eloquent.html)
    - [Helpers 6.x Laravel](https://readouble.com/laravel/6.x/en/helpers.html)
        - `Arr` / パス系 / `Str` / URL系
- [PHPUnit マニュアル — PHPUnit latest Manual](https://phpunit.readthedocs.io/ja/latest/) 
- [laravel/framework at 6.x](https://github.com/laravel/framework/tree/6.x)
- [Namespaces | Laravel API](https://laravel.com/api/6.x/index.html)
- [mockery/docs at 1.4.2 · mockery/mockery](https://github.com/mockery/mockery/tree/1.4.2/docs)
- [LaravelでRoute::resourceを使うときに気をつけること - Qiita](https://qiita.com/sympe/items/9297f41d5f7a9d91aa11)