Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Niewiadoma ilość argumentów..
Forum PHP.pl > Forum > PHP
Cinamicom
Witam. Przeglądam dokumentację Laravela, i widzę taki kod:

  1. Route::get('user/{id}/{name}', function($id, $name)
  2. {
  3. //
  4. })


Chciałem napisać podobny router, właśnie do tego Laravela, i mam problem..


Załóżmy że tutaj jest router:
  1. class Router {
  2. public static function get($path, $var) {
  3. $var();
  4. }
  5.  
  6. }


$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?
Cinamicom
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
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
Zobacz..

  1. funkcja('Łan', function($klocek, $bobek) {
  2. echo $klocek;
  3. });
  4.  
  5. funkcja($one, $var) {
  6. $var(1, 2);
  7. }



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.
Cinamicom
Dzięki za odp, ale tą metodę też znam.

Zalezy mi ,zeby to działało tak jak tutaj:

  1. Route::get('user/{id}/{name}', function($id, $name)
  2. {
  3. //
  4. })
czychacz
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
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
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
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
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
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
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
Bardzo fajny znalazłem smile.gif

https://raw.githubusercontent.com/brandonwa.../router.lib.php
by_ikar
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
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
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.
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.