Почему не работает анонимная функция для сортировки?

В ArticlesController есть метод для сортировки статей, в зависимости от внешних параметров:

protected static function sortArticles(Collection $articles, string $sort_by, string $order): Collection
    {
        $sortBy = function ($by, $order) use ($articles) {
            if ($order === 'asc') {
                $method = 'sortBy';
            } elseif ($order === 'desc') {
                $method = 'sortByDesc';
            }

            return call_user_func([$articles, $method], [$by]);

        };


        switch ($sort_by) {
            case 'title':
                return $sortBy('title', $order);
                break;
            case 'views':
                return $sortBy('views_count', $order);
                break;
            case 'comments':
                return $sortBy(function ($article) { // This is my callback for sorting and it doesn't work as expected
                    return count($article->comments);
                }, $order);
                break;
            case 'date':
                return $sortBy('created_at', $order);
                break;
        }
    }

Всё работает, но когда sort_by=comments (третий кейс) Laravel ломается:

(1/1) ErrorException Object of class Closure could not be converted to string


По непонятным мне причинам метод sortByDesc(), который вызывается для экземпляра Collection с помощью call_user_func и которому передаётся анонимная функция, пытается преобразовать её в строку (хотя согласно документации он принимает callback для сортировки). Если я прямо указываю sortBy или sortByDesc, то callback принимается на ура:

case 'comments':
        return $articles->sortBy(function ($article) { // Gives no errors
            return count($article->comments);
        });
        break;


Что за ерунда?
  • Вопрос задан
  • 145 просмотров
Пригласить эксперта
Ответы на вопрос 1
@vanillathunder
А
case 'comments':
                return $sortBy( $articles->map(function($article) {
                        return count($arcticle->comments);
}), $order);
                break;
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы