是否有一种更简洁的方式来在laravel中上传文件

时间:2015-02-03 15:38:36

标签: php laravel laravel-5

我想使用laravel 5上传文件。我有一个表单,它接收文件,将其移动到所需的目标,并将记录保存在数据库中。

我的控制器里面有以下内容:

public function store(DestinationWeddingRequest $request)
    {
        $this->upload($request, $fileName);

        DestinationWedding::create([
            'description' => $request->get('description'),
            'image_url'   => $fileName
        ]);

        return redirect('destination-weddings');
    }

我的控制器内部的另一种方法:

public function upload(DestinationWeddingRequest $request, &$fileName)
    {
        $fileName = mt_rand();

        $destinationPath = public_path('/images/upload/destination_weddings');
        $request->file('image_url')->move($destinationPath, $fileName);
    }

我想知道这是否是正确的方法,或者我是否需要在模型中使用某种mutator?

1 个答案:

答案 0 :(得分:1)

我最好在文件上传时触发事件并在事件中执行操作。通过这种方式,您将获得更清洁的控制器,您可以使用它轻松管理所有内容。

<强>事件:

namespace optimizer\Events;

use App\Events\Event;

use Illuminate\Queue\SerializesModels;

class FileWasUploaded extends Event {

    use SerializesModels;
    /**
     * @var
     */
    public $request;


     /**
     * Create a new event instance.
     *
     * @param $request
     * 
     */
    public function __construct($request)
    {

        $this->request = $request;

    }

}

<强>事件处理程序:

namespace App\Handlers\Events;

use App\Events\FileWasUploaded;


class whenFileWasUploaded {

    /**
     * Create the event handler.
     *
     * @return void
     */
    public function __construct()
    {
        //
    }

    /**
     * Handle the event.
     *
     * @param  FileWasUploaded  $event
     * @return void
     */
    public function handle(FileWasUploaded $event)
    {
        $fileName = mt_rand();

        $destinationPath = public_path('/images/upload/destination_weddings');
        $event->file('image_url')->move($destinationPath, $fileName);

        DestinationWedding::create([
            'description' => $event->description,
            'image_url'   => $fileName
        ]);

    }

}

<强>控制器:

public function store(DestinationWeddingRequest $request)
{
    event(new FileWasUploaded($request));
    return redirect('destination-weddings');
}

然后只需将事件添加到 EventServiceProvider:

protected $listen = [
        'App\Events\FileWasUploaded' => [
            'App\Handlers\Events\whenFileWasUploaded@handle'
        ],
    ];

您需要调整命名空间以及可能的用途。要验证活动中的所有内容,只需使用

即可
dd($event);
在您的处理程序中,您将看到事件中可调用的所有内容(可能需要以不同方式调用此行$event->file('image_url')

如果您有许多相似但不相同的情况需要上传某些内容,请考虑使用命令。

要创建更方便的事件,请从编辑EventServiceProvider.php开始,如上所述,然后调用

php artisan event:generate

这样,laravel将立即为事件和处理程序创建模板。