【问题标题】:Laravel 5: Retrieve data from dispatched commandLaravel 5:从调度的命令中检索数据
【发布时间】:2015-06-23 03:59:19
【问题描述】:

我有一个命令UploadPhotoCommand,我已经编写了将照片上传到我的应用程序的命令。该命令不是自我处理的,因此我编写了一个处理程序UploadPhotoCommandHandler 来配合它。

我像这样从我的控制器发送命令:

<?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']);
    }

}

在我的命令处理程序中,我通过移动上传的图像、创建缩略图等以及向数据库添加记录来处理照片上传过程。

我的问题是我想从命令中检索上传照片的 ID 并使用它。我的意图是在响应中返回有关上传照片的更多信息,特别是我想使用route 函数返回一个 URL,并传入照片的 ID。

关于如何实现这一点的任何想法?

【问题讨论】:

    标签: php laravel command laravel-5


    【解决方案1】:

    我想出了一个办法。

    为了以后阅读本文的人的利益:

    <?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;
        }
    
    }
    

    如果有人知道更好的方法,请告诉我。

    【讨论】:

    • 这就是我最终在 Laravel 4 中实现命令总线的方式。在通过一系列事件运行命令后跟踪所有数据对于更复杂的函数来说有点令人头疼,但是我认为,与基本概念相比,这更多是我的主要架构的问题。将您的命令用作数据容器,在数据通过执行层(或一系列层)运行时基本上将数据存储起来是有意义的。
    【解决方案2】:

    最直接的方法是在 UploadPhotoCommand 类中调用单独的函数来完成这项工作,而不是在构造函数中完成。

    此函数调用返回一个响应,其中包含您想要的任何内容。

    即你可以这样做:

     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']);
    }
    

    【讨论】:

    • 感谢您的回答。我的 UploadPhotoCommand 是一个 DTO,我的大部分代码都在 UploadPhotoCommandHandler 中。我的命令处理程序还受益于构造函数中 IoC 容器的依赖注入,它的 handle 方法包含所有逻辑。采用您建议的方法将意味着牺牲 Laravel 提供的一系列好处,而这并不是我真正想做的事情。
    猜你喜欢
    • 2019-09-02
    • 2015-09-02
    • 2015-05-21
    • 2015-06-04
    • 2015-08-31
    • 2016-01-05
    • 2015-05-02
    • 1970-01-01
    • 2015-07-21
    相关资源
    最近更新 更多