Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [laravel] Filtrowanie rekordow
Forum PHP.pl > Forum > PHP > Object-oriented programming
Koldy
Witajcie rodacy,

Chcialbym sie poradzic was apropo pewnych kilku rzeczy dotyczacych mojej klasy ktorej napisalem.
Chodzi o filtrowanie rekordow na stronie.

Zaczne od struktury:
Stworzylem 3 klasy:
  1. Factory, BaseHandler, Button


Factory jest wstrzykiwana do metody controllera przez LOC, takze jest ona zainicjowana juz na starcie, pozniej kod wyglada tak:
  1. $filters->listen('cat', 'Categories', [$businessTypes, $businesses])
  2. ->listen('name', 'Search', [$businesses])
  3. ->handle();


listen, chodzi o sluchanie parametru, takze pierwszy argument to parametr get do sluchania, drugi to nazwa klasy handlera, bez namespace, automatycznie dodawany przez Factory, natomiast tablica to argumenty przekazane do stworzonego handlera.

Oczywiscie handler musi byc rozszerzeniem klasy BaseHandler, gdzie cala logika jest tworzona.
Dziecko Handlera musi miec 3 metody: boot, filter i lang, gdzie boot to tam gdzie wstrzykuja sie argumenty z tablicy i zwracana jest tablica z mozliwymi filtrami. Filter to operacje na argumentach podczas spelnienia warunku, kod wyglada np tak:
  1. switch($this->value()) {
  2. case 'name': $this->builder->orderBy($this->column); break;
  3. case 'name-inv': $this->builder->orderBy($this->column, 'DESC'); break;
  4. default: $this->builder->orderBy('created_at', 'DESC');
  5. }


metoda lang zwraca string z sciezka do tablicy z ew. kluczami do tlumaczenia.

Button to tak na prawde glupia struktura z metodami, ktora dostaje wiekszosc informacji w konstruktorze, a tworzony jest w kazdym handlerze po wykonaniu handle() na fabryce.

pozniej ladujemy z takim kodem w blade:
  1. foreach($filters->sort->buttons as $button) { $button->href, $button->isActive()}


Teraz moje pytanie, jak moge zabezpieczyc zeby handler zawsze mial te metody, problem w tym ze sa do niego wstrzykiwane argumenty i kiedy uzywam interfejsu dostaje blad ze metoda jest niezgodna z pierwowzorem.
Dwa, czy to ogolnie dobrze jest to przemyslane, nie jestem expertem i chcialbym sensowne odpowiedzi co wymagałoby zmiany lub jak powinienem do tego podejsc.
kod mi sie podoba bo w handlerze jest logika filtrowania, a w kontrolerze mam tylko te komendy listen, oraz moge podpiac jeden ten sam filtr np do Kategorii pod rozne parametry z roznymi argumentami (np rozne modele bo wymagana tam jest akurat instancja buildera)

Edit: O i zapomnialem o najwazniejszym, base handler posiada prywatna statyczna property, do trzymania wszystkich sluchanych parametrow, stwierdzilem ze to lepszy pomysl niz wstrzykiwanie wartosci przy tworzeniu handlera, chcialbym wiedziec czy to jest wlasnie odpowiednie wykorzystanie statica, bo juz sam nie wiem, oczywiscie akcesory mam niestatycznie w handlerze.

Z gory dzieki za pomoc
Pozdrawiam
Pyton_000
Czytam, czytam i nadal nie rozumiem wink.gif

Pokaż kod tych klas, i jak tego używasz.
Koldy
troche zmeczony bylem wink.gif
np klasa do sortowania buildera (order)
  1. namespace MyApp\Libraries\Filter\Handlers;
  2.  
  3. use Illuminate\Database\Eloquent\Builder;
  4. use Illuminate\Database\Eloquent\Collection;
  5. use MyApp\Libraries\Filter\BaseHandler;
  6.  
  7. class Order extends BaseHandler {
  8.  
  9.  
  10. /**
  11.   *
  12.   * ===============================================================
  13.   *
  14.   * Boot
  15.   *
  16.   * ===============================================================
  17.   *
  18.   *
  19.   *
  20.   *
  21.   *
  22.   *
  23.   *
  24.   */
  25. protected function boot(Builder $builder) {
  26. $this->builder = $builder;
  27. switch(get_class($builder->getModel())) {
  28. case 'MyApp\Models\Sale': $name = 'title'; break;
  29. default: $name = 'name';
  30. }
  31. $this->column = $name;
  32. return ['name', 'name-inv'];
  33. }
  34.  
  35.  
  36. /**
  37.   *
  38.   * ===============================================================
  39.   *
  40.   * Filter
  41.   *
  42.   * ===============================================================
  43.   *
  44.   *
  45.   *
  46.   *
  47.   *
  48.   *
  49.   *
  50.   */
  51. protected function filter() {
  52. switch($this->value()) {
  53. case 'name': $this->builder->orderBy($this->column); break;
  54. case 'name-inv': $this->builder->orderBy($this->column, 'DESC'); break;
  55. default: $this->builder->orderBy('created_at', 'DESC');
  56. }
  57. }
  58.  
  59.  
  60. /**
  61.   *
  62.   * ===============================================================
  63.   *
  64.   * Langauage array
  65.   *
  66.   * ===============================================================
  67.   *
  68.   *
  69.   *
  70.   *
  71.   *
  72.   *
  73.   *
  74.   */
  75. protected function lang() {
  76. return trans('categories.sort');
  77. }
  78.  
  79.  
  80.  
  81. }


a w kontrolerze wyglada to tak
  1. public function homeSupplierListings(Filters $filters) {
  2. $businessTypes = Category::supplierCategories()->parents()->get();
  3. $businesses = Business::suppliers()->with(['categories','images']);
  4.  
  5. $filters->listen('cat', 'Categories', [$businessTypes, $businesses])
  6. ->listen('name', 'Search', [$businesses])
  7. ->listen('sort', 'Order', [$businesses])
  8. ->handle();
  9.  
  10. return view('home/listings')
  11. ->with('filters', $filters->render('cat'))
  12. ->with('businesses', $businesses->get());
  13. }


a w widoku jak chcemy uzyc przyciskow z wyrenderowanymi linkami to tak:
  1. foreach($filters->sort->buttons as $button) { "<a href etc" $button->href, $button->isActive()}


Reszte informacji jest w pierwszym poscie, troche chaotycznie, ale teraz powinienes zrozumiec.
Dzieki
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-2024 Invision Power Services, Inc.