ugrás a tartalomhoz

ZF parametrizált SEF URL hogyan?

janoszen · 2010. Jan. 20. (Sze), 23.20
Sziasztok!

Úgy döntöttem, hogy belevágok a Zend Framework megtanulásába. Sikerült is az első kanyart bevenni, a ZF jól teljesített, a tutorialon komolyabb idegeskedés nélkül túl vagyok. Adódott azonban az a remélhetőleg el nem ítélhető vágyam, hogy ilyen URL-eket gyártsak:

http://enoldalam.hu/blog/2010/01/20/bejegyzes_cime

Namost, a doksi a következőt írja:

[quote]By default, the first segment of a URL path maps to a controller, and the second to an action. For example, given the URL http://framework.zend.com/roadmap/components, the path is /roadmap/components, which will map to the controller roadmap and the action components. If no action is provided, the action index is assumed, and if no controller is provided, the controller index is assumed (following the Apache convention that maps a DirectoryIndex automatically).[/url]

Azaz, a controller nevéből és az actionből épít URL-t. Kérdésem: van-e a keretrendszerben beépített mód a fentiek szerinti parametrizált URLek használatára vagy ehhez ki kell terjesztenem a front controllert?

Köszönöm

János
 
1

Megoldva

janoszen · 2010. Jan. 20. (Sze), 23.22
OK, csak egy kicsit kellett volna tovább olvasnom: http://framework.zend.com/manual/en/zend.controller.router.html

A kérdés már csak az, hogy a gyakorlatban ez hogy néz ki...
2

<kötekedés>Az idézet nem

tiku I tikaszvince · 2010. Jan. 21. (Cs), 12.41
<kötekedés>Az idézet nem teljesen fedi a valóságot. Ugyanis az URL-edben a "blog" takarhat egy modult is.</kötekedés>

De ha a "blog" egy controller, akkor én kb úgy oldanám meg, hogy 2 routert regisztrálnék

$routeArchive = new Zend_Controller_Router_Route_Regex(
    'blog/(?P<year>\d{4})(?:/(?:(?P<month>\d{1,2})(?:/(?:(?P<day>\d{1,2})/?)?)?)?)?$',
    array(
        'module' => 'default',
        'controller' => 'blog',
        'action' => 'archive'
    ),
    array(
        1 => 'year',
        2 => 'month',
        3 => 'day'
    )
);
Zend_Controller_Front::getInstance()->getRouter()
    ->addRoute( 'blogPost', $routeArchive );

$routePost = new Zend_Controller_Router_Route_Regex(
    'blog/(?P<year>\d{4})/(?P<month>\d{1,2})/(?P<day>\d{1,2})/(?P<title>.*)$',
    array(
        'module' => 'default',
        'controller' => 'blog',
        'action' => 'post'
    ),
    array(
        1 => 'year',
        2 => 'month',
        3 => 'day',
        4 => 'title',
    )
);
Zend_Controller_Front::getInstance()->getRouter()
    ->addRoute( 'blogPost', $routePost );

Előbbi elkap minden archívumra vonatkozó kérést, utóbbi csak azokat, ahol van cím is. Értelem szerűen az első a BlogController::archiveAction()-ra a második a BlogController::postAction()-ra mutat.

a router construktor 3. paraméterével lehet megnevezni a paramétereket, amiket az action-ben elérhetsz a $this->_request->getParam('year'); $this->_request->getParam('day'); stb. módon (bár lehet, hogy fordítva kell megadni array('title' => 1, 'day' => 3 [...] ))
3

Hol?

janoszen · 2010. Jan. 21. (Cs), 19.18
Köszönöm, bár azt hiszem, a router configot sikerült megértenem. A kérdés sokkal inkább az volna, hogy hol célszerű ezeket definiálni? Bootstrap? Front controller?
4

Bootstrap

tiku I tikaszvince · 2010. Jan. 22. (P), 08.10
Azokat a routereket, amiket config fájlokból olvasol fel, vagy amik rendszer szintű útvonalakat adnak, szerintem a Bootstrap::_initRouter()-ben kell deffiniálni. A máshol (pl adatbázisban) tárolt útvonalak definiálására egy controller plugint használok.

Nálam ez az egész úgy néz ki, hogy a plugin routeShutdown-ban elrakja cache-be az regész Router objektumot, a Bootstrap pedig csak akkor kezdi újra felépíteni azt, ha szükséges
5

Köszönöm

janoszen · 2010. Jan. 22. (P), 08.29
Csodálatos, köszönöm.