@sequelone

Как передать значение из функции контроллера в другую функцию контроллера?

Не получается передать данные из одного контроллера в другой. Имеется такой контроллер для заливки mp3 файлов через Dropzone.JS:
public function upload(Request $request)
    {
        if (!$request->has('file')) {
            return response()->json(['message' => 'Missing file'], 422);
        }

        $file = $request->file('file');

        $extension = !is_null($file->extension()) ? $file->extension() : 'mp3';
        $fileName = !is_null($file->getClientOriginalName()) ? rtrim($file->getClientOriginalName(), '.') : 'Unknown - Unknown.mp3';
        $tracksPath = 'public/tracks/';
        $globalPath = storage_path('app/public/tracks/');
        $globalTrackPath = $globalPath . $fileName;

        $file->move(storage_path('app/public/tracks'), $fileName);

        $fileHash = sha1_file($globalTrackPath);

        rename($globalTrackPath, $globalPath . $fileHash . '.' . $extension);

        $track = GetId3::fromDiskAndPath('storage', 'app/public/tracks/' . $fileHash . '.' . $extension);

        $t = $track->extractInfo();
        $title = !empty($t['tags']['id3v2']['title']['0']) ? $t['tags']['id3v2']['title']['0'] : 'Unknown';
        $artist = !empty($t['tags']['id3v2']['artist']['0']) ? $t['tags']['id3v2']['artist']['0'] : 'Unknown';
        $band = !empty($t['tags']['id3v2']['band']['0']) ? $t['tags']['id3v2']['band']['0'] : '';
        $album = !empty($t['tags']['id3v2']['album']['0']) ? $t['tags']['id3v2']['album']['0'] : '';
        $year = !empty($t['tags']['id3v2']['year']['0']) ? $t['tags']['id3v2']['year']['0'] : '';
        $genre = !empty($t['tags']['id3v2']['genre']['0']) ? $t['tags']['id3v2']['genre']['0'] : '';
        $url = Storage::url($tracksPath . $fileHash . '.mp3');

        if(!empty($track->getArtwork(true))) {
            $tmpCoverFile = $track->getArtwork(true)->getPathname();
            $coverPath = 'public/tracks/covers/';
            $cover64Path = 'cover.jpg';
            Storage::disk('local')->put($coverPath . '/' . $fileHash . '/' . $cover64Path, File::get($tmpCoverFile));

            $cover = Storage::url($coverPath . $fileHash . '/' . $cover64Path);
        } else {
            $cover = '/vendor/songs-crud/images/none.png';
        }

        DB::table('songs_tracks')->updateOrInsert(
            ['hash' => $fileHash],
            [
                'release_id' => $request->id,
                'image' => $cover,
                'name' => $title,
                'artist' => $artist,
                'band' => $band,
                'album' => $album,
                'year' => $year,
                'genre' => $genre,
                'url' => $url,
                'hash' => $fileHash,
                'sortable' => '',
                'slug' => $fileHash
            ]
        );

        $getTrackId = DB::table('songs_tracks')
            ->where('hash', $fileHash)
            ->first();

        $id = !empty($getTrackId->id) ? $getTrackId->id : 1;

        return $id;
    }

Функция отрабатывает нормально, медиа файлы загружаются на сервер и записи добавляются в таблицу бд. Мне нужно передавать id в другую функцию, которая генерирует JSON файл:
public function getTrackListJson(Request $request): \Illuminate\Http\JsonResponse
    {
        dd($this->upload());
        $tracks = DB::table('songs_tracks')->where('id', $id)->first();
        return response()->json([$tracks]);
    }

Пытаюсь распечатать через dd() эту функцию, но она выдаёт следующую ошибку:

ArgumentCountError
Too few arguments to function SequelONE\SongsCRUD\app\Http\Controllers\Admin\TrackCrudController::upload(), 0 passed in /home/site.com/packages/sequelone/songs-crud/src/app/Http/Controllers/Admin/TrackCrudController.php on line 229 and exactly 1 expected

Не могу понять как передать экземпляр $request и вообще нужно ли его передавать?
  • Вопрос задан
  • 76 просмотров
Пригласить эксперта
Ответы на вопрос 1
delphinpro
@delphinpro Куратор тега PHP
frontend developer
Не могу понять как передать экземпляр $request

Так и передать, как это делается в php

public function getTrackListJson(Request $request): \Illuminate\Http\JsonResponse
    {
        dd($this->upload($request));
        $tracks = DB::table('songs_tracks')->where('id', $id)->first();
        return response()->json([$tracks]);
    }


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

PS.
Тут вообще надо подтягивать знания по Laravel

$tracks = DB::table('songs_tracks')->where('id', $id)->first();

Почему переменная $tracks во множественном числе, если там один трек?
Зачем использовать фасад DB для простой выборки по ID? Есть же Eloquent модели

$track = SongTrack::findOrFail($id);
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы