Skip to content

Commit a0da80b

Browse files
committed
Merge branch 'vpg-issue_11999' into 4.0.x
* vpg-issue_11999: Doc Add the ability to use FrontendInterface to serialize Model and ResultSet [NFR] Add FrontendInterface to serialize Model and Resultset
2 parents 3eb50b3 + 8ef4730 commit a0da80b

File tree

5 files changed

+99
-28
lines changed

5 files changed

+99
-28
lines changed

CHANGELOG-4.0.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
- Added `Phalcon\Tag::renderTitle()` that renders the title enclosed in `<title>` tags. [#13547](https://github.com/phalcon/cphalcon/issues/13547)
1515
- Added `hasHeader()` method to `Phalcon\Http\Response` to provide the ability to check if a header exists. [PR-12189](https://github.com/phalcon/cphalcon/pull/12189)
1616
- Added global setting `orm.case_insensitive_column_map` to attempt to find value in the column map case-insensitively. Can be also enabled by setting `caseInsensitiveColumnMap` key in `\Phalcon\Mvc\Model::setup()`. [#11802](https://github.com/phalcon/cphalcon/pull/11802)
17+
- Added the ability to use FrontendInterface to serialize Model and ResultSet - Inject a `serializer` object which implements `FrontendInterface` in DI to use it. [#12808] (https://github.com/phalcon/cphalcon/pull/12888)
1718
- Added `Phalcon\Mvc\Model\Query\BuilderInterface::offset` [#13599](https://github.com/phalcon/cphalcon/pull/13599)
1819
- Added `Phalcon\Http\Response\Cookies::getCookies` [#13591](https://github.com/phalcon/cphalcon/pull/13591)
1920
- Added `Phalcon\Mvc\Model::isRelationshipLoaded` to check if relationship is loaded

phalcon/mvc/collection.zep

Lines changed: 36 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,8 @@ use Phalcon\Mvc\Collection\Exception;
3030
use Phalcon\Mvc\Collection\ManagerInterface;
3131
use Phalcon\Messages\Message as Message;
3232
use Phalcon\ValidationInterface;
33+
use Phalcon\Cache\FrontendInterface;
34+
3335

3436
/**
3537
* Phalcon\Mvc\Collection
@@ -1594,6 +1596,21 @@ abstract class Collection implements EntityInterface, CollectionInterface, Injec
15941596
*/
15951597
public function serialize() -> string
15961598
{
1599+
var dependencyInjector, serializer;
1600+
1601+
/**
1602+
* Obtain the default DI
1603+
*/
1604+
let dependencyInjector = Di::getDefault();
1605+
if typeof dependencyInjector != "object" {
1606+
throw new Exception("The dependency injector container is not valid");
1607+
}
1608+
1609+
if dependencyInjector->has("serializer") {
1610+
let serializer = <FrontendInterface> this->_dependencyInjector->getShared("serializer");
1611+
return serializer->beforeStore(this->toArray());
1612+
}
1613+
15971614
/**
15981615
* Use the standard serialize function to serialize the array data
15991616
*/
@@ -1605,24 +1622,27 @@ abstract class Collection implements EntityInterface, CollectionInterface, Injec
16051622
*/
16061623
public function unserialize(string! data)
16071624
{
1608-
var attributes, dependencyInjector, manager, key, value;
1609-
1610-
let attributes = unserialize(data);
1611-
if typeof attributes == "array" {
1612-
1613-
/**
1614-
* Obtain the default DI
1615-
*/
1616-
let dependencyInjector = Di::getDefault();
1617-
if typeof dependencyInjector != "object" {
1618-
throw new Exception("A dependency injector container is required to obtain the services related to the ODM");
1619-
}
1625+
var attributes, dependencyInjector, manager, key, value, serializer;
16201626

1621-
/**
1622-
* Update the dependency injector
1623-
*/
1624-
let this->_dependencyInjector = dependencyInjector;
1627+
/**
1628+
* Obtain the default DI
1629+
*/
1630+
let dependencyInjector = Di::getDefault();
1631+
if typeof dependencyInjector != "object" {
1632+
throw new Exception("A dependency injector container is required to obtain the services related to the ORM");
1633+
}
16251634

1635+
/**
1636+
* Update the dependency injector
1637+
*/
1638+
let this->_dependencyInjector = dependencyInjector;
1639+
if dependencyInjector->has("serializer") {
1640+
let serializer = <FrontendInterface> dependencyInjector->getShared("serializer");
1641+
let attributes = serializer->afterRetrieve(data);
1642+
} else {
1643+
let attributes = unserialize(data);
1644+
}
1645+
if typeof attributes == "array" {
16261646
/**
16271647
* Gets the default modelsManager service
16281648
*/

phalcon/mvc/model.zep

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,8 @@ use Phalcon\Mvc\Model\TransactionInterface;
3838
use Phalcon\Mvc\Model\ValidationFailed;
3939
use Phalcon\Mvc\ModelInterface;
4040
use Phalcon\ValidationInterface;
41+
use Phalcon\Events\ManagerInterface as EventsManagerInterface;
42+
use Phalcon\Cache\FrontendInterface;
4143

4244
/**
4345
* Phalcon\Mvc\Model

phalcon/mvc/model/resultset/complex.zep

Lines changed: 29 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,9 @@ use Phalcon\Mvc\Model\Resultset;
2626
use Phalcon\Mvc\Model\Exception;
2727
use Phalcon\Cache\BackendInterface;
2828
use Phalcon\Mvc\Model\ResultsetInterface;
29+
use Phalcon\DiInterface;
30+
use Phalcon\Di;
31+
use Phalcon\Cache\FrontendInterface;
2932

3033
/**
3134
* Phalcon\Mvc\Model\Resultset\Complex
@@ -270,8 +273,7 @@ class Complex extends Resultset implements ResultsetInterface
270273
*/
271274
public function serialize() -> string
272275
{
273-
var records, cache, columnTypes, hydrateMode, serialized;
274-
276+
var records, cache, columnTypes, hydrateMode, dependencyInjector, serializer;
275277
/**
276278
* Obtain the records as an array
277279
*/
@@ -280,30 +282,48 @@ class Complex extends Resultset implements ResultsetInterface
280282
let cache = this->_cache,
281283
columnTypes = this->_columnTypes,
282284
hydrateMode = this->_hydrateMode;
285+
let dependencyInjector = Di::getDefault();
286+
if typeof dependencyInjector != "object" {
287+
throw new Exception("The dependency injector container is not valid");
288+
}
289+
if dependencyInjector->has("serializer") {
290+
let serializer = <FrontendInterface> dependencyInjector->getShared("serializer");
291+
return serializer->beforeStore([
292+
"cache" : cache,
293+
"rows" : records,
294+
"columnTypes" : columnTypes,
295+
"hydrateMode" : hydrateMode
296+
]);
297+
}
283298

284-
let serialized = serialize([
299+
return serialize([
285300
"cache" : cache,
286301
"rows" : records,
287302
"columnTypes" : columnTypes,
288303
"hydrateMode" : hydrateMode
289304
]);
290-
291-
return serialized;
292305
}
293306

294307
/**
295308
* Unserializing a resultset will allow to only works on the rows present in the saved state
296309
*/
297310
public function unserialize(string! data) -> void
298311
{
299-
var resultset;
300-
312+
var resultset, dependencyInjector, serializer;
301313
/**
302314
* Rows are already hydrated
303315
*/
304316
let this->_disableHydration = true;
305-
306-
let resultset = unserialize(data);
317+
let dependencyInjector = Di::getDefault();
318+
if typeof dependencyInjector != "object" {
319+
throw new Exception("The dependency injector container is not valid");
320+
}
321+
if dependencyInjector->has("serializer") {
322+
let serializer = <FrontendInterface> dependencyInjector->getShared("serializer");
323+
let resultset = serializer->afterRetrieve(data);
324+
} else {
325+
let resultset = unserialize(data);
326+
}
307327
if typeof resultset != "array" {
308328
throw new Exception("Invalid serialization data");
309329
}

phalcon/mvc/model/resultset/simple.zep

Lines changed: 31 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,10 @@ use Phalcon\Mvc\Model;
2323
use Phalcon\Mvc\Model\Resultset;
2424
use Phalcon\Mvc\Model\Exception;
2525
use Phalcon\Cache\BackendInterface;
26+
use Phalcon\DiInterface;
27+
use Phalcon\Di;
28+
use Phalcon\Cache\FrontendInterface;
29+
2630

2731
/**
2832
* Phalcon\Mvc\Model\Resultset\Simple
@@ -224,6 +228,22 @@ class Simple extends Resultset
224228
*/
225229
public function serialize() -> string
226230
{
231+
var dependencyInjector, serializer;
232+
let dependencyInjector = Di::getDefault();
233+
if typeof dependencyInjector != "object" {
234+
throw new Exception("The dependency injector container is not valid");
235+
}
236+
if dependencyInjector->has("serializer") {
237+
let serializer = <FrontendInterface> dependencyInjector->getShared("serializer");
238+
return serializer->beforeStore([
239+
"model" : this->_model,
240+
"cache" : this->_cache,
241+
"rows" : this->toArray(false),
242+
"columnMap" : this->_columnMap,
243+
"hydrateMode" : this->_hydrateMode,
244+
"keepSnapshots" : this->_keepSnapshots
245+
]);
246+
}
227247
/**
228248
* Serialize the cache using the serialize function
229249
*/
@@ -242,9 +262,17 @@ class Simple extends Resultset
242262
*/
243263
public function unserialize(string! data) -> void
244264
{
245-
var resultset, keepSnapshots;
246-
247-
let resultset = unserialize(data);
265+
var resultset, keepSnapshots, dependencyInjector, serializer;
266+
let dependencyInjector = Di::getDefault();
267+
if typeof dependencyInjector != "object" {
268+
throw new Exception("The dependency injector container is not valid");
269+
}
270+
if dependencyInjector->has("serializer") {
271+
let serializer = <FrontendInterface> dependencyInjector->getShared("serializer");
272+
let resultset = serializer->afterRetrieve(data);
273+
} else {
274+
let resultset = unserialize(data);
275+
}
248276
if typeof resultset != "array" {
249277
throw new Exception("Invalid serialization data");
250278
}

0 commit comments

Comments
 (0)