【问题标题】:Laravel 5.1 : Passing Data to View ComposerLaravel 5.1:将数据传递给 View Composer
【发布时间】:2016-03-13 04:57:55
【问题描述】:

我在 Laravel 5.1 中使用视图作曲家:很好。 但是如何将参数传递给视图作曲家?

就我而言,我使用 de view composer 将周信息(前一周、当前周、下周,包括日期)发送到我的视图。当前周是可变的,不仅来自 url,还来自控制器。

public function compose(View $view)
{
   // I need a parameter here (integers)
}

【问题讨论】:

  • @craig_h 给视图作曲家,因为我必须做业务逻辑。
  • 你能展示一个你想要传递这些参数的上下文示例吗?
  • 这个地方是控制器。但是控制器可以从 url 中获取 de 参数,也可以从其他类中获取。然后,我不能使用 Request::get(),但我需要通过查看作曲家。理解? ;-)
  • 好的,你能不能为视图编辑器使用一个包装类,从控制器向类传递数据,最后调用 compose 方法访问从控制器传递的数据?
  • 感谢您的 cmets。您的情况是正确的。我从不想在我的视图中使用 Request::get() 作曲家:太糟糕了。在 Laravel 4 中,我看到你可以使用 $view->getData()....

标签: php laravel view laravel-5 laravel-5.1


【解决方案1】:

我认为如果您想从控制器向视图编辑器传递一些数据,那么您可以使用会话。在会话中设置来自控制器的数据,您可以在视图编辑器中从会话中获取数据。这对我来说是诀窍而没有做任何复杂的事情

控制器

    public function index()
    {
       session(['key' => 'value']);
       return view('your_view');
    }

View Composer

    public function compose(View $view)
    {
        $data = session('key');
        return $view->with('your_data',$data);
    }

【讨论】:

  • 我不希望只使用构建视图所需的数据来污染会话。
【解决方案2】:

您在控制器中传递给视图的所有数据都将在视图控制器中可用。在视图实例上使用getData 方法,如下所示:

$view->getData()["current_week"];

在您的特定情况下,您可以这样做:

public function compose(View $view)
{
   $current_week = $view->getData()["current_week"];
   //use $current_week as desired 
}

你也可以像这样从请求中获取路由中的数据(路由参数):

request()->route()->getParameter('week_number');

【讨论】:

  • 自从提出问题以来,我不知道这是否是一项新功能,但 IMO 这应该是公认的答案。
  • 看起来你也可以使用$view->current_week。 View 上的魔术 _get() 方法应该可以很好地处理它。
【解决方案3】:

如果您必须将参数从控制器传递给视图作曲家,您可以为作曲家创建一个包装类,并在需要时将数据传递给它。然后,当您完成数据设置后,您可以组合视图:

ComposerWrapper 类

public function __construct(array $data)
{
    $this->data = $data;
}

public function compose()
{        
    $data = $this->data;

    View::composer('partial_name', function( $view ) use ($data) 
    {
        //here you can use your $data to compose the view
    } );
}

控制器

public function index()
{
    //get the data you need
    $data = ['first_value' = 1]; 

    //pass the data to your wapper class
    $composerWrapper = new ComposerWrapper( $data );

    //this will compose the view
    $composerWrapper->compose();

   //other code...
}

【讨论】:

  • 谢谢,非常漂亮!
  • 我对多个视图有类似的情况。在那种情况下,我需要在控制器的多个函数中编写一些代码。有没有其他解决方案?
猜你喜欢
  • 2020-11-13
  • 2020-04-19
  • 1970-01-01
  • 2016-04-01
  • 2015-11-25
  • 2020-11-14
  • 1970-01-01
  • 1970-01-01
  • 2016-09-14
相关资源
最近更新 更多