2015-04-16 6 views
-1

У меня есть команда UploadPhotoCommand, которую я написал для загрузки фотографии в мое приложение. Команда не является самообслуживанием, поэтому я написал обработчик UploadPhotoCommandHandler, чтобы пойти с ним.Laravel 5: Извлечь данные из отправленной команды

рассылает команду из моего контроллера, как это:

<?php 

namespace App\Http\Controllers\Photos; 

use App\Commands\Photos\UploadPhotoCommand; 
use App\Http\Requests\Photos\UploadRequest; 

class UploadController { 

    public function process(UploadRequest $request) 
    { 
     try 
     { 
      $this->dispatch(
       new UploadPhotoCommand($request->file('photo')); 
      ); 
     } 
     catch (\Exception $e) 
     { 
      \Log::error($e); 
      return response()->json(['errors' => 'Sorry, something went wrong, please try again later.']); 
     } 

     // I want to use the ID of the uploaded photo here 
     return response()->json(['success' => 'Photo uploaded successfully']); 
    } 

} 

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

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

Любые идеи о том, как достичь этого?

ответ

0

Самый простой способ - иметь отдельный вызов функции в вашем классе UploadPhotoCommand, а не выполнять его в конструкторе.

Этот вызов функции возвращает ответ, который содержит все, что вы хотите.

I.e. вы можете сделать что-то вроде этого:

public function process(UploadRequest $request) 
{ 
    try 
    { 
     $oPhotoUploadTask = new UploadPhotoCommand(); 
     $results = $oPhotoUploadTask->uploadPhoto($request->file('photo')); 
    } 
    catch (\Exception $e) 
    { 
     \Log::error($e); 
     return response()->json(['errors' => 'Sorry, something went wrong, please try again later.']); 
    } 

    // I want to use the ID of the uploaded photo here 
    return response()->json(['success' => 'Photo {$results['photo_id']} uploaded successfully']); 
} 
+0

Спасибо за ваш ответ. Моя «UploadPhotoCommand» - это DTO, и у меня есть основная часть моего кода в «UploadPhotoCommandHandler». Мой обработчик команд также выигрывает от инъекции зависимостей из контейнера IoC в конструкторе, и метод 'handle' - это то, где вся логика. Взятие вашего предлагаемого подхода означало бы принести в жертву целый ряд преимуществ, которые предлагает Laravel, чего я действительно не хочу делать. – Jonathon

2

Я выяснил, как это сделать.

В пользу тех, кто читает это в будущем:

<?php 

namespace App\Http\Controllers\Photos; 

use App\Commands\Photos\UploadPhotoCommand; 
use App\Http\Requests\Photos\UploadRequest; 

class UploadController { 

    public function process(UploadRequest $request) 
    { 
     // Initialise the command to a variable 
     $command = new UploadPhotoCommand($request->file('photo')); 

     try 
     { 
      // Dispatch the command 
      $this->dispatch($command); 
     } 
     catch (\Exception $e) 
     { 
      \Log::error($e); 
      return response()->json(['errors' => 'Sorry, something went wrong, please try again later.']); 
     } 

     // Grab the data from the command (Command handler sets it) 
     echo $command->id; 

     // I want to use the ID of the uploaded photo here 
     return response()->json(['success' => 'Photo uploaded successfully']); 
    } 

} 

В обработчике команды:

<?php namespace App\Handlers\Commands\Photos; 

use App\Commands\Photos\UploadPhotoCommand; 

class UploadPhotoCommandHandler { 
    public function __construct() {} 

    public function handle(UploadPhotoCommand $command) 
    { 
     // Handle your command 

     // Set the ID on the command object 
     $command->id = 123; 
    } 
} 

В команде:

<?php namespace App\Commands\Photos; 

use App\Commands\Command; 
use Symfony\Component\HttpFoundation\File\UploadedFile; 

class UploadPhotoCommand extends Command { 

    public $photo; 

    // Declare a public property ID 
    public $id; 

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

} 

Если кто-нибудь знает лучший способ сделать это, пожалуйста, дайте мне знать.

+0

Вот как я закончил реализацию моей командной шины в Laravel 4. Слежение за всеми данными после запуска команды через стек событий было немного головной болью для более сложных функций, но это было больше проблемой для моего Я думаю, что основная архитектура, чем базовая концепция. Использование вашей команды в качестве контейнера данных, который в основном оптимизирует данные, когда он проходит через уровень выполнения (или ряд слоев), имеет смысл. –