Rövid szünet után egy Zend Framework-el kapcsolatos poszt következik. Sajnos Zendéknél alapból, nincs lehetőségünk az Action metódusokban paramétereket megdani. Ez nekünk főleg, azért rossz, mert mi szeretnénk az url-ben átadott paramétereket ($_GET) azonnal lekérni a függvény paraméterein keresztül, nem pedig például a $this->getRequest()->getQuery() segítségével. Ezen probléma orvoslására már bizonyára sok megoldás született, de mivel én a Zf-et eddig nagyrészt csak komponensenként használtam főleg CodeIgniter alól, így nekem újdonság volt a dolog.
Alap esetben az url-ben szereplő paraméterek lekérdezésére a következő lehetőségünk van:
$this->_request->getQuery('query_string_parameter_name'); // zf request object
A cél eléréséhez a Zend_Controller_Action osztály dispatch metódusát kell felülírnunk. Azért van erre a függvényre szükségünk, mert ő lesz aki meghívja a megfelelő controller adott action metódusát, amelyet paraméterben megkap (egyszerű string-ként).
A kód megtekintése előtt csupán annyit emelnék még ki, hogy két lehetőségünk van az url-ben paramétereket átadni az adott akciónak:
- module/controller/action?p1name=p1value&p2name=p2value
- module/controller/action/p1name/p1value/p2name/p2value
(2. esetben a module, controller és az action kulcsok foglaltak)
Ui.: A fenti megoldás csupán teszt jellegű, éles környezetben nincs használva. Ezen kívül még annyi, hogy validációnál hátrányban lehetünk ilyen jellegű felhasználás esetén (változókban vannak a bemeneti értékek, a könnyebben kezelhető tömb helyett).
Es ez igy mindegyik Router felevel mukodik, marmint mindig jol "elkapja" a parametereket?
ReplyDeleteFedd le unit testekkel es dobd fel a mailing listara mint otletet :) pl, ez egy jo thread, kb ez a temaja http://zend-framework-community.634137.n4.nabble.com/Controller-quot-convenience-API-quot-redux-td3873283.html
Ami magat a kodot illeti, esetleg a foreach ($this->getMethodParameters($action) as $mp) atirnam
$methodParams = $this->getMethodParameters($action);
foreach($methodParams as $mp)
stb...
Először is köszi a code reviewt :)
ReplyDeleteAzt, hogy mindenféle Router-el megy-e nem tudom. Nagyrészt azért, mert nem olyan régóta kezdtem elmélyülni a zf belső világában. Nem igazán tudom milyen eseteket kéne vizsgálnom.
A mailing list jó ötlet, amint a tesztelésre több időt fordítottam, feldobom.
A foreach-es sort sebesség szempontjából gondolod jobbnak a te általad javasolttal? Amennyiben igen, akkor erről én annyit tudok, hogy elvileg ilyenkor egy másolatot képez a PHP és azon fog végigiterálni (azaz nem fut le az adott esetben függvény csak egyszer - ezt tudva szebbnek tartom azt ha nem előtte kéred le az értékét, amíg máshol nem kívánod felhasználni).
Hat, kb azokat az eseteket amik levannak irva a docs-ban http://framework.zend.com/manual/en/zend.controller.router.html#zend.controller.router.basic
ReplyDeleteDe, most kicsit belegondolva, minden esetben kene hogy dolgozzon, mivel a elobb a Router megkeresi hogy melyik route van megtalalva, es akkor bele teszi a parameterek a Request-be, utanna jonn a te kodot, es szedi ki a parametereket a Request-bol. Ja, elmeletileg, kell hogy dolgozzon :)
Azt tudom hogy csak egyszer lesz meghivva a fugveny, hanem ha jol remlik a ZF coding standard emezt javasolja :)
Udv!
Köszönöm, akkor azokat átnézem.
ReplyDeleteIgen, ez a route folyamat utáni lépés. Itt konkrétan az akció karakterláncként szerepel és az annak megfelelőt fogja meghívni az adott objektumból. Sztem is mennie kell :)
Ah, értem :) Konkrétan nem volt leírva a coding standard részben, de gyorsan megnéztem pár példát. Igazad van, szinte mindenhol az általad leírt módszer van. Viszont itt egy ellenpélda is: http://framework.zend.com/manual/1.11/en/zend.queue.example.html :)
// Create an array queue
$queue = new Zend_Queue('Array', $options);
// Get list of queues
foreach ($queue->getQueues() as $name) {
echo $name, "\n";
}
Mindenestre majd átírom :)
Én csak azt nem értem, hogy miért kell ennyire megbonyolítani?
ReplyDeleteAz Action-ben simán: echo $this->_getParam('param1', 'defaultValue');
Vagy ha így nem jó, akkor:
$params = $this->_getAllParams();
De ha ez se tetszik, akkor csinálj a controllerben egy init() metódust:
public function init(){
$this->requestParams = $this->_getAllParams();
}
...és akkor minden Action-ben tudod használni:
$this->requestParams['param1'];
Szerintem így egyszerűbb, mint a ZF-et átírogatni :)
Ref: http://framework.zend.com/manual/en/zend.controller.action.html
Teljesen igazad van a bonyolítást illetően. Viszont a cél az volt, hogy az egyes action metódusokban paraméterből is lekérdezhető legyen a query string tartalma (amennyiben erre tudsz egyszerűbb megoldást, szívesen fogadom :) )
DeleteAzaz a valamiAction($egyParam) action metódus $egyParam értéke "ertek"-et fog tartalmazni a következő query esetében ...valami?egyParam=ertek
(Egyébként a getQuery függvényt megemlítettem, ami -ha jól tudom- annyiban különbözik a getParam-tól, hogy az csak a $_GET-ben lévő kulcs-érték párokat adja vissza.)