Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [inny]Route w Laravel
Forum PHP.pl > Forum > PHP > Frameworki
damian1
Witam
Chciałbym uzyskać taki efekt możliwie najprostszym sposobem:
../category/subcategory/id ze wszystkimi możliwymi kombinacjami np: .../id, ../subcategory, ../subcategory/id

Otóż w zasadzie napisałem kod, który działa. Trzy niewiadome były jeszcze znośne, ale potrzebuje jeszcze utworzyć podobny na ok. 5 niewiadomych (już sama myśl mnie przeraża), dlatego chciałem się spytać czy nie ma czasem jakiegoś prostszego sposobu? Mam przeczucie, że jednak nie do końca wykorzystuje możliwości frameworka (mój pierwszy projekt).

A jeśli chodzi o wady poniższego kodu to:
-każdorazowo muszę sprawdzać 'category_name', czyli po prostu warianty kategorii. Jest ich ok.7, więc jest jeszcze ok.
-sam kod to potworek (wkleiłem tylko pierwszy szkielet). W rzeczywistości w każdym if-ie rozważanych jest jeszcze kilka możliwości z każdorazowym połączeniem z bazą danych.

routes.php
  1. Route::get('home/{category?}/{subcategory?}/{id?}', array('as' => 'home/{category?}/{subcategory?}/{id?}', 'uses' => 'HomeController@test'))->where(array('id' => '[0-9]+'));



HomeController
  1. public function test($category= null, $subcategory = null, $id = null ) {
  2.  
  3. if ($category && $subcategory && $id) {
  4. return 'Kategoria: '.$category.'</br>'.'Subcategory: '.$subcategory.'</br>'.'Id: '.$id.'</br>';
  5. } elseif ($category && $subcategory) {
  6. if( $subcategory > 0 ) {$id = $subcategory; $subcategory= null;}
  7. if( $category != 'category_name') {$subcategory = $category; $category= null;}
  8. if( $category != 'category_name' && $id == null) {return Redirect::to('home');}
  9. return '2 opcja:<br>Kategoria: '.$category.'</br>'.'Subcategory: '.$subcategory.'</br>'.'Id: '.$id.'</br>';
  10. } elseif ($category) {
  11. if( $category > 0) {$id = $category; $category= null;}
  12. elseif( $category != 'category_name') {$subcategory = $category; $category= null;}
  13. return '3 opcja:<br>Kategoria: '.$category.'</br>'.'Subcategory: '.$subcategory.'</br>'.'Id: '.$id.'</br>';
  14. }
  15. else {
  16. return "4 opcja";
  17. }
  18. }



Do tego wszystkiego dochodzi parę drobnych filtracji przesyłanych za pomocą sesji, w zależności od tego co wybierze użytkownik w checkbox-ie.
by_ikar
Wcięcia i nowe linie nie spowalniają ci aplikacji, one są dla ciebie.. Więc używaj ich na litość..

Według mnie to beznadziejnie do tego podszedłeś, przecież to nie musi być w jednej akcji wszystko, powiedz lepiej co konkretnie chcesz osiągnąć.

PS. as w routingu nie służy do podania regułki, tylko skróconej/czytelniejszej nazwy routa, dzięki czemu łatwiej można później wygenerować link.
Pyton_000
Coś mi się zdaje że źle się do tego zabierasz.

Powiedz dokładniej co robisz i co chcesz osiągnać
damian1
Witam
W zasadzie to galeria zdjęć. Chodzi mi o coś takiego:
www.adres-strony.pl/WIELKA-KATEGORIA/{category}/{subcategory}/{subcategory2}/{id}
Do tej pory napisałem kod na 3 niewiadome ({category/{subcategory}/{id}), ale jak wspomniałem wczesniej wiem, że będe potrzebował podobny na 4-5 niewiadomych.

Na Wielką kategorię mam routing, a następne części chce by były dynamiczne, bo jest dużo możliwości.
{category}- ok. 8-10, {subactegory}-ok.50, a dalej tylko więcej.

Chce by na podstawie tych wartości odbywało się pobranie z bazy danych. Jeśli podane jest tylko {category} to wyszukuje tylko na tej podstawie i zwraca listę zdjęć. jeśli podane jest {id} zwraca konkretne zdjęcie.
Inne możliwości to np: {category}{subcategory2}{id}, {category}{subcategory}..... W zasadzie wszystkie.
I wygląda to mniej więcej tak:

  1. ...
  2. elseif($id) {
  3. $title = "Title";
  4. $photos = Photo::where('id', '=', $id)->where('wid', '<=', $wis)->get();
  5. $prev = //zapytanie o poprzednie id zdjęcia
  6. $next =//zapytanie o następne id zdjęcia
  7. $powrot = null; //by wiedzieć, gdzie wrócić. Inna możliwość to np: $powrot= $category.'/'.$subcategory
  8. // własnie w zależności od if-a.
  9. return View::make('galeria.photo')->with('photos', $photos)
  10. ->with('title', $title)
  11. ->with('id', $id)
  12. ->with('prev', $prev)
  13. ->with('next', $next)
  14. ->with('powrot', $powrot);
  15. ...


Zmienna $wid (widoczność) jest przesyłana w sesji i ustalana na początku, w zależności od tego czy zmienna istnieje bądź nie. W przyszłości w sesji planuje również przesłać różne drobniejsze filtracje np: nie wiem - koloru.

Zobaczę jeszcze, czy ewentualnie zmiennych w with nie da się przesłać w 1 tablicy i dziękuje odnośnie uwagi o 'as' - już doczytałem więcej.
ctom
@damian1 małe podpowiedzi :

1 / ROUTE -> pocztaj o "any"

2 / "pobieranie tych Twoich niewiadomych" -> pocztaj o Request::segment()

3 / przekazywanie "zmiennych w with" -> pocztaj w maualu PHP o compact()
damian1
Dziękuję za podpowiedzi, z pewnością niektóre wykorzystam, aczkolwiek nie rozwiązują do końca moich problemow.
A w zasadzie 1 problemu: jak szybko rozpoznać, że {category}, nie jest {subcategory} i podam przykład:
www.adres-strony.pl/krajobraz/góry/skały/
I jeśli użyłbym $request = Request::segment(2) pobrałoby góry, a jeśli adres wyglądałby inaczej:
www.adres-strony.pl/krajobraz/skały/
pobrałoby skały i powstałby mały konflikt w bazie danych:
1)$photos = Photo::where('kryterium_ksztalt_terenu', '=', $request)->get();
2)$photos = Photo::where('kryterium_przedmiot', '=', $request)->get();
a nie mógłbym na stałe użyć pierwszego adresu, bo skały są nie tylko w górach, ale też na nizinach, nad morzem...
Poprzez sesje filtruje dodatkowo (w razie potrzeby) kolor, rozmiar, kształt...

W moim pierwszym kodzie miałem 3 "niewiadme".
Wersja z 2 możliwościami (Request::segment(1), Request::segment(2)) // www.adres-strony.pl/kategoria/7
Id potraktowana jako liczba
  1. elseif ($category && $subcategory) {
  2. if( $subcategory > 0 ) {$id = $subcategory; $subcategory= null;}

Na wyjściu otrzymuje $category=kategoria, $galeria=null, $id=7 i teraz mogę wygodnie przeszukiwać bazę danych.
Problem polega na tym, że muszę jeszcze rozważyć kategoria/galeria ; galeria/5, czyli rozróżnić kategorie i galerię.
W związku z tym przeszukuje z góry ustalone możliwości kategorii i jeśli ich nie znajduję ustawiam $kategoria=null,
$galeria= to co wpisane;


I teraz podobny problem muszę rozważyć na pięciu niewiadomych. Myślałem, że jest jakiś prostszy sposób, ale bez własnej funkcji chyba się jednak nie obejdzie. I teraz pytanie jak zrobić to najbardziej optymalnie? Na razie najlepszy pomysł jaki mi przychodzi do głowy to przedrostki:
kat-kategoria,sub-subcategoria... tylko nie w Route, bo by nie działało, tylko po prostu jako nazwy i odpowiednio je później wykryć. Nie mniej tego wolałbym uniknąć.


Dziękuje za dotychczasowa pomoc.


<!-- EDIT -->
Ok, albo w sumie zrobię jak mówicie, a skałę potraktuje jako wyjątek i będzie ewentualnie dosyłana w sesji.
Mam jeszcze tylko kilka pytań optymalizacyjnych (w sumie może głupie, ale tylko domyślam się niektórych odpowiedzi). Ktoś ma doświadczenie co może być szybsze?
1) Zapisanie kategorii, subkategorii w bazie danych jako 1,2,3..... i filtrowanie w PHP if($category == 'gory'){$category =1;} i wyszukanie: ...where('category', '=', $category)..., czy od razu zapisanie w bazie danych "stringów"?
2)Powinienem stworzyć relacyjną bazę danych np: category, subcategory, subcategory2 - 1 tabelka, tile, lokazlizacja, opis, widoczność - 2 tabelka? Czy nie będzie przeszkadzało jak bede miał wszystko w 1 tabelce z indeksowaniem, niektórych kolumn?

albo jakaś dobra strona, gdzie mógłbym o tym doczytać...
memory
Oczywiście, że jest prostszy. Klasyczny problem to i klasyczne rozwiązanie. Poczytaj o drzewkach Trees in SQL databases, nasted tree
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.