Вызов метода посреди другого предотвращает установку следующих переменных — Laravel job

У меня есть задание Laravel, которое устанавливает некоторые данные, а затем использует эти данные для создания записи в базе данных. Все поля в таблице базы данных NULLвозможность. Там есть custom_variables поле — установить с помощью пользовательского метода getByPrefix(),

MyJob.php

<?php

class MyJob implements ShouldQueue {

public function __construct($input) {
$this->input = $input;
}

public function handle() {

$data = $this->getData();

MyModel::create($data);

}

protected function getData() {

if (isset($this->input['name'])) {
$data['name'] = $this->input['name'];
}$data['custom_variables'] = $this->getByPrefix('custom-');

if (isset($this->input['surname'])) {
$data['surname'] = $this->input['surname'];
}

return $data;
}/**
* Filter the input by the provided prefix
* and return matching input data.
* @return null|string
*/
protected function getByPrefix($prefix) {

$this->input= array_filter($this->input, function($k) use ($prefix) {
return strpos($k, $prefix) !== false;
}, ARRAY_FILTER_USE_KEY);

if (count($this->input) === 0) {
return null;
}

$data = array();

foreach ($this->inputas $k => $v) {
array_push($data, array($k => $v));
}

if (empty($data)) {
return null;
}

return json_encode($data);

}

}

Эта проблема что если я продолжу звонить getByPrefix() в середине, то значение $data['surname'] всегда NULL когда запись сохраняется, даже если surname присутствует на входе.

Когда я перехожу на getByPrefix() в конце сценария, $data['surname'] настроен правильно.

Почему это происходит? Это потому что я может быть вернуть JSON из getByPrefix() метод? Не думаю, но кто знает.

Я пытался обернуть тело getByPrefix() в try-catch — но нет никаких ошибок, и custom_variables поле всегда устанавливается в БД.

Есть идеи, что здесь может происходить?

Обновить

Пример входных данных:

array(
'name' => 'John',
'surname' => 'Doe',
'custom-var' => 'customValue'
)

Выход (после getByPrefix() применены):

array(
'name' => 'John',
'custom_variables' => "[{"custom-var":"customValue"}]")

0

Решение

Именно из-за этой части:

$this->input= array_filter($this->input, function($k) use ($prefix) {
return strpos($k, $prefix) !== false;
}, ARRAY_FILTER_USE_KEY);

Вы фильтруете свои данные и перезаписываете результаты. Попробуйте использовать другую переменную.

 $input= array_filter($this->input, function($k) use ($prefix) {
return strpos($k, $prefix) !== false;
}, ARRAY_FILTER_USE_KEY);

Причина, по которой вы получаете name но нет surname просто потому, что вы устанавливаете имя перед вызовом метода, в то время как последнее устанавливается после.

1

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector