【问题标题】:Is there a cleaner way to file upload in laravel有没有更简洁的方式在 laravel 中上传文件
【发布时间】:2015-02-03 15:38:35
【问题描述】:

我想使用 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?

【问题讨论】:

    标签: php laravel laravel-5


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

    【讨论】:

    • 谢谢,有机会我会试试的!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-09-12
    • 2018-10-28
    • 1970-01-01
    • 1970-01-01
    • 2022-11-25
    • 2020-10-14
    • 2021-08-21
    相关资源
    最近更新 更多