Контроллер Laravel DI - PullRequest
       1

Контроллер Laravel DI

0 голосов
/ 28 июня 2018

У меня есть контроллер и FileUploader :: class. Загрузчик внедряется в метод контроллера __construct. Когда я использую этот внедренный экземпляр в коде (см. Ниже), я получаю один и тот же объект каждый раз. Я реорганизовал класс (см. Вторую часть кода) без использования встроенного свойства - это работает. Но я хочу следовать одному стилю в проекте.

Когда это была одна загрузка файла, она работала нормально, но для решения по загрузке нескольких файлов, с циклом, это не работает.

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 раз (то же самое с шагами цикла)

1 Ответ

0 голосов
/ 28 июня 2018

Вы можете добавить экземпляр FileUploader в цикл, используя метод app, как показано ниже

$uploader = app(FileUploader::class)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...