Cinamicom
18.07.2014, 07:23:12
Witam. Przeglądam dokumentację Laravela, i widzę taki kod:
Route::get('user/{id}/{name}', function($id, $name)
{
//
})
Chciałem napisać podobny router, właśnie do tego Laravela, i mam problem..
Załóżmy że tutaj jest router:
class Router {
public static function get
($path, $var) { $var();
}
}
$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?
Pyton_000
18.07.2014, 07:32:21
Cinamicom
18.07.2014, 07:38:07
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()
Pyton_000
18.07.2014, 07:47:47
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
Cinamicom
18.07.2014, 08:18:10
Zobacz..
funkcja('Łan', function($klocek, $bobek) {
});
funkcja($one, $var) {
$var(1, 2);
}
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.
czychacz
18.07.2014, 08:19:56
Cinamicom
18.07.2014, 08:59:17
Dzięki za odp, ale tą metodę też znam.
Zalezy mi ,zeby to działało tak jak tutaj:
Route::get('user/{id}/{name}', function($id, $name)
{
//
})
czychacz
18.07.2014, 09:12:20
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ś.
Cinamicom
18.07.2014, 09:18:52
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)
czychacz
18.07.2014, 09:35:23
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.
Cinamicom
18.07.2014, 09:52:29
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.
czychacz
18.07.2014, 09:55:23
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ć.
Cinamicom
18.07.2014, 09:59:14
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..
czychacz
18.07.2014, 10:35:56
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
Cinamicom
18.07.2014, 12:11:02
by_ikar
18.07.2014, 12:32:01
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.
Cinamicom
18.07.2014, 12:40:48
Cytat(by_ikar @ 18.07.2014, 13:32:01 )

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?
by_ikar
18.07.2014, 12:57:54
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;#entry1115870Na prawdę, pobaw się jakimiś gotowymi komponentami, zepnij je w jakąś sensowną całość i masz już gotowe "swoje" środowisko.
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.