laravel ページネーションの「pagination.previous」と「pagination.next」はどこに記載されている？

## 概要

- laravelのページネーションにて特に言語ファイルを作成しない状態で`links()`関数を用いてページネーションリンクを設定すると表示される「pagination.previous」と「pagination.next」はどこで定義されているのか追ってみた。

## 追っかけてみる。

1. まず`links()`関数の定義部分を見てみる。`vendor/laravel/framework/src/Illuminate/Pagination/LengthAwarePaginator.php`の77行目付近で下記の様に定義されていた。

    ```vendor/laravel/framework/src/Illuminate/Pagination/LengthAwarePaginator.php
    /**
     * Render the paginator using the given view.
     *
     * @param  string|null  $view
     * @param  array  $data
     * @return \Illuminate\Contracts\Support\Htmlable
     */
    public function links($view = null, $data = [])
    {
        return $this->render($view, $data);
    }
    ```

　1. `links()`ではなさそうだった。ここはただ同じクラス内の`render()`を呼んでいるだけっぽい。その`render()`を見てみる。

    ```vendor/laravel/framework/src/Illuminate/Pagination/LengthAwarePaginator.php
    /**
     * Render the paginator using the given view.
     *
     * @param  string|null  $view
     * @param  array  $data
     * @return \Illuminate\Contracts\Support\Htmlable
     */
    public function render($view = null, $data = [])
    {
        return static::viewFactory()->make($view ?: static::$defaultView, array_merge($data, [
            'paginator' => $this,
            'elements' => $this->elements(),
        ]));
    }
    ```

1. `render()`では表示内容やらなにやらをビルドしている模様だった。キー`paginatior`に自分自身のオブジェクト（$this)を渡しているっぽい。「pagination.previous」と「pagination.next」は今のクラス内もしくは継承元のクラスで定義されているはずだ。
1. すぐ下の`linkCollection()`関数で定義されていた。

    ```vendor/laravel/framework/src/Illuminate/Pagination/LengthAwarePaginator.php
    /**
     * Get the paginator links as a collection (for JSON responses).
     *
     * @return \Illuminate\Support\Collection
     */
    public function linkCollection()
    {
        return collect($this->elements())->flatMap(function ($item) {
            if (! is_array($item)) {
                return [['url' => null, 'label' => '...', 'active' => false]];
            }

            return collect($item)->map(function ($url, $page) {
                return [
                    'url' => $url,
                    'label' => (string) $page,
                    'active' => $this->currentPage() === $page,
                ];
            });
        })->prepend([
            'url' => $this->previousPageUrl(),
            'label' => function_exists('__') ? __('pagination.previous') : 'Previous', // ここ！！
            'active' => false,
        ])->push([
            'url' => $this->nextPageUrl(),
            'label' => function_exists('__') ? __('pagination.next') : 'Next', // ここ！！
            'active' => false,
        ]);
    }
    ```

1. どうやら表示ラベルとして`__()`関数が定義されている時は`__('pagination.previous')`や`__('pagination.next')`が実行されるようになっているっぽい。
    - [laravel __()関数](https://qiita.com/miriwo/items/38c12db12a5cd5d9bddd)
1. `resources/lang/ja/pagination.php`を作ってなかったため`__()`関数の引数である「pagination.previous」と「pagination.next」がそのまま表示されていたっぽい。（`config/app.php`の`locale`が`ja`の場合）
1. ページネーションの「ページ戻り」や「ページ送り」のボタンの表示名を変更したい場合、当該の関数をオーバーライドするのではなく、`resources/lang/ja/pagination.php`の中に配列でキーpreviousとキーnextに紐づく値を設定するほうが良いと思う。
    - [laravel 簡単にページネーションを実装する](https://qiita.com/miriwo/items/f3e732348809737f52c0)

vendor/laravel/framework/src/Illuminate/Pagination/LengthAwarePaginator.php
118行目