![]() |
![]() |
![]()
Post
#1
|
|
Grupa: Zarejestrowani Postów: 117 Pomógł: 0 Dołączył: 8.07.2013 Ostrzeżenie: (0%) ![]() ![]() |
Witam. Przeglądam dokumentację Laravela, i widzę taki kod:
Chciałem napisać podobny router, właśnie do tego Laravela, i mam problem.. Załóżmy że tutaj jest router:
$var() - tutaj muszę podać argumenty, które przesłane zostały w function($id, $name). Nie było by problemu zwrócić coś, tylko jak mam wykryć ile zostało przesłanych argumentów? Ten post edytował Cinamicom 18.07.2014, 07:25:07 |
|
|
![]() |
![]()
Post
#2
|
|
![]() Grupa: Zarejestrowani Postów: 8 068 Pomógł: 1414 Dołączył: 26.10.2005 Ostrzeżenie: (0%) ![]() ![]() |
|
|
|
![]()
Post
#3
|
|
Grupa: Zarejestrowani Postów: 117 Pomógł: 0 Dołączył: 8.07.2013 Ostrzeżenie: (0%) ![]() ![]() |
Do funkcji wiem jak to zastosować, ale nie wiem jak zastosować to do $var();?
Bo jeśli wlepię to do get, to to mi zwróci path, i $var. A ja potrzebuję wiedzieć, jakie zostały wysłane do $var() Ten post edytował Cinamicom 18.07.2014, 07:48:04 |
|
|
![]()
Post
#4
|
|
![]() Grupa: Zarejestrowani Postów: 8 068 Pomógł: 1414 Dołączył: 26.10.2005 Ostrzeżenie: (0%) ![]() ![]() |
Jakieś dziwne coś napisałeś...
z $var zrobiłeś wywołanie funkcji która jest pod nazwą w $var i chcesz tam przekazać jakieś argumenty z kosmosu... Coś Ci się chyba pomieszało albo ja nie widzę drugiego dna |
|
|
![]()
Post
#5
|
|
Grupa: Zarejestrowani Postów: 117 Pomógł: 0 Dołączył: 8.07.2013 Ostrzeżenie: (0%) ![]() ![]() |
Zobacz..
To mi wyświetli - 1. Ale ja potrzebuję przewidzieć, ile idzie argumentów do $var. Teraz dałem dwa, $klocek i $bobek, ale jeśli dodam kolejne np. 2, wtedy do $var() muszę dodać jeszcze dwa. Ja potrzebuję do zautomatyzować. Raz idą dwa argumenty, raz idzie jeden, raz trzy. |
|
|
![]()
Post
#6
|
|
Grupa: Zarejestrowani Postów: 189 Pomógł: 13 Dołączył: 20.09.2008 Skąd: Lublin Ostrzeżenie: (0%) ![]() ![]() |
|
|
|
![]()
Post
#7
|
|
Grupa: Zarejestrowani Postów: 117 Pomógł: 0 Dołączył: 8.07.2013 Ostrzeżenie: (0%) ![]() ![]() |
|
|
|
![]()
Post
#8
|
|
Grupa: Zarejestrowani Postów: 189 Pomógł: 13 Dołączył: 20.09.2008 Skąd: Lublin Ostrzeżenie: (0%) ![]() ![]() |
nie mam 100% pewności, ale wg mnie to jest to samo, tylko opakowane w Route. żeby wywołać jakąś funkcję/metodę, w php nie musisz absolutnie znać ilości jej argumentów. jeśli zostanie wywołana z większą ich ilością, reszta zostanie pominięta. jeśli z mniejszą, a one nie mają domyślnych wartości, zgłoszony zostanie warning (jeśli dobrze pamiętam).
w powyższym przypadku string jest sprawdzany pod kątem istnienia zmiennych. to, że nazywają się tak samo jak w funkcji to tylko wymysł programisty, bo tak na prawdę w tym przypadku mogłyby się nazywać 'wtf' i 'wazzup'. //edit: jeśli chciałbyś uprzeć się na jakieś bardziej precyzyjne routery, które mogą przekazywać konkretne wartości jako konkretne parametry, to nie powinieneś korzystać z zapisu, który podałeś. Ten post edytował czychacz 18.07.2014, 09:13:59 |
|
|
![]()
Post
#9
|
|
Grupa: Zarejestrowani Postów: 117 Pomógł: 0 Dołączył: 8.07.2013 Ostrzeżenie: (0%) ![]() ![]() |
Dzięki.
Chciałbym, żeby to wyglądało jak w Django, albo tutaj. Definiuje adresy, w nich też zmienne. Np. /user/edit/{id} i tu odwołanie do jakies funkcji, np. $this->userEdit($id) Ten post edytował Cinamicom 18.07.2014, 09:33:07 |
|
|
![]()
Post
#10
|
|
Grupa: Zarejestrowani Postów: 189 Pomógł: 13 Dołączył: 20.09.2008 Skąd: Lublin Ostrzeżenie: (0%) ![]() ![]() |
nie korzystałem z django, ale ujmę to tak:
powinieneś stworzyć klasę routera, która analizowałaby taki string pod kątem zmiennych i zwracała do jakiejś zmiennej tablicę ze znalezionymi wartościami (oczywiście asocjacyjnie - chyba, że chcesz zrobić to tak, jak w cake, ale nie polecam). operowanie na zapisach takich, jak wspomniany przez ciebie jest mało precyzyjne. to obiekt kontrolujący requesta (w tym przypadku router) powinien odpowiednio rozdzielić żądanie - ale tutaj pojawia się problem z tym, że chcesz użyć funkcji. funkcje nie mogą sprawdzić kluczy dla parametrów do nich przekazanych. dla nich kluczami są nazwy zmiennych, więc jeśli pojawiają się tam jakieś parametry, klucze są pobierane z deklaracji nagłówka funkcji i można używać ich jako zmienne. dlatego odwołanie, o jakim wspominasz ($this->userEdit($id)) w sensie dosłownym nie jest możliwe. frameworki pod tym kątem mają bardziej rozbudowaną obsługę routingu, polegającą na współpracy z obiektami routera, requesta i kontrolera inicjalizującego przekierowanie na podkontroler. w twoim przypadku powinieneś zrobić coś podobnego, ale zakładam, że korzystasz z gotowego kodu i chcesz go rozbudować a nie zmieniać. zajrzyj do kodu jakiegoś prostego frameworka i znajdź klasę routingu. tam zobaczysz, jak to jest robione. ja ci tego nie opiszę, bo to temat-rzeka, a i tak dużo zależy od tego, z czym będą współgrać odpowiednie klasy. |
|
|
![]()
Post
#11
|
|
Grupa: Zarejestrowani Postów: 117 Pomógł: 0 Dołączył: 8.07.2013 Ostrzeżenie: (0%) ![]() ![]() |
Chcę napisać od zera. A do przeanalizowania kodu, jaki ten framework polecasz? Nie chcę krowy pokroju zenda.
W django jest coś na zasadzie takiej, napiszę to po swojemu: urls( "user/edit/{id}", "odpowiedni-kontroler" ) a kontroler a parametrze odbiera sobie te id. Ten post edytował Cinamicom 18.07.2014, 09:54:39 |
|
|
![]()
Post
#12
|
|
Grupa: Zarejestrowani Postów: 189 Pomógł: 13 Dołączył: 20.09.2008 Skąd: Lublin Ostrzeżenie: (0%) ![]() ![]() |
na upartego nawet cake w wersji 2. ale podejdź do jego kodu bardziej analitycznie niż kopiuj-wklej, bo kod cake (a raczej nie sam kod, ale podejście do tematów) idealny nie jest. potraktuj tamten kod jako przykład.
//edit: nie chcę podchodzić do analizy django, bo nic o nim nie wiem. wiem tylko, że osiągnięcie celu w taki sposób, o jakim pisałeś wcześniej (edit: w php), nie jest możliwe, ale jeśli pójdziesz w trochę inną stronę, to może się udać. Ten post edytował czychacz 18.07.2014, 09:57:51 |
|
|
![]()
Post
#13
|
|
Grupa: Zarejestrowani Postów: 117 Pomógł: 0 Dołączył: 8.07.2013 Ostrzeżenie: (0%) ![]() ![]() |
Szybkie spojrzenie okiem na tysiące linijek routera od cake, i zdaję sobie sprawę, jak mało wiem..
Może lepszym rozwiązaniem byłoby, użycie gotowe frameworka? Ale ja jakoś nie lubię pisać na cudzym kodzie.. Ten post edytował Cinamicom 18.07.2014, 10:02:12 |
|
|
![]()
Post
#14
|
|
Grupa: Zarejestrowani Postów: 189 Pomógł: 13 Dołączył: 20.09.2008 Skąd: Lublin Ostrzeżenie: (0%) ![]() ![]() |
jeśli nie chcesz pisać w cudzym frameworku, a nie masz wiedzy odnoszącej się do konstrukcji routerów to masz wyjścia:
- przeanalizować kod routera z jakiegoś frameworka (to wyeliminowałeś) - poczytać o działaniu routerów (google, książki) - podejść do tego kreatywnie i samemu próbować napisać router, ale do tego potrzebna jest wiedza o PHP większa niż podstawowa domyślam się, że pozostaje ci tylko opcja druga. zdobądź wiedzę teoretyczną z jakichś książek albo z google. popytaj o dobre książki traktujące o PHP (najlepiej z uwzględnieniem MVC, bo tam najprawdopodobniej będzie najwięcej informacji o routerach), ale nie takie z gotowymi rozwiązaniami, ale z większą ilością wiedzy teoretycznej - tylko wyjaśnienia jako przykład. na upartego też czysto: http://quadric.goblix.pl/programowanie/wzo...we-router-cz-1/ i części kolejne. ewentualnie poszukaj też o innych wzorcach projektowych |
|
|
![]()
Post
#15
|
|
Grupa: Zarejestrowani Postów: 117 Pomógł: 0 Dołączył: 8.07.2013 Ostrzeżenie: (0%) ![]() ![]() |
|
|
|
![]()
Post
#16
|
|
![]() Grupa: Zarejestrowani Postów: 1 798 Pomógł: 307 Dołączył: 13.05.2009 Skąd: Gubin/Wrocław Ostrzeżenie: (0%) ![]() ![]() |
To o czym piszesz jest funkcją anonimową. Działanie takiego routera nie jest jakieś super skomplikowane. Więc ten ciąg który jest podawany jako pierwszy argument, jest parsowany 2 razy. Raz po to żeby wydobyć z niego "zmienne" (preg_match_all), a drugi raz po to żeby stworzyć z tego ciągu wyrażenie regularne (preg_match i pewnie jakieś jeszcze funkcje). Za pierwszym razem powstaje tablica z parametrami które masz w klamrach, a za drugim razem powstaje również tablica z parametrami z wyrażenia regularnego. Następnie obie tablice są porównywane (array_filter), i tak otrzymane parametry podajesz tej funkcji anonimowej (call_user_func_array) która jest podana jako drugi parametr.
Co do pisania w "cudzym" kodzie. Kiedyś myślałem trochę podobnie, że jak przerobię router z symfony1 na swoje potrzeby to będzie DUŻO lepiej to działać niż w oryginale. Przerobić, przerobiłem. Działać, działał. Ale czy lepiej, to już nie do końca. Ale najgorsze nie było to, tylko fakt że zamiast tworzyć coś co powinienem, skupiałem się na "fundamentach" w efekcie czego, jakiekolwiek moje prace szły bardzo powoli. Jak czas ci nie straszny - baw się, twórz swoje rozwiązania. Jak jednak zależy ci na czasie, to lepiej naucz się prostego wykorzystania dostępnych narzędzi, zamiast pisać je na nowo. |
|
|
![]()
Post
#17
|
|
Grupa: Zarejestrowani Postów: 117 Pomógł: 0 Dołączył: 8.07.2013 Ostrzeżenie: (0%) ![]() ![]() |
Co do pisania w "cudzym" kodzie. Kiedyś myślałem trochę podobnie, że jak przerobię router z symfony1 na swoje potrzeby to będzie DUŻO lepiej to działać niż w oryginale. Przerobić, przerobiłem. Działać, działał. Ale czy lepiej, to już nie do końca. Ale najgorsze nie było to, tylko fakt że zamiast tworzyć coś co powinienem, skupiałem się na "fundamentach" w efekcie czego, jakiekolwiek moje prace szły bardzo powoli. Jak czas ci nie straszny - baw się, twórz swoje rozwiązania. Jak jednak zależy ci na czasie, to lepiej naucz się prostego wykorzystania dostępnych narzędzi, zamiast pisać je na nowo. Nigdzie mi się nie śpieszy, a wole poświęcić x czasu, i napisać coś swojego. Aktualnie mam jeden taki framework, ale chciałbym napisać inny, bardziej rozbudowany. Chociaż jak patrzę na te wszystkie frameworki, myślę sobie - nigdy nie dorównam tym frameworkom, i czy czy jest sens w takim razie, robienie czegoś gorszego? |
|
|
![]()
Post
#18
|
|
![]() Grupa: Zarejestrowani Postów: 1 798 Pomógł: 307 Dołączył: 13.05.2009 Skąd: Gubin/Wrocław Ostrzeżenie: (0%) ![]() ![]() |
Wiesz, w sumie to już kolejny temat na tego typu gadkę, więc zamiast przepisywać to samo, zwyczajnie zlinkuje ci swojego posta: http://forum.php.pl/index.php?showtopic=23...p;#entry1115870
Na prawdę, pobaw się jakimiś gotowymi komponentami, zepnij je w jakąś sensowną całość i masz już gotowe "swoje" środowisko. |
|
|
![]() ![]() |
![]() |
Wersja Lo-Fi | Aktualny czas: 24.07.2025 - 23:29 |