在 Laravel 控制器中获取当前视图
Posted
技术标签:
【中文标题】在 Laravel 控制器中获取当前视图【英文标题】:Get the current view in a Laravel controller 【发布时间】:2014-12-24 01:25:58 【问题描述】:我想做什么:我想生成当前视图的 PDF 更多详细信息::我有很多客户,我想在每个页面上创建一个按钮,以便我可以生成每个客户详细信息的 PDF。
Laravel 包:https://github.com/barryvdh/laravel-dompdf
到目前为止我做了什么:
-
我将 DomPdf 添加到我的应用程序中
我创建了一个 Route::resource('imprimer', 'PrintController'); 路由
我添加了一个 PrintController
class PrintController extends \BaseController
public function show()
$pdf = PDF::loadView('clients.show');
return $pdf->stream();
-
我在视图中添加了一个链接(2 个版本)
html::linkAction('PrintController@show', 'PDF',array(), array('class'=>'btn btn-primary pull-right mgright10'))
<a href=" URL::to('imprimer/' . $client->id) ">Pdf2</a>
我的问题:如何将当前视图(例如:clients/1)传递给控制器,以便控制器生成当前页面的 PDF?
【问题讨论】:
【参考方案1】:我设法创建了一种新方法来调用“创建 PDF”函数,而无需向 PrintController 添加代码。
PrintController.php
<?php
class PrintController extends \BaseController
public function show( $id )
if( isset($id) )
/** remove last 2 character */
$class_name = substr( $id, 0, -2 );
/** Stay only last character */
$id = substr( $id, -1 );
if( isset($class_name) )
$with_method = 'with'.ucfirst( $class_name ); // withClient
$find_method = ucfirst( $class_name ); // Client
$html = View::make( $class_name .'s.show' )->$with_method( $find_method::find($id) );
else
$html = 'Data Not Found!';
$pdf = App::make( 'dompdf' );
$pdf->loadHTML( $html );
return $pdf->stream();
查看(仅替换客户端和$client)
<a href=" URL::to('imprimer/'.'client='. $client->id) " target="_blank">
<button class="btn btn-primary pull-right mgright10">PDF2</button>
</a>
【讨论】:
【参考方案2】:我找到了方法(我很接近它)。以下是我做的参考:
PrintController.php
class PrintController extends \BaseController
public function show($id)
$client_id = Client::find( $id );
$html = View::make( 'clients.show' )->withClient( $client_id );
$pdf = App::make( 'dompdf' );
$pdf->loadHTML( $html );
return $pdf->stream();
查看
<a href=" URL::to('imprimer/'.$client->id) ">
<button>PDF</button>
</a>
Route.php
Route::resource('imprimer', 'PrintController');
【讨论】:
但是现在每次你想用不同的视图打印页面时都必须创建一个新的控制器功能。你没有得到我工作的答复吗? 是的,我知道我实际上试图合并我的答案和你的答案。 那么我的解决方案有什么问题?还是$client
变量?
是的,它与 $client 变量有关。
在控制器中创建视图的时候一般会传入这个变量吗?【参考方案3】:
您必须设置一个包含当前视图名称的变量,因为没有内置方法。我们可以使用View::composer
,它基本上是一个视图被渲染时的回调。
View::composer('*', function($view)
View::share('view_name', $view->getName());
);
如果它只影响某些视图,您还可以通过将*
更改为另一个掩码来限制它。
所以现在你可以这样做了:
HTML::linkAction('PrintController@show', 'PDF', array($view_name), array('class'=>'btn btn-primary pull-right mgright10'))
并在您的控制器中接收它:
public function show($viewName)
//...
【讨论】:
我在 filters.php 中添加了 View:composer 代码块。我得到了一个未定义的变量:viewName (View: ...app\views\clients\show.blade.php) 错误 哦,我的错。一次我写了view_name
,另一次写了$viewName
...答案已更新
我现在得到 Undefined variable: client (View: ...\app\views\clients\show.blade.php) 我会试着看看为什么,但如果你知道,请告诉我;)
嗯,说实话不知道以上是关于在 Laravel 控制器中获取当前视图的主要内容,如果未能解决你的问题,请参考以下文章
如何从多个控制器获取数据到 Laravel Blade 视图中?
如何通过控制器将两个不同模型的值作为 Laravel 8 中的单个返回变量传递给视图文件