laravelのページネーションにソート機能を追加する

# やりたいこと

- laravelの[ページネーション機能](https://readouble.com/laravel/5.5/ja/pagination.html)で一覧画面を作る
- 一覧は各カラムでソートができるようにする

# 使うもの

- laravel 5.5
- [Kyslik/column-sortable](https://github.com/Kyslik/column-sortable)

# やった

## composerからインストール

```
$ composer require kyslik/column-sortable
```
## 各種設定

### コンフィグファイル追加

```
$ php artisan vendor:publish --provider="Kyslik\ColumnSortable\ColumnSortableServiceProvider" --tag="config" 
```
で`config/columnsortable.php`が生成される。

### providers

```php:config/app.php
'providers' => [

    /*
     * 追加
     */
    Kyslik\ColumnSortable\ColumnSortableServiceProvider::class,
],
```

## 実装

### Model

```php:config/app.php
<?php

namespace App;

use Illuminate\Notifications\Notifiable;
use Illuminate\Foundation\Auth\User as Authenticatable;
use Kyslik\ColumnSortable\Sortable;     // 追加

class User extends Authenticatable
{
    use Notifiable;
    use Sortable;   // 追加

    public $sortable = ['name', 'login_id'];    // ソート対象カラム追加
```

### Controller

``` php:UserController.php
use Illuminate\Http\Request;
use App\User;

class UserController extends Controller
{
    public function index(User $user)
    {
        // sortable()を追加
        $users = $user->sortable()->paginate(10);
        return view('user.index', ['users' => $users]);
    }
}
```

### View

bladeに` @sortablelink() ` を記載するとソートボタンになるっぽい。

` @sortablelink('column', 'Title', ['parameter' => 'smile'],  ['rel' => 'nofollow']) `

第1引数：ソート対象のカラム名
第2引数：表示する文字列(省略するとカラム名を表示)
第3引数：デフォルトのクエリストリング(省略可)
第4引数：追加のアンカータグの属性(省略可)

使い方としては` <th> @sortablelink('name', '名前') </th> `みたいな感じ。
クリックすると`sort=name&direction=desc`のようなパラメータがついて同じ画面をgetする。


## 見た目に関して

### Font Awesome

このままでも使えるけどソート状態を示すアイコンがほしい。
デフォルトで[Font Awesome](https://fontawesome.com/)に対応してるっぽいのでついでに導入。

``` php:index.blade.php
<link rel="stylesheet" href="https://use.fontawesome.com/releases/v5.5.0/css/all.css">
```

### アイコン指定

ソートするカラム名によってclassの指定が可能。
FontAwesomeのアイコンはここで設定。

`fa-`はFontAwesome使用のプレフィックスかな？

``` php:config/columnsortable.php
<?php

return [

    /*
    spec columns
    */
    'columns'                       => [
        // 文字列
        'alpha'   => [
            'rows'  => ['description', 'email', 'name', 'slug'],
            'class' => 'fa fa-sort-alpha',
        ],
        // 量
        'amount'  => [
            'rows'  => ['amount', 'price'],
            'class' => 'fa fa-sort-amount',
        ],
        // 数値
        'numeric' => [
            'rows'  => ['created_at', 'updated_at', 'level', 'id', 'phone_number'],
            'class' => 'fa fa-sort-numeric',
        ],
    ],
```

### アイコン(asc/desc)

Font Awesome 5から以下の修正が必要。

``` php:config/columnsortable.php 
    /*
    suffix class that is appended when ascending direction is applied
     */
    // 'asc_suffix'                    => '-asc',
    'asc_suffix'                    => '-up',

    /*
    suffix class that is appended when descending direction is applied
     */
    // 'desc_suffix'                   => '-desc',
    'desc_suffix'                   => '-down',
```
...って[公式に書いてある](https://github.com/Kyslik/column-sortable#font-awesome-5)けど`alpha`と`numeric`はupとdown逆な気がする。
(自分の感覚がおかしいのか？)
`amount`は合ってそうだから悩ましい。

[sort up のアイコン(amount以外desc感)](https://fontawesome.com/icons?d=gallery&q=sort%20up)
[sort down のアイコン(amount以外asc感)](https://fontawesome.com/icons?d=gallery&q=sort%20down)

めんどくせぇからv4を使おう(思考停止)
もしくはcss自作する必要がありそう。