ugrás a tartalomhoz

Routing és paraméterezés

csabessz47 · 2014. Nov. 23. (V), 12.48
Sziasztok,

Nemrég akadt egy kis szabad időm, és belekezdtem egy régóta halasztgatott hobbi-projectbe: Én is szeretnék saját cms-t, mert miért ne. :)
Viccen kívül, "gyakorlásnak" tökéletes, már ígyis csináltam olyat, amire eddig nem volt igény. Pedig még csak az elején vagyok.

Tehát saját CMS, ehhez persze szükségesek az alapok, ahol jelenleg a routing megvalósításánál járok.

Nagyon leegyszerűsítve az lenne a lényege, hogy egy tömbben lehetne tárolni az olyan url-eket és akciókat, amik nem adatbázis függők.
Tehát ha a tömb:
['admin/pages' => 'Admin.AdminPages.index']
akkor az xx.hu/admin/pages url-re az \Admin\Controllers\AdminPages controller index metódusa hívódna meg. Működik is.

A paraméterezéssel akadt gondom: tegyük fel, hogy az admin/pages/5 -> 5 azonosíójú oldalt kéne betölteni az admin felületen szerkesztésre.

De erre már egy egyszerű isset nem elég, hiszen a /5 miatt nem fog egyezni.
Get paraméterezést pedig ha lehet nem szeretnék használni, mert ez ugye nem csak admin felületen jöhetne szóba.
Pl xx.hu/kereses/keresett-szoveg/oldalszam esetén a \Search\Controllers\List controller getResults metódusa hívódjon meg.

A keresett szöveg és oldalszám átadása nem lényeg, azt már később ki tudom bányászni az url-ből. Viszont olyat hogyan lehetne, hogy a routing tömbben ez
['kereses' => 'Search.List.getResults'] -ként lehessen tárolva.

Megoldottam, méghozzá egy /* -al
['kereses/*' => 'Search.List.getResults'], de akkor be kéne járni a tömb összes elemét és megvizsgálni, hogy ($url az url, a $index az éppen aktuális kulcs esetén)
$position = strpos($index, '/*');
if ($postition !== false) {
  $match = (
    substr($url, 0, $position) === substr($index, 0, $position) &&
    ( isset($url[$position]) ? $url[$position] === '/' : true ) // Tehát ha az url-ben van a /* helyén valami, akkor csak / lehessen, így nem ad találatot pl a keresesem-re
  );
} else {
  $match = $url === $index;
}

if ($match) {
  ...
}

És ha valamelyik elem esetén a feltétel true, akkor továbbadni a vezérlést.

Habár tökéletesen működik, véleményem szerint ez egy több száz elemű tömbnél nem biztos, hogy túl jó ötlet, string műveletek nem az "olcsóságukról" híresek.

Tehát kérdésem az lenne, hogy milyen jó megoldásokat ismertek/használtok erre?

Köszönöm előre is a válaszokat
 
1

cak egy kerdes

Pepita · 2014. Nov. 24. (H), 08.56
Attol hogy egyedi cms t irsz miert nem hasznalsz ala egy kis frameworkot?
Ami mondjuk megoldja a routingot.

Ha nem akarsz, akkor sztem nezd at hogy a CodeIgniter hogy csinalja. Egyszeru es jo megoldas.
3

Megnézem

csabessz47 · 2014. Nov. 24. (H), 14.08
Köszi, megnézem.
Bevallom codeIgniterrel már volt dolgom, de nagyon-nagyon régen.
Mindenképp sajátot szeretnék mindenből, mert ez egy hobbiprojekt.
A cél nem egy egyedi cms felépítése és világuralom, hanem a látókör szélesítése :)
Alap problémákkal fogok találkozni, aminek a megoldásai még nagyon jól jöhetnek a jövőben.
Akár egy világmegváltó cms létrehozásában is :)
5

Nem zárja ki egymást

Pepita · 2014. Nov. 24. (H), 14.58
Mindenképp sajátot szeretnék mindenből, mert ez egy hobbiprojekt.
ez nem zárja ki, hogy megnézd, a CI hogy csinálja.

Egyébként szerintem kár feltalálni a kereket, ha vannak jó fw-ök, minek írsz sajátot? A CI szükség szerint könnyen alakítható.

Mondanám, hogy ugyanez igaz a CMS-re is, de nem mondom, mert ott már jobban lehetnek egyedi igények.
6

Megnézem

csabessz47 · 2014. Nov. 24. (H), 15.13
Megnézem, mert érdekel minden megoldás.
Egyébként azért saját, hogy találkozzak "alacsony szintű" problémákkal.

Hirtelen a CodeIgniterből annyira emlékszek, hogy controllerneve/metódusneve/paraméter stílusú linkeket lehet használni.
Na ezt szeretném én még megtoldani a namespace-ekkel, ezért gondoltam a fenti szerkezetre.

Laravellel barátkoztam nemrég. Használni fun, de a forrásától kicsit rosszul lettem :)
Meg alapból idegen a composer is , akármennyire hasznos, még azt is emésztenem kell.
9

Több lehetőség van

Pepita · 2014. Nov. 25. (K), 10.22
CodeIgniterből annyira emlékszek, hogy controllerneve/metódusneve/paraméter

Le tudod kérdezni darabonként az érkező paramétereket, aztán úgy használod, ahogy akarod.
$this->uri->segment(3), $this->uri->segment(4)
Ha nincs az adott segmens, false-ot ad vissza.

Szerk.:
Példa: Calendar class
10

Ez tetszik

csabessz47 · 2014. Nov. 25. (K), 22.13
Tényleg, erre is emlékszek már így :)
De nekem ugye a probléma az első 2 szegmens lesz, hiszen nekem kell valahogy a namespace szerkezet is.
Egy a cms-ben szerkesztető oldal controller elérési útja kb:
\Components\Admin\Controllers\AdminPages
De egy bejelentkezett felhasználó:
\Components\Admin\Models\AdminUser ami extendeli a \Components\User\Models\User-t

Nagyjából ilyen szerkezetet szeretnék kialakítani.
Aztán később a Components mellett lehet akár Cron, vagy ami majd még kell :)
11

cron?

Pepita · 2014. Nov. 26. (Sze), 08.59
Ezt nem értem, mi köze url-hez egy időzített szolgáltatásnak?

Vagy cron tabbal url-t akarsz megnyitni?
Ezt csak akkor tedd, ha mindegy milyen surun fut.
12

Ok, ez tényleg hülye példa volt

csabessz47 · 2014. Nov. 26. (Sze), 12.03
De tényleg csak egy példának szántam
Mondjuk Components helyett External-al kezdődne ami valamilyen integrációs feladathoz kapcsolódik.
13

Utólag belegondolva

csabessz47 · 2014. Nov. 27. (Cs), 10.25
Most néztem rá, hogy jött-e válasz tegnap óta, aztán utólag belegondolva miért ne lehetne Cron a namespace? Nekem se esett le egyből, hogy miért is hoztam fel.
Egy jelenleg is használt megoldást továbbgondolva:
\Cron\Social\Models\SocialConnections
Ezt a modelt egy cron arra használhatná, hogy óránként lekérje a különböző social oldalakon a like-ok, megosztások számát (ne kelljen minden oldalbetöltésnél lekérni közvetlenül tőlük).

Bár nyilván ez sem teljesen jó példa, hiszen a site-on is kellhet egy hasonló model (csak az már db-ből/cache-ből olvasná), aztán miért ne pakolhatnám egybe: social dolgok a \Components\Social-ban.

De remélem a lényegét az elképzelésemnek át tudtam adni.
2

Ha ilyenbe fogsz, akkor első

spapp · 2014. Nov. 24. (H), 10.01
Ha ilyenbe fogsz, akkor első lépés, hogy megtervezed a projektet.
Elsőre kettő külön egységed lesz: a framework és a cms.
Itt meg is érkeztünk a problémád egyik megoldásához, s az kapcsolódik Pepita javaslatához.

Használj első körben egy már meglévő framework-öt.
Ha azt később megismered és jól tervezed meg a cms-t, akkor bármikor lecserélheted másikra. Akár sajátra is.

De ha úgy döntesz, hogy egyből framework-öt is írsz, akkor ez is lehet egy megoldás. A 'kereses/*' helyett használj regexp-et: '~kereses/?.*~i'.
4

Szintek :)

csabessz47 · 2014. Nov. 24. (H), 14.20
A cms még nagyon messze van, ahogy írtam még a fw leges-legelején járok.
A következő lépés egyébként egy jogosultságos admin rendszer lesz.
Majd ha később szükségem lesz valamire, kiegészítem a "frameworkot".
Melóban mivel több éve megy az oldal ez már pöpecre ki van építve, így nekünk magasabb szintű problémákat kell megoldani.

A preg_match gyorsabb lehet a substr-eknél? Ennek utánanézek.

Köszönöm
7

Micro optimazations

szabo.b.gabor · 2014. Nov. 24. (H), 16.26
Szerintem ne nagyon hozz döntéseket olyan dolgokra alapozva, hogy a preg_match() mennyivel lassabb a substr-nél. Főleg amikor 50 hosszú karakterről beszélünk, és egy lekérésnél egyszer fut le az adott kód.

Nagyon irreleváns és rossz irányba viszi el a projektet. Használd azt, amivel könnyebb, jobb dolgozni.
8

Értem

csabessz47 · 2014. Nov. 25. (K), 09.51
Köszönöm.

Akkor marad a substr, mert ez már készen van.
Majd ha ismét lesz időm játszani lecserélem, és meglátjuk mennyire olvasható :)

Meg hát van egy sejtésem, hogy fogom még én ezt a részt piszkálni az időközben felmerülő igények miatt :)