Oct 11, 2011

Zend action controller, függvénybeli paraméterekkel


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).

6 comments:

  1. Es ez igy mindegyik Router felevel mukodik, marmint mindig jol "elkapja" a parametereket?

    Fedd 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...

    ReplyDelete
  2. Először is köszi a code reviewt :)

    Azt, 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).

    ReplyDelete
  3. 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

    De, 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!

    ReplyDelete
  4. Köszönöm, akkor azokat átnézem.

    Igen, 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 :)

    ReplyDelete
  5. Én csak azt nem értem, hogy miért kell ennyire megbonyolítani?

    Az 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

    ReplyDelete
    Replies
    1. 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 :) )
      Azaz 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.)

      Delete