Laravel:将var传递给控制器​​以动态地从存储中检索项目

时间:2019-07-05 11:22:10

标签: php laravel laravel-5

我的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

旁注:/map_name/name_of_video.mp4部分是我可以从database中检索到的每个视频的内容。

1 个答案:

答案 0 :(得分:1)

这与您有关,在路由参数中使用/字符,该字符在默认情况下不起作用,因为这是用于分隔路由参数的分隔符。

您可以尝试通过以下方法定义路线以克服该问题:

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

您可以在where中定义一个与route参数匹配的正则表达式,在这种情况下,.*/get-video/之后的所有内容都匹配。

您可以像这样使用它:

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

不是,我删除了路由示例中的前导/,以防止路径中出现重复的/字符。