В 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;
Что за ерунда?