首页 > 解决方案 > Laravel 控制器 DI

问题描述

我有一个控制器和 FileUploader::class。Uploader 注入控制器的 __construct 方法。当我在代码中使用这个注入的实例时(见下文),我每次都得到相同的 obj。当我在不使用注入属性的情况下重构了类(参见代码的第二部分)时——它可以工作。但我想在整个项目中遵循相同的风格。

当它是一个文件上传时,它工作正常,但对于多个文件上传解决方案,有一个循环,它不起作用。

class ProposalFileController extends Controller
{
    public $fileUploader;

    public function __construct(FileUploader $fileUploader)
    {
        $this->fileUploader = $fileUploader;
    }

    public function upload(ProposalFileUpload $request)
    {
        $files = [];

        foreach ($request->file('files') as $file)
        {

            /** !!! Attention here !!!!!!!
               In this loop, $this->fileUploader is same obj each time 
             **/
            $files[] = $this->fileUploader->upload($file);
        }

        return response()
            ->json([
               'data' => $files
            ]);
    }
}

我每次都需要新的上传器实例。下面的课程有效,但我不喜欢它的风格。如何用 DI 解决方案解决它?

class ProposalFileController extends Controller
{
    public $fileUploader;

    public function __construct(FileUploader $fileUploader)
    {
        $this->fileUploader = $fileUploader;
    }

    public function upload(ProposalFileUpload $request)
    {
        $files = [];

        foreach ($request->file('files') as $file)
        {
            $uploader = new FileUploader(new File());
            $files[] = $uploader->upload($file);
        }

        return response()
            ->json([
               'data' => $files
            ]);
    }
}

文件上传::类

class FileUploader implements Uploader
{
    use UploadHelper;

    private $file;

    public function __construct(File $file)
    {
        $this->file = $file;
    }

    public function upload(UploadedFile $file)
    {
        $saveName = $this->fileName($file);

        /** Save file to s3 */
        $storagePath = Storage::disk('s3')->put(...);

        /** Set cover_rel - relative path needed for delete file needs */
        $this->file->setAttribute('file_rel', $storagePath);

        $this->file->save();

        return $this->file;
    }
}

最后,我得到了具有相同文件 n 次的数组(与循环步骤相同)

标签: phplaraveloopdependency-injection

解决方案


您可以使用以下app方法在循环中注入 FileUploader 的实例

$uploader = app(FileUploader::class)


推荐阅读