我想使用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?
答案 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将立即为事件和处理程序创建模板。