1)Правильно движешься, что валидация в реквестах.
2)Избыточный код
$objProducts = Products::find($id);
if(!$objProducts){
return abort('404');
}
Используй findOrFail
3) $is_reccomended = $request->has('is_reccomended') ? true : false;
Метож has и так вернет тру или фолс, тернарный оператор лишний
4)(!$hasCategory || $objCatsRels)
Опять же, лишнее, ты же создаешь objCatsRels если не hasCategory
Ну и разнеи логику по сервисам.
В контроллере должен быть понятный читабельный код, что бы любой сразу понял, что в не происходит