Immediate remove cookie data in zend-mvc application
In zend-mvc application, we can utilize Zend\Http\Header\SetCookie
header to set cookie to be added to response header. For example, we have a setAction()
to set it, we can do:
use Zend\Http\Header\SetCookie; // ... public function setAction() { $request = $this->getRequest(); $response = $this->getResponse(); $response->getHeaders()->addHeader(new SetCookie( // name 'test', // value 'abc', // expires \time() + (60 * 60 * 24 * 365), // path '/', // domain null, // secure $request->getUri()->getScheme() === 'https', // httponly true )); return $response; } // ...
Above, we set cookie with name “test” with value “abc”, with expires 1 year. To remove it completely before 1 year hit, we can pass 8th parameter as maxAge to be 0, so, for example, we have a removeAction
to remove it, we can do:
use Zend\Http\Header\SetCookie; // ... public function removeAction() { $request = $this->getRequest(); $response = $this->getResponse(); $cookie = $request->getCookie(); if (! isset($cookie['test'])) { // already removed, return response early return $response; } $response->getHeaders()->addHeader(new SetCookie( 'test', null, // no need to set value null, // no need to set expires '/', null, $request->getUri()->getScheme() === 'https', true, 0 // set maxAge to 0 make "test" cookie gone )); return $response; } // ...
That’s it!
Using Buffer for Resultset::rewind() after Resultset::next() called in Zend\Db
In Zend\Db, there is Resultset
which can be used as result of db records as instanceof PHP Iterator. For example, we have the following table structure:
CREATE TABLE test ( id serial NOT NULL PRIMARY KEY, name character varying(255) );
and we have the following data:
To build resultset, we can use the following code:
include './vendor/autoload.php'; use Zend\Db\Adapter\Adapter; use Zend\Db\TableGateway\TableGateway; use Zend\Db\ResultSet\ResultSet; $adapter = new Adapter([ 'username' => 'developer', 'password' => '123456', 'driver' => 'pdo_pgsql', 'database' => 'learn', 'host' => 'localhost', ]); $resultSetPrototype = new ResultSet( null, new ArrayObject([], ArrayObject::ARRAY_AS_PROPS) ); $tableGateway = new TableGateway( 'test', $adapter, null, $resultSetPrototype ); $select = $tableGateway->getSql()->select(); $resultSet = $tableGateway->selectWith($select);
On getting the data, we can go to specific record position by using next()
, for example: we want to get the 2nd record of selected data, we can use the following code:
$resultSet->current(); $resultSet->next(); var_dump($resultSet->current());
and we will get the following data:
class ArrayObject#16 (1) { private $storage => array(2) { 'id' => int(2) 'name' => string(6) "test 2" } }
However, when we need to back to first position, we can’t just use rewind()
as follow:
$resultSet->rewind(); var_dump($resultSet->current());
Above code will result wrong data, which is a next record data:
class ArrayObject#16 (1) { private $storage => array(2) { 'id' => int(3) 'name' => string(6) "test 3" } }
To make that work, we need to use buffer()
method early after result set created, so, the code will need to be:
$select = $tableGateway->getSql()->select(); $resultSet = $tableGateway->selectWith($select); $resultSet->buffer(); $resultSet->current(); // ensure hit 1st record first $resultSet->next(); // next position var_dump($resultSet->current()); // get 2nd record $resultSet->rewind(); // back to position 0 var_dump($resultSet->current()); // get 1st record again
That will show the correct data:
# second record by call of next() class ArrayObject#16 (1) { private $storage => array(2) { 'id' => int(2) 'name' => string(6) "test 2" } } # first record after call of rewind() class ArrayObject#16 (1) { private $storage => array(2) { 'id' => int(1) 'name' => string(6) "test 1" } }
leave a comment