![]() |
![]() ![]() |
![]() |
![]()
Post
#1
|
|
Grupa: Zarejestrowani Postów: 39 Pomógł: 4 Dołączył: 9.05.2012 Ostrzeżenie: (0%) ![]() ![]() |
Witam
Chciałbym stworzyć routing, do własnej implementacji MVC. Na początku przedstawię strukturę katalogów mojego projektu. (IMG:http://img855.imageshack.us/img855/6812/struktura.gif) W folderze app, będą pliki danego projektu. Każdy contoller będzie miał swój plik .yml w którym będą zapisane zasady routingu. przykładowy plik index.yml prefiks oznacza wpisany adres url, contoller i action wiadomo.
i tak działa mój routing: 1. ktoś wpisuje adres na mojej stronie np. index/show/40 2. sprawdzane jest czy istnieje dany controller o nazwie index, akcja show i parametr 40 3. jesli tak to uruchamiany jest odpowiednia akcja z contollera Routing.php
Bootstrap.php
Chciałbym aby mój kod był uniwersalny i był elastyczny dla wielu różnych projektów. Chciałbym też aby został napisany o dobre praktyki OOP. Głównie to właśnie zależy mi na wysokiej jakości kodu. Co myślicie o takim rozwiązaniu tego zagadnienia? Wszystko działa w tym routingu. Jednak bardzo mi zależy aby pisać przemyślany kod. Gdzie popełniłem jakiś błąd projektując ten routing ? |
|
|
![]()
Post
#2
|
|
Grupa: Zarejestrowani Postów: 673 Pomógł: 106 Dołączył: 31.12.2008 Ostrzeżenie: (0%) ![]() ![]() |
kilka uwag, jeśli chcesz własny, a jednak przemyślany to:
1. prefix - troch nietrafna nazwa, lepiej to zarezerwuj na przypadki typu: w głównym routingu importujesz jakiś poboczny i dajesz prefix "/admin" (przykładowo) i wtedy na początku każdego url w tamtym routingu dodawany jest "/admin/dalsza_czesc_url" 2. podziel to na sekcje Kod [nazwa routingu]: url: /przyklad-z-akcja/nazwa-akcji/con:controller/page-id-:page defaults: action: show controller: products require: page: [0-9]+ użytkownik wpisuje: 1. /przyklad-z-akcja/nazwa-akcji/congruszka/page-id-3 ma controller: gruszka, action: show, page: 3 2. /przyklad-z-akcja/nazwa-akcji/con/page-id-300 ma controller: products, action: show, page: 300 3. /przyklad-z-akcja/nazwa-akcji/congruszka/page-id- ma 404, bo page nie jest liczbą --------edit-------- czytaj i czerp pomysły (najlepsza metoda): symfony cakephp codeigniter ... Ten post edytował r4xz 13.01.2013, 17:44:51 |
|
|
![]()
Post
#3
|
|
Grupa: Zarejestrowani Postów: 39 Pomógł: 4 Dołączył: 9.05.2012 Ostrzeżenie: (0%) ![]() ![]() |
użytkownik wpisuje: 1. /przyklad-z-akcja/nazwa-akcji/congruszka/page-id-3 ma controller: gruszka, action: show, page: 3 2. /przyklad-z-akcja/nazwa-akcji/con/page-id-300 ma controller: products, action: show, page: 300 3. /przyklad-z-akcja/nazwa-akcji/congruszka/page-id- ma 404, bo page nie jest liczbą nie bardzo rozumiem co miałeś na myśli w /przyklad-z-akcja/ czy powinienem użyć namespace w takim projekcie ? |
|
|
![]()
Post
#4
|
|
Grupa: Zarejestrowani Postów: 4 298 Pomógł: 447 Dołączył: 16.11.2006 Ostrzeżenie: (0%) ![]() ![]() |
Zapisz ścieżkę do aplikacji w jakiejś stałej, ponieważ teraz jak przeniosę pliki aplikacji do innego folderu, to cały FW się wysypie.
Co skłoniło Cie, aby użyć yaml zamiast tablic? @up r4xz - chyba miał na myśli standardowe podejście do routingu (które imo mało kiedy się praktykuje). Cytat czy powinienem użyć namespace w takim projekcie ? Jeśli tego nie zrobiłeś do tej pory to źle (IMG:style_emoticons/default/tongue.gif) bez NS się nie ruszysz, szczególnie w FW. Ten post edytował !*! 13.01.2013, 18:11:22 |
|
|
![]()
Post
#5
|
|
Grupa: Zarejestrowani Postów: 39 Pomógł: 4 Dołączył: 9.05.2012 Ostrzeżenie: (0%) ![]() ![]() |
okej, tą ścieżkę i autoloader miałem w planach (IMG:style_emoticons/default/smile.gif)
wiesz jestem początkujący, więc gdy zobaczyłem pliki yml. w symfony2 uznałem, że jest to fajne i przejrzyste. Po prostu spodobało mi się to Ten post edytował brzoza91 13.01.2013, 18:19:16 |
|
|
![]()
Post
#6
|
|
Grupa: Zarejestrowani Postów: 673 Pomógł: 106 Dołączył: 31.12.2008 Ostrzeżenie: (0%) ![]() ![]() |
uznałem, że jest to fajne i przejrzyste za 3 (czysty strzał) lata jak wejdzie (do powszechnego użytku) PHP 5.4, to tablice będą bardzo czytelne (choć teraz jak je umiejętnie pisać to też są bardzo czytelne)... no ale to taki mały offtopic (IMG:style_emoticons/default/smile.gif) co do '/przyklad-z-akcja/nazwa-akcji' faktycznie niefortunnie teraz ja dobrałem tekst, chodziło mi że jest to jakiś stały tekst, jaki musi zawierać (a nawet od którego musi się zaczynać) adres, równie dobrze mogłem napisać '/aaa/bbb' i nie wiem które to standardowe, ale nie miałem na myśli: /:controller/:action/:param1 etc. etc. |
|
|
![]()
Post
#7
|
|
Grupa: Zarejestrowani Postów: 39 Pomógł: 4 Dołączył: 9.05.2012 Ostrzeżenie: (0%) ![]() ![]() |
tworząc każdy nowy projekt będę tworzył nowe pliki w folderze app. W folderze core nic nie będę zmieniał/dodawał.
tak więc mam użyć namespace tylko dla folderu app, czy dla wszystkich folderów ? w pliku core/Contoller.php dodalem
w pliku app\controllers\IndexController.php
czy dobrze to zaplanowałem ? Ten post edytował brzoza91 13.01.2013, 21:09:58 |
|
|
![]()
Post
#8
|
|
Grupa: Zarejestrowani Postów: 4 298 Pomógł: 447 Dołączył: 16.11.2006 Ostrzeżenie: (0%) ![]() ![]() |
Poczytaj o standardach PSR-0/1/2 tam masz wyjaśnione jak i co nazwać. Pierwsze słowa w NS to nazwa aplikacji do jakiej należy, dzięki temu unikniesz kolizji z innymi aplikacjami np. forum innego autora.
Ten post edytował !*! 13.01.2013, 21:12:01 |
|
|
![]()
Post
#9
|
|
Grupa: Zarejestrowani Postów: 39 Pomógł: 4 Dołączył: 9.05.2012 Ostrzeżenie: (0%) ![]() ![]() |
okej, poczytam.
ale gdy użyje takich przestrzeni nazw jak wyżej opisałem, dostaję taki błąd Fatal error: Class 'App\Contollers\IndexContoller\Controller' not found in C:\wamp\www\framework\app\controllers\IndexController.php on line 13 |
|
|
![]()
Post
#10
|
|
Grupa: Zarejestrowani Postów: 4 298 Pomógł: 447 Dołączył: 16.11.2006 Ostrzeżenie: (0%) ![]() ![]() |
klasa.php
index.php
lub jak masz kolizje w przestrzeni nazw to
Ten post edytował !*! 13.01.2013, 21:30:41 |
|
|
![]()
Post
#11
|
|
Grupa: Zarejestrowani Postów: 39 Pomógł: 4 Dołączył: 9.05.2012 Ostrzeżenie: (0%) ![]() ![]() |
a gdzie byście umieścili obiekt klasy PDO ?
w klasie Contoller czy w klasie Model ? Wiem, że to Model pracuje z bazą danych. ale czy umieszczenie go w Contoller nie było by wygodniejsze ? |
|
|
![]()
Post
#12
|
|
Grupa: Zarejestrowani Postów: 4 298 Pomógł: 447 Dołączył: 16.11.2006 Ostrzeżenie: (0%) ![]() ![]() |
Wiem, że to Model pracuje z bazą danych. ale czy umieszczenie go w Contoller nie było by wygodniejsze ? Nie, ponieważ kontroler ma kierować "ruchem" poszczególnych elementów aplikacji, a nie zajmować się tym co mają wykonać. Kontroler wysyła i odbiera dane z modelu, aby na ich podstawie móc przekazać je do widoku i na tym w zasadzie kończy się jego zadanie. Tzw. dobudówka na PDO to może być część pakietu Core lub Lib, patrząc na Twoje drzewo katalogów, to będzie /core/libs Ten post edytował !*! 14.01.2013, 10:33:06 |
|
|
![]()
Post
#13
|
|
Grupa: Zarejestrowani Postów: 39 Pomógł: 4 Dołączył: 9.05.2012 Ostrzeżenie: (0%) ![]() ![]() |
a gdzie byście umieścili obiekt klasy PDO ? w klasie Contoller czy w klasie Model ? Wiem, że to Model pracuje z bazą danych. ale czy umieszczenie go w Contoller nie było by wygodniejsze ? nie do końca dobrze opisałem to o co mi chodzi, wiec poprawię pytanie (IMG:style_emoticons/default/smile.gif) chciałem zapytać się czy mogę konstruować zapytanie w controller. przykład niżej:
Ten post edytował brzoza91 16.01.2013, 15:16:03 |
|
|
![]()
Post
#14
|
|
Grupa: Zarejestrowani Postów: 2 707 Pomógł: 290 Dołączył: 16.12.2008 Skąd: Śląsk Ostrzeżenie: (0%) ![]() ![]() |
Co zawiera obiekt $user? Po co dajesz do $users obiekt User skoro go nie wykorzystujesz? Ogólnie źle - zapytania, działania na plikach itp w modelu. W kontrolerze wywoływanie odpowiednich obiektów i metod oraz walidacje, kontrole dostępu, przekierowania. W widoku wyświetlenie zmiennych, pętle, proste instrukcje. To tak w skrócie. |
|
|
![]()
Post
#15
|
|
Grupa: Zarejestrowani Postów: 39 Pomógł: 4 Dołączył: 9.05.2012 Ostrzeżenie: (0%) ![]() ![]() |
|
|
|
![]()
Post
#16
|
|
Grupa: Zarejestrowani Postów: 4 298 Pomógł: 447 Dołączył: 16.11.2006 Ostrzeżenie: (0%) ![]() ![]() |
@up przeczytaj raz jeszcze mój ostatni post i to co napisał markonix "obrazkowo" ma to wyglądać tak:
Model:
Widok:
Ten post edytował !*! 17.01.2013, 10:28:45 |
|
|
![]()
Post
#17
|
|
Grupa: Zarejestrowani Postów: 39 Pomógł: 4 Dołączył: 9.05.2012 Ostrzeżenie: (0%) ![]() ![]() |
wcześniej miałem prawie identycznie to zaprojektowane. tylko doszedłem wtedy do pewnego problemu. W jednej akcji kontrolera potrzebuję wszystkich użytkowników, więc tak będzie to wyglądać(mowa jest o akcjach w kontrolerze)
W powyższy sposób pobrałem wszystkich userów. A co zrobić jeśli chcę pobrać wszystkich userów z jakim s warunkiem+ JOIN z inna tabelą |
|
|
![]()
Post
#18
|
|
Grupa: Zarejestrowani Postów: 2 707 Pomógł: 290 Dołączył: 16.12.2008 Skąd: Śląsk Ostrzeżenie: (0%) ![]() ![]() |
Utwórz nową metodę która pobierze "wszystkich userów z jakim s warunkiem+ JOIN z inna tabelą ".
Jeżeli to jakiś warunek klasowy np. chcesz pobrać wszystkich o określonej grupie to warto nazwę grupy ustalać jako argument metody, żeby była bardziej elastyczna i nie robić niepotrzebnych metod typu getAllAdminUser, getAllXyzUsers tylko getUsersByType($type = 'normal) |
|
|
![]()
Post
#19
|
|
Grupa: Zarejestrowani Postów: 1 045 Pomógł: 141 Dołączył: 19.09.2006 Skąd: B-tów Ostrzeżenie: (0%) ![]() ![]() |
wiem że pewnie teraz zostanę zbesztany ale co tam (IMG:style_emoticons/default/tongue.gif)
W większości przypadków nie widzę potrzeby używania modelu(no może poza tym że wzorzec tak nakazuje) ponieważ w znacznej większości metody modelu to po prostu SELECT * FROM tabela i zapisanie tego do tablicy. W ten sposób powstaje cała masa metod z których w wiekowości korzystam tylko raz, oczywiście można by je odpowiednio parametryzować ale w końcu dojdzie do takiej sytuacji że prawie całe zapytanie będę zapisywał w parametrach funkcji. Ja wolę napisać dokładnie takie zapylanie jakiego potrzebuję bezpośrednio w kontrolerze i nie muszę się przejmować jak chcę dodać kolejnego jojn'a że coś innego przestanie działać prawidłowo czy tak wydajnie jak by mogło. Poza tym dla mnie taki zapis w brew pozorom jest bardziej czytelny. Znając życie pojawi się argument że modele łatwiej poddaje się testom. On ok ale co można testować jeśli w metodzie modelu mamy tylko zapytanie do SQL i nic więcej ? Oczywiście stosuję modele ale tylko wtedy gdy wiem że kod w dokładnie takiej postaci będę potrzebował w kilku akcjach i nie jest pojedyncze zapytanie ale coś co wymaga dodatkowej obróbki po stronie php. Moim zdaniem to właśnie powinien robić model - obrabiać złożone dane, a nie robić każdego select'a do bazy Inną rzeczą którą często robię(a co zapewne wiele osób uzna za bardzo błędne) jest przekazywanie uchwytu do wyniku zapytania do widoku - oczywiście zakładając że wynik zapytania ma być tylko wyświetlony, a nie poddawany dalszej obróbce. Czyli np. $vies->dane=$this->db->query('SELECT ....'); i dopiero w widoku robię pętlę while do listowania wyniku. Dlaczego tak ? Dla mnie odpowiedź jest prosta, jeśli chciałbym zrobić pętlę while w modelu czy w kontrolerze musiałbym zapisać te wszystkie dane do tablicy, tablicę przekazać do widoku i na koniec w widoku stworzyć drugą pętlę która te dane wyświetli. Czyli muszę zadeklarować dodatkową tablicę i użyć dwóch pętli, a przy moim rozwiązaniu używam tylko jednej pętli |
|
|
![]()
Post
#20
|
|
Grupa: Zarejestrowani Postów: 142 Pomógł: 24 Dołączył: 30.03.2009 Skąd: Rokitno Szlacheckie Ostrzeżenie: (0%) ![]() ![]() |
wiem że pewnie teraz zostanę zbesztany ale co tam (IMG:style_emoticons/default/tongue.gif) W większości przypadków nie widzę potrzeby używania modelu(no może poza tym że wzorzec tak nakazuje) ponieważ w znacznej większości metody modelu to po prostu SELECT * FROM tabela i zapisanie tego do tablicy. [...] No właśnie nie... bo dane z modelu powinny zostać opakowane w obiekty (encje) i te encje są dopiero kwintesencją modeli (a na modele przy okazji można nałożyć mappery). |
|
|
![]()
Post
#21
|
|
Grupa: Zarejestrowani Postów: 4 298 Pomógł: 447 Dołączył: 16.11.2006 Ostrzeżenie: (0%) ![]() ![]() |
sazian - tylko że w Twoim wypadku to już nie jest MVC, tylko samo VC, więc cała "magia" używania tego się sypie. Zakładając że chcesz zmienić odwołania do bazy, normalnie wymieniasz model na inny, a u Ciebie? Grzebiesz w kontrolerze? Czyli robisz dwie rzeczy zamiast jednej?
|
|
|
![]()
Post
#22
|
|
Grupa: Zarejestrowani Postów: 39 Pomógł: 4 Dołączył: 9.05.2012 Ostrzeżenie: (0%) ![]() ![]() |
no dobrze teraz wiem, że musi być w modelu obsługa bazy danych.
jednak nie wiem, jak dalej rozwiązać pobieranie danych z bazy danych. Do każdej akcji kontolera potrzebuję praktycznie innego zestawu danych z tej samej tabeli w bazie(czasami join, grupowanie, sortowania, sumy + where). Tak więc wystąpić może nieskończenie wiele różnych zapytań do bazy. A przecież nie będę w modelu tworzył tak wielkiej ilości funkcji. |
|
|
![]()
Post
#23
|
|
Grupa: Zarejestrowani Postów: 4 298 Pomógł: 447 Dołączył: 16.11.2006 Ostrzeżenie: (0%) ![]() ![]() |
Odpowiedź już padła, zakładając że masz dobry router a uri wygląda tak:
Cytat /user/all Przekazać masz wartość nr 2 czyli "all"
lub uri jakieś inne Cytat /user/all/name/stefan Zakładając że wybierasz przez router tylko "all" i "stefan"
itd. Oczywiście wszytko musisz rozplanować, sprawdzić 40 razy który wariant będzie dobry. Tak czy inaczej, jeśli masz klasę URI która pobiera tą wartość, to przez Router na nich operujesz odsyłając do kontrolera i metody z parametrami. Jeśli chcesz przekazywać parametry, to może Cie zainteresować ta funkcja call_user_func_array Ten post edytował !*! 18.01.2013, 14:51:38 |
|
|
![]() ![]() |
![]() |
Aktualny czas: 2.10.2025 - 04:48 |