Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/laravel/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 拉威尔控制器_Php_Laravel_Oop_Dependency Injection - Fatal编程技术网

Php 拉威尔控制器

Php 拉威尔控制器,php,laravel,oop,dependency-injection,Php,Laravel,Oop,Dependency Injection,我有一个控制器和文件上传器::类。上传器注入到控制器的构造方法。当我在代码中使用这个注入实例时(见下文),我每次都得到相同的obj。 我在没有使用注入属性的情况下重构了类(见代码的第二部分)——它可以工作。但我想在整个项目中遵循相同的风格 当它是一个文件上传时,它工作得很好,但对于多个文件上传解决方案,使用循环,它不工作 class ProposalFileController extends Controller { public $fileUploader; public

我有一个控制器和文件上传器::类。上传器注入到控制器的构造方法。当我在代码中使用这个注入实例时(见下文),我每次都得到相同的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
            ]);
    }
}
FileUpload::类

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次具有相同文件的数组(与循环步骤相同)

您可以使用
app
方法在循环中插入FileUploader实例,如下所示


$uploader=app(FileUploader::class)

中的FileUploader::class File::class也被注入到了_construct()方法中。这里的问题似乎在于您的FileUploader类,为什么必须为每个文件创建一个新实例。难道不可能重新构造这个类,这样就没有必要了吗?@Josh将添加一个FileUploadClass@Josh请看一看,它看起来不像。。。这与我的第二个变体几乎相同,只是更“以拉雷维尔的方式”。。。我想使用`$this->fileUploader->upload(…)`