Laravel: передать var в контроллер для динамического извлечения элемента из хранилища - PullRequest
0 голосов
/ 05 июля 2019

В моем FileController есть следующая функция, которая извлекает видео из моего storage (local):

function getVideo() {

    $video = Storage::disk('local')->get("uploads/map_name/name_of_video.mp4");
    $response = Response::make( $video, 200 );
    $response->header( 'Content-Type', 'video/mp4' );

    return $response;
}

В моем web.php есть следующее route:

Route::get('/get-video/', 'FileController@getVideo')->name('get-video');

Последнее, в моем view, у меня есть следующее:

<video controls>

    <source src="{{ route('get-video') }}" type="video/mp4">
    Your browser does not support the video tag.

</video>

Это отлично работает. Видео показывается на мой взгляд. Тем не менее, я хотел бы сделать эту функцию динамичной, но я не могу заставить ее работать. Я сделал следующие изменения:

Сначала я передал var функции getVideo и передал ее функции get:

function getVideo($video_name) {

    $video = Storage::disk('local')->get("uploads/{$video_name}");
    $response = Response::make( $video, 200 );
    $response->header( 'Content-Type', 'video/mp4' );

    return $response;
}

Затем я изменил route на var:

Route::get('/get-video/{video_name}', 'FileController@getVideo')->name('get-video');

И, наконец, в моем view я передаю var в route

<video controls>

    <source src="{{ route('get-video', ['video_name' => '/map_name/name_of_video.mp4']) }}" type="video/mp4">
    Your browser does not support the video tag.

</video>

Это, однако, приводит к 404 не найден. Я получаю этот маршрут: https://mysite.local/get-video/map_name/name_of_video.mp4.

Обратите внимание, что часть /upload не обрабатывается. Однако, если я добавлю это вручную, маршрут также не будет выполнен.

Я уже сделал php artisan storage:link.

Sidenote: часть /map_name/name_of_video.mp4 - это то, что я могу извлечь из database для каждого видео.

1 Ответ

1 голос
/ 05 июля 2019

Это связано с тем, что вы используете символ / в параметре маршрута, который по умолчанию не работает, поскольку это символ-разделитель, используемый для разделения параметров маршрута.

Вы можете попытаться определить маршрутЧтобы преодолеть это, выполните следующие действия:

Route::get('/get-video/{video_name}', 'FileController@getVideo')->name('get-video')->where('video_name', '(.*)');

В where вы можете определить регулярное выражение, соответствующее параметру маршрута, в этом случае .* соответствует всему, что следует после /get-video/.

Вы можете использовать его следующим образом:

{{ route('get-video', ['video_name' => 'map_name/name_of_video.mp4']) }}

Не я удалил начальный / в примере маршрута, чтобы предотвратить дублирование символа / в пути.

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