Laravel - перемещение кода в очередь заданий, а не стрельба - PullRequest
0 голосов
/ 05 марта 2019

Я разрешаю пользователям загружать изображения в определенную модель (Stream).Я хотел бы переместить эту логику кода в очередь, чтобы сделать процесс загрузки более плавным.

Это мой StreamDocumentsController.php, в частности метод хранения:

public function store(Stream $stream)
{
    //Validate the request.
    //Removed in this example.

    //Store the actual document on the server.
    $store = request()->file('file')->store($stream->token);

    //Set the attributes to save to DB.
    $attributes['name'] = request()->file->getClientOriginalName();
    $attributes['path'] = $store;

    dispatch(new UploadDocuments($stream, $attributes));

    //Return URL for now. (JSON later on..)
    return response()->json([
        'status' => 'success'
    ]);
}

Так что выше фактически будет хранить изображение на сервере, в этой строке:

//Store the actual document on the server.
$store = request()->file('file')->store($stream->token);

Теперь, когда я пытаюсь запустить этот код (загрузить изображение), я вижу в Laravel Horizon, что задание действительно добавлено, но документ никогда не добавляется в базу данных.

Это мой UploadDocuments job:

protected $stream;
protected $attributes;

/**
 * Create a new job instance.
 *
 * @return void
 */
public function __construct(Stream $stream, $attributes)
{
    $this->stream = $stream;
    $this->attributes = $attributes;
}

/**
 * Execute the job.
 *
 * @return void
 */
public function handle()
{
    $this->stream->addDocuments($this->attributes);
}

Как видите, я хочу, чтобы моя работа выполняла метод addDocuments().

Фактический метод для этого хранится в моей модели Stream:

Stream.php:

/**
 * A stream can have many documents
 */
public function documents()
{
    return $this->hasMany(Document::class);
}

/**
 * Add document(s) to the stream
 *
 * @return Illuminate\Database\Eloquent\Model
 */
public function addDocuments(array $attributes)
{
    return $this->documents()->create($attributes);
}

Таким образом, при загрузке изображения процесс загрузки должен быть поставлен в очередь, но приведенный выше код только сохраняет фактическое изображение всервер, но никогда не база данных.Это похоже на то, что метод handle() никогда не запускается.

Кроме того, это правильно?Потому что я не работаю с ->store($stream->token) в своей работе, так что это никогда не ставится в очередь.

Любая помощь будет принята с благодарностью, так как я немного растерялся.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...