2016-02-13 1 views
1

Что произойдет, если задание в очереди Laravel передается в качестве входной модели Eloquent, но модель удаляется до того, как задание будет запущено в очереди?Как задание в очереди Laravel обрабатывает удаленную модель в качестве входных данных?

Например, я создаю сайт электронной коммерции с Laravel 5.2, где клиент может вводить адреса и способы оплаты. Способ оплаты относится к адресу. Но если клиент пытается удалить адрес, а не каскадировать и удалить какие-либо связанные с ним способы оплаты, я удаляю адрес, пометив его как отключенный. Таким образом, способ оплаты все равно может использоваться до тех пор, пока клиент не обновит связанный с ним платежный адрес.

Однако, если метод оплаты удален и он ссылается на адрес, который был удален софт, я хочу сделать некоторую сборку мусора и удалить адрес из базы данных. Это не должно происходить синхронно, поэтому я написал простую задачу для выполнения этой задачи. Метод ручки выглядит следующим образом:

public function handle(PaymentMethodRepository $paymentMethodRepository, AddressRepository $addressRepository) 
{ 
    $billingAddress = $paymentMethodRepository->address($this->paymentMethod); 

    if (! $billingAddress->enabled) { 
     $addressRepository->delete($billingAddress); 
    } 
} 

рассылает эту работу в destroy способе PaymentMethodsController. Однако, если метод оплаты, переданный заданию, удаляется из базы данных до того, как задание будет запущено в очереди, будет ли работать ошибка?

Я все еще разрабатываю сайт, поэтому у меня нет сервера для развертывания и проверки того, что происходит. Я знаю, что модель сериализуется, чтобы помещаться в очередь, но мне интересно, возникнет ли проблема, когда модель будет восстановлена ​​для выполнения задания.

ответ

0

Да, работа завершится неудачно, если «сериализованная модель» будет удалена до выполнения задания. Модель не сериализована - задание хранит модельный класс и идентификатор модели и выбирает модель перед выполнением.

Чтобы обойти эту проблему, можно сохранить первичный ключ модели в работе, а затем при выполнении задания, проверьте, чтобы увидеть, если запись существует:

class DeleteAddressJob extends Job implements ShouldQueue 
{ 
    private $addressId; 

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

    public function handle(AddressRepository $addressRepository) 
    { 
     $address = $addressRepository->find($this->addressId); 

     if (is_null($address)) { 
      // Address doesn't exist. Complete job... 
      return; 
     } 

     // Delete the address... 
    } 
}