Laravel 4:从视图中的链接下载文件

时间:2014-12-27 05:20:12

标签: php laravel laravel-4

我正在尝试在我的视图中制作动态下载链接列表,但我不太确定如何为每个链接返回 response::download

这是我试过的......

1.-我的观点

@extends('layouts.main')
@section('content')
    @foreach($files as $file)   
        <div class = "row fondue">
                <h3><div class="col-md-12"><b><?php echo link_to("/home/download",$file->name,$file)?> </b></div></h3>                  
        </div>  

    @endforeach

@stop

我不确定我是否可以向link_to发送第三个参数

2.-我的路线

Route::get('/home/download','HomeController@downloadfile')->before('auth');

3.-我在控制器中的功能

public function downloadfile($file)
{
    return Response::download($file->route);
} 

视图看起来很正常,但点击链接即可获得 错误:

"Missing argument 1 for HomeController::downloadfile()"

所以我的疑问是......我如何将我视图中链接中遗失的参数发送给我的控制器?

也......有更好的方法吗?

2 个答案:

答案 0 :(得分:1)

您收到的错误是,您的方法downloadfile()希望传递$file,但您的路线不会给它一个。因此,您需要使用参数更新路线,如下所示:

Route::get('/home/download/{$file}','HomeController@downloadfile')->before('auth');

但是,由于我们要将内容传递给它,我建议将其命名为 - 以后会更容易:

Route::get('/home/download/{$file}', [
    'as' => 'download.file',
    'uses' => 'HomeController@downloadfile']
)->before('auth');

接下来,正如您猜测的那样,您需要更新链接。 link_to()辅助函数不接受参数数组,这就是我们现在使用命名路由的原因,因此我们现在可以使用link_to_route() - 让我们看一下the documentation:< / p>

echo link_to_route('route.name', $title, $parameters = array(), $attributes = array());

这意味着我们可以重写。而且,不要忘记你正在使用Blade - 不需要php标签。所以我们最终得到了这个:

{{ link_to_route('download.file', $file->name, [$file->id]) }}

最后,我不知道你的应用程序逻辑,但你的控制器方法可能需要从找到你现在提供的id的文件开始。这是一个例子,但它实际上取决于你的应用程序的外观。

public function downloadfile($id)
{
    $file = SomeFileModel::findOrFail($id);
    return Response::download($file->route);
}

希望有所帮助!祝你好运。

答案 1 :(得分:0)

将link_to函数更改为

link_to("/home/download/$file->name",$file->name)

将您的路线更改为:

Route::get('/home/download/{name?}','HomeController@downloadfile')->before('auth');
之后,您将能够在下载文件函数中看到参数