Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP]Wzorzec Repository w Laravelu
Forum PHP.pl > Forum > Przedszkole
trifek
Witam serdecznie,
Robię projekt z wykorzystaniem Laravela 5.8.

Mam następujący kod:

1.BaseRepository:
  1. abstract class BaseRepository implements RepositoryInterface
  2. {
  3.  
  4. protected $model;
  5.  
  6. public function getAll(string $order = 'id', string $by = 'desc')
  7. {
  8. return $this->model->orderBy($order, $by)->get()->appends(request()->query());
  9. }
  10.  
  11. public function getAllWithPaginate(string $order = 'id', string $by = 'desc', int $perPage = 1)
  12. {
  13. return $this->model->orderBy($order, $by)->paginate($perPage)->appends(request()->query());
  14. }
  15.  
  16. public function with($relations)
  17. {
  18. return $this->model->with($relations);
  19. }
  20.  
  21. public function create(array $data)
  22. {
  23. return $this->model->create($data);
  24. }
  25.  
  26. public function save(array $data): int
  27. {
  28. $model = $this->model->create($data);
  29. return $model->id;
  30. }
  31.  
  32. public function update(array $data, int $id)
  33. {
  34. return $this->model->where("id", "=", $id)->update($data);
  35. }
  36.  
  37. public function delete(int $id)
  38. {
  39. return $this->model->destroy($id);
  40. }
  41.  
  42. public function find(int $id, string $order, string $by)
  43. {
  44. return $this->model->find($id)->orderBy($order, $by);
  45. }
  46.  
  47. public function findOrFail(int $id, string $order, string $by)
  48. {
  49. return $this->model->findOrFail($id)->orderBy($order, $by);
  50. }
  51.  
  52. public function getModel()
  53. {
  54. return $this->model;
  55. }
  56.  
  57. }


2. RepositoryInterface:
  1.  
  2. interface RepositoryInterface
  3. {
  4. public function getAll(string $order, string $by);
  5.  
  6. public function getAllWithPaginate(string $order, string $by, int $perPage);
  7.  
  8. public function create(array $data);
  9.  
  10. public function save(array $data);
  11.  
  12. public function update(array $data, int $id);
  13.  
  14. public function delete(int $id);
  15.  
  16. public function find(int $id, string $order, string $by);
  17.  
  18. public function findOrFail(int $id, string $order, string $by);
  19.  
  20. public function getModel();
  21. }


3 AdRepository:
  1.  
  2. class AdRepository extends BaseRepository
  3. {
  4.  
  5. public function __construct(Ad $model)
  6. {
  7. $this->model = $model;
  8. }
  9.  
  10. public function search(string $query, string $order = 'id', string $by = 'desc', int $perPage = 1)
  11. {
  12. return $this->model->where('title', 'LIKE', '%' . $query . '%')->orWhere('id', 'LIKE', '%' . $query . '%')->orWhere('content', 'LIKE', '%' . $query . '%')->orderBy($order, $by)->paginate($perPage)->appends(request()->query());
  13. }
  14. }
  15.  


4. Controller:
  1. use App\Models\Ad;
  2. use Illuminate\Http\Request;
  3. use App\Http\Controllers\Controller;
  4. use App\Repositories\AdRepository;
  5.  
  6. public function index(Request $request)
  7. {
  8. if($request->input('query') != ""){
  9. $adsList = $this->repository->with('author')->search($request->input('query'));
  10. } else{
  11. $adsList = $this->repository->with('author')->getAllWithPaginate();
  12. }
  13.  
  14. return view('modules.ad.ad_list', ['adsList' => $adsList]);
  15. }
  16.  
  17. protected $model;
  18.  
  19. public function __construct(AdRepository $repository)
  20. {
  21. $this->model = $repository;
  22. }
  23.  
  24.  


Kiedy uruchamiam mój kod, otrzymuję błąd:
Call to undefined method Illuminate\Database\Eloquent\Builder::getAllWithPaginate()

W jaki sposób mogę to naprawić?
viking
Dlaczego $this->repository a nie $this->model w kontrolerze? Szczerze mówiąc to akurat ten wzorzec nie ma żadnego sensu w LV. Dodatkowo zapytania z like są podatne na sql injection.
trifek
Rozumiem. Dzięki za info smile.gif

Jak zabezpieczyć się w takim razie przed SQL injection? Tj książkowy przykład (Laravel wstęp do programowania aplikacji internetowych) sad.gif
viking
Widzisz ile książki są warte. Normalnie zabezpiecza ale dla like są znaki ucieczki %_ i trzeba się dodatkowo zabezpieczyć. W mysql możesz użyć szybsze nawet locate().
trifek
W jaki sposób byś zabezpieczył takiego like:

  1. public function search(string $query, string $orderByColumn, string $orderBy = 'desc', array $with = [], array $columns = ['*'], int $perPage = 10)
  2. {
  3. return $this->model->where('title', 'LIKE', '%' . $query . '%')->orWhere('id', 'LIKE', '%' . $query . '%')->orWhere('content', 'LIKE', '%' . $query . '%')->orderBy($orderByColumn, $orderBy)->paginate($perPage)->appends(request()->query());
  4. }



questionmark.gifsmile.gif
viking
W sumie już ci powiedziałem. Przepuść input przez addcslashes. Masz pełno tematów w sieci na ten temat.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.