Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [Laravel] Widok a kontroler
Forum PHP.pl > Forum > PHP > Frameworki
Nakiel
Witam,
Jestem w trakcie tworzenia nowego serwisu przy użyciu frameworka Laravel. Nadal się go uczę i nie do końca wiem, gdzie pewne elementy powinny być umieszczone.

W tej chwili mam kontroler:

  1. namespace App\Http\Controllers;
  2.  
  3. class ArticlesListController extends Controller
  4. {
  5.  
  6. public function getAlphabetBar($letter)
  7. {
  8. ...
  9. return $alphabet;
  10. }
  11.  
  12.  
  13. public function show($letter)
  14. {
  15.  
  16. $articles = \App\Article::
  17. ->where('active', 1)
  18. ->where('name', 'LIKE', $letter.'%')
  19. ->orderBy('name');
  20.  
  21. return view('articles.index', ['articles' => $articles,
  22. 'alphabet' => this->getAlphabetBar($letter)
  23. ]);
  24. }
  25. }


Nie podobają mi się w nim dwie pozycje. Po pierwsze funkcja do generowania linków alfabetu. Po kliknięciu w literę pokażą się artykuły zaczynające się od niej. Alfabet nie może być "na sztywno" zamieszczony w widoku, gdyż jest on generowany w zależności od dostępnych artykułów oraz wersji językowej. Gdzie w laravel jest miejsce na tego typu funkcje? może kompozytor widoku?

Druga sprawa to pobieranie danych do zbioru $articles. Czy powinno być to wykonywane w konstruktorze? Teoretycznie można by stworzyć klasę ArticlesList mniej więcej:

  1. class ArticlesList
  2. {
  3.  
  4. public function getAlphabetBar($letter)
  5. {
  6. ...
  7. return $alphabet;
  8. }
  9.  
  10. public function getArticlesByLetter($letter)
  11. {
  12. return \App\Article::
  13. ->where('active', 1)
  14. ->where('name', 'LIKE', $letter.'%')
  15. ->orderBy('name');
  16.  
  17. }
  18. }
  19.  
  20. //potem...
  21.  
  22. class ArticlesListController extends Controller
  23. {
  24.  
  25. public function show($letter)
  26. {
  27.  
  28. $articlesList = new ArticlesList();
  29.  
  30. return view('articles.index', ['articles' => $articlesList->getArticlesByLetter($letter),
  31. 'alphabet' => $articlesList->getAlphabetBar($letter)
  32. ]);
  33. }
  34. }


Niby problem rozwiązany, ale jak ta klasa ma się do frameworka? Czy może ma ona tam swoje miejsce jako np. kompozytor widoku, usługa,repozytorium itp..?
Pyton_000
Utwórz sobie klasę EloquentArticlesRepository i tam przenieś metodę generującą alfabet oraz metodę getArticleByLetter($lette)

Wtedy możesz sobie użyć tej klasy w widoku jako Service Injection (https://laravel.com/docs/5.3/blade#service-injection) żeby wygenerować sobie widok oraz w Kontrolerze żeby pobrać odpowiedni artykuł.

Dodatkowo klasa EloquentArticlesRepository() może implementować ArticlesRepositoryInterface z odpowiednimi metodami co za tym idzie potem możesz zrobić bindowanie do odpowiedniej implementacji.
Nakiel
Dzięki. Zrobiłem jak napisałeś. Działa i wygląda bardziej sensownie smile.gif
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.