kanfur orderBy metodunu paginate içine ekleyemezsiniz. Bunun için ya farklı bir isimde kendi paginate yönteminizi yazmanız lazım (Buider Macro, şurada örnek vermiştim) ya da \Illuminate\Database\Eloquent\Builder sınıfını genişletip paginate yöntemini değiştirmeniz lazım.
Bunların yerine global scope sanki daha kolay olur gibi:
https://laravel.com/docs/7.x/eloquent#global-scopes
Elbette burada Model katmanına Request karıştırmış olacaksınız ama minimum düzenleme istiyorsanız buna mecbursunuz.
Mimari olarak ben şöyle bir yol izliyorum: Model → Repository → Service
Kabaca örnek vermek gerekirse:
class User extends Model
{
//...
}
class UserRepository implements UserRepositoryInterface
{
public function create(array $data): User
{
return User::create($data);
}
}
class UserService implements UserServiceInterface
{
public $userRepository;
public function __construct(UserRepositoryInterface $userRepository)
{
$this->userRepository = $userRepository;
}
public function register(array $data): User
{
// Varsa $data ile ilgili işlemler...
return $this->userRepository->create($data);
}
}
class RegisterController extends Controller
{
public $userService;
public function __construct(UserServiceInterface $userService)
{
$this->userService= $userService;
}
public function register(UserRegisterRequest $request)
{
$user = $this->userService->register($request->validated());
event(new UserRegistered($user));
return new RegisteredUserResource($user);
}
}
Yani User → UserRepository → UserService yapmış oluyorum:
- User burada en alttaki katman, model katmanı. Görevi sadece users tablosundaki bir satırı obje olarak ifade etmek ve sorgulama yapmak. Database dışında başka bir katman ile karıştırılamaz, içinde Auth, Request vs kullanılamaz.
- UserRepository ise orta katman. Görevi ise User üzerinde gelişmiş sorgulamalar ve işlemler yapmak. Database ve Model dışında başka bir katman ile karıştırılamaz, içinde Auth, Request vs kullanılamaz.
- UserService ise iş mantığını (Business Logic) ifade eden son katman. Bu katmanın göre uygulamanın iş mantığını gerçekleştirmek. Bu katman repository ve diğer katmanları kullanmakta özgür.
Bu 3 katmanı sahip olabilecekleri yöntemlerle açıklamak gerekirse:
// Uygulama mantığı (Application logic)
User::find($id)
// Genişletilmiş uygulama mantığı (Application logic)
UserRepository::getAdminUsers()
// İş mantığı (Business logic)
UserService::getMonthlyExpensesOfUser(Carbon $date, User $user, StatsManagerInterface $statsManager);