エンジニアのひよこ_level10

毎日更新してた人。たまに記事書きます。

【Laravel】valueRetrieverで、第一引数がcallbackでも文字列でも使える関数生成【502日目】

Laravelの関数見たら疑問を持ちました

    $sorted_user = $users->sortBy('sort_number');

    $sorted_user2 = $users->sortBy(function ($user) {
        return $user->sort_number;
    });

    dd($sorted_user == $sorted_user2); //true

あれ?なんで、第一引数が、文字列だったりcallback関数だったり、
どちらでも動いているのだろう?

元コードを読んだらこれでした。

文字列を関数化

valueRetrieverという関数が内部で使われていました。

    /**
     * Get a value retrieving callback.
     *
     * @param  string  $value
     * @return callable
     */
    protected function valueRetriever($value)
    {
        if ($this->useAsCallable($value)) {
            return $value;
        }

        return function ($item) use ($value) {
            return data_get($item, $value);
        };
    }

最初の例だと、$valueが無名関数と文字列どっちも入るのですが、
無名関数ならuseAsCallableがtrueでそのままreturn。

もし文字列なら、その下で無名関数に変換してからreturnしてくれているのです。

なるほど、こうやって変換すれば、型変換だけでは足りない変換にも対応できるのですね。

勉強になりますLaravelさんφ(..)メモメモ