Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [Laravel] Widok a kontroler
Nakiel
post
Post #1





Grupa: Zarejestrowani
Postów: 6
Pomógł: 0
Dołączył: 27.06.2003
Skąd: Bydgoszcz

Ostrzeżenie: (0%)
-----


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..?

Ten post edytował Nakiel 5.09.2016, 11:29:28
Go to the top of the page
+Quote Post
Pyton_000
post
Post #2





Grupa: Zarejestrowani
Postów: 8 068
Pomógł: 1414
Dołączył: 26.10.2005

Ostrzeżenie: (0%)
-----


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.
Go to the top of the page
+Quote Post
Nakiel
post
Post #3





Grupa: Zarejestrowani
Postów: 6
Pomógł: 0
Dołączył: 27.06.2003
Skąd: Bydgoszcz

Ostrzeżenie: (0%)
-----


Dzięki. Zrobiłem jak napisałeś. Działa i wygląda bardziej sensownie smile.gif
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 19.08.2025 - 15:48