【问题标题】:Get the current view in a Laravel controller在 Laravel 控制器中获取当前视图
【发布时间】:2014-12-24 01:25:58
【问题描述】:

我想做什么:我想生成当前视图的 PDF 更多详细信息::我有很多客户,我想在每个页面上创建一个按钮,以便我可以生成每个客户详细信息的 PDF。

Laravel 包:https://github.com/barryvdh/laravel-dompdf

到目前为止我做了什么

  1. 我将 DomPdf 添加到我的应用程序中
  2. 我创建了一个 Route::resource('imprimer', 'PrintController'); 路由
  3. 我添加了一个 PrintController

class PrintController extends \BaseController{

    public function show(){
      $pdf = PDF::loadView('clients.show');
      return $pdf->stream();
}}
  1. 我在视图中添加了一个链接(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?

【问题讨论】:

    标签: php laravel dompdf


    【解决方案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) 我会试着看看为什么,但如果你知道,请告诉我;)
      • 嗯,说实话不知道
      猜你喜欢
      • 2023-03-21
      • 1970-01-01
      • 1970-01-01
      • 2012-12-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-13
      • 2014-09-09
      相关资源
      最近更新 更多