繁体   English   中英

在laravel中是否有更干净的文件上传方法

[英]Is there a cleaner way to file upload in laravel

我想使用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);
    }

我想知道这是否是正确的方法,还是我需要在模型内部使用某种变体?

我最好在文件上传后触发一个事件,并在事件内执行操作。 这样,您将获得一个更清洁的控制器,并且可以轻松地管理所有内容。

事件:

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将同时为事件和处理程序创建模板。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM