Laravel 5.1:向视图组件传递数据

6

我正在使用Laravel 5.1的视图组合器:很不错。但是我该如何向视图组合器传递参数呢?

在我的情况下,我通过视图组合器向视图发送周信息(包括前一周、本周和下一周的日期)。当前周是一个变量,不仅来自于url,还来自于控制器。

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

@craig_h 给视图组合器,因为我需要处理业务逻辑。 - schellingerht
你能展示一个想要传递这些参数的上下文例子吗? - Moppo
这里的控制器是主导者。但是,控制器可以从URL中获取参数,也可以从其他类中获取参数。因此,我不能使用Request::get(),而是需要传递给视图组件。明白吗?;-) - schellingerht
好的,你可以使用一个包装类来作为视图组合器,从控制器中传递数据到这个类中,最后调用compose方法来访问从控制器传递过来的数据。 - Moppo
感谢您的评论。您的情况是完全可能的。我从不想在我的视图组合器中使用Request::get():太糟糕了。在Laravel 4中,我发现您可以使用$view->getData()... - schellingerht
@HenriSchellingerhout:我已经添加了一个答案,请检查它是否有用。 - Moppo
3个回答

9
如果您需要从控制器传递参数给视图组合器,可以创建一个包装类来封装组合器,并在需要时向其传递数据。然后,在设置完数据后,您可以进行视图的组合操作: 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...
}

1
谢谢,非常漂亮! - schellingerht
我有多个视图的类似情况。在这种情况下,我需要在控制器中的多个函数中编写一些代码。是否有任何替代解决方案? - bhattraideb

9

在控制器中传递给视图的所有数据都将在视图控制器中可用。像这样在视图实例上使用 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');

我不知道这是否是自提问以来的新功能,但在我看来,这应该是被接受的答案。 - musicin3d
1
看起来你只需要使用 $view->current_week。View 上的魔术 _get() 方法应该可以很好地处理它。 - musicin3d

0

我认为如果你想从控制器将一些数据传递给视图组合器,那么你可以使用会话。在控制器中设置数据到会话中,然后你就可以在视图组合器中获取会话中的数据。这对我来说是一个简单的解决方案,而不需要做任何复杂的事情。

控制器

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

视图组合器

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

我宁愿不要在会话中添加仅用于构建视图的数据,以免污染会话。 - musicin3d

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接