[英]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.