22
33namespace ADT \BackgroundQueue \Entity ;
44
5+ use ADT \Utils \Utils ;
56use DateTime ;
67use DateTimeImmutable ;
78use Exception ;
@@ -44,6 +45,7 @@ final class BackgroundJob
4445 private ?int $ priority ;
4546 private string $ callbackName ;
4647 private $ parameters ; /** @see self::setParameters() */
48+ private $ parameters_json = null ; /** @see self::setParameters() */
4749 private int $ state = self ::STATE_READY ;
4850 private DateTimeImmutable $ createdAt ;
4951 private ?DateTimeImmutable $ lastAttemptAt = null ;
@@ -134,19 +136,26 @@ public function setSerialGroup(?string $serialGroup): self
134136 public function getParameters (): array
135137 {
136138 $ this ->parameters = is_resource ($ this ->parameters ) ? stream_get_contents ($ this ->parameters ) : $ this ->parameters ;
137-
138- if (substr ($ this ->parameters , 0 , 2 ) === ' a: ' ) {
139+
140+ if (! is_null ($ this ->parameters ) ) {
139141 return unserialize ($ this ->parameters );
140142 }
141143
142- return json_decode ($ this ->parameters , true );
144+ $ parametersJson = json_decode ($ this ->parameters_json , true );
145+ $ parameters = [];
146+ foreach ($ parametersJson as $ key => $ value ) {
147+ $ parameters [$ key ] = Utils::getDateTimeFromArray ($ value , true );
148+ }
149+ return $ parameters ;
143150 }
144151
145152 /**
146153 * Parametry ukládá jako serializované pole nebo jako json.
147154 * Formát určuje parametr v BackgroundQueue `parametersFormat`.
148155 * - `serialize` => ukládá jako serializované pole a je bez omezení
149- * - `json` => parametry mohou obsahovat pouze skalární typy, pole a NULL
156+ * - `json` => ukládá jako json
157+ * - parametry mohou obsahovat pouze skalární typy, pole, NULL a \DateTimeInterface
158+ * - pokud je nějaký z parametrů objekt, automaticky se použije "serialize"
150159 *
151160 * @param object|array|string|int|float|bool|null $parameters
152161 * @param string $parametersFormat
@@ -156,17 +165,23 @@ public function setParameters($parameters, string $parametersFormat): self
156165 {
157166 $ parameters = is_array ($ parameters ) ? $ parameters : [$ parameters ];
158167
168+ if ($ parametersFormat == self ::PARAMETERS_FORMAT_JSON ) {
169+ foreach ($ parameters as $ parameter ) {
170+ if (!is_scalar ($ parameter ) && !is_array ($ parameter ) && !is_null ($ parameter ) && !($ parameter instanceof \DateTimeInterface)) {
171+ $ parametersFormat = self ::PARAMETERS_FORMAT_SERIALIZE ;
172+ break ;
173+ }
174+ }
175+ }
176+
159177 switch ($ parametersFormat ) {
160178 case self ::PARAMETERS_FORMAT_SERIALIZE :
161179 $ this ->parameters = serialize ($ parameters );
180+ $ this ->parameters_json = null ;
162181 break ;
163182 case self ::PARAMETERS_FORMAT_JSON :
164- foreach ($ parameters as $ idx => $ parameter ) {
165- if (!is_scalar ($ parameter ) && !is_array ($ parameter ) && !is_null ($ parameter )) {
166- throw new Exception ("Unsupported type ' " . gettype ($ parameter ) . "' for \$parameters[ $ idx] using parametersFormat = " . self ::PARAMETERS_FORMAT_JSON );
167- }
168- }
169- $ this ->parameters = json_encode ($ parameters );
183+ $ this ->parameters = null ;
184+ $ this ->parameters_json = json_encode ($ parameters );
170185 break ;
171186 default :
172187 throw new Exception ("Unsupported parameters format: $ parametersFormat " );
@@ -327,6 +342,7 @@ public static function createEntity(array $values): self
327342 $ entity ->priority = $ values ['priority ' ];
328343 $ entity ->callbackName = $ values ['callback_name ' ];
329344 $ entity ->parameters = $ values ['parameters ' ];
345+ $ entity ->parameters_json = $ values ['parameters_json ' ];
330346 $ entity ->state = $ values ['state ' ];
331347 $ entity ->createdAt = new DateTimeImmutable ($ values ['created_at ' ]);
332348 $ entity ->lastAttemptAt = $ values ['last_attempt_at ' ] ? new DateTimeImmutable ($ values ['last_attempt_at ' ]) : null ;
@@ -353,6 +369,7 @@ public function getDatabaseValues(): array
353369 'priority ' => $ this ->priority ,
354370 'callback_name ' => $ this ->callbackName ,
355371 'parameters ' => $ this ->parameters ,
372+ 'parameters_json ' => $ this ->parameters_json ,
356373 'state ' => $ this ->state ,
357374 'created_at ' => $ this ->createdAt ->format ('Y-m-d H:i:s ' ),
358375 'last_attempt_at ' => $ this ->lastAttemptAt ? $ this ->lastAttemptAt ->format ('Y-m-d H:i:s ' ) : null ,
0 commit comments