【问题标题】:Difference between View Composer and Creator in Laravel?Laravel 中 View Composer 和 Creator 的区别?
【发布时间】:2013-10-16 09:51:57
【问题描述】:

根据Laravel 4 documentation.

作曲者是

视图合成器是在渲染视图时调用的回调或类方法。如果每次在整个应用程序中呈现该视图时,您都希望将数据绑定到给定视图,则视图编辑器可以将该代码组织到一个位置。因此,视图合成器的功能可能类似于“视图模型”或“演示者”。

View::composer('profile', function($view)
{
    $view->with('count', User::count());
});

还有

创作者是

视图创建者的工作方式几乎与视图作曲家一样;但是,当视图被实例化时,它们会立即被触发。要注册视图创建者,只需使用 creator 方法

View::creator('profile', function($view)
{
    $view->with('count', User::count());
});

所以问题是:有什么区别?

【问题讨论】:

    标签: php laravel view laravel-4


    【解决方案1】:

    另一个区别是 ViewCreator 中抛出的异常将冒泡回到控制器。这对于授权很方便。在 ViewCreator 中,您可以获得权限数据,然后如果用户没有获得该页面的授权,则抛出异常并让控制器处理它。例如:

    class MyController {
        public function MyAction {
            try {
                return view('my_view');
            } catch (\Exception $e) {
                echo "<h1>Exception</h1>";
                echo $e->getMessage();
            }
        }
    }
    
    class MyViewCreator {
        public function create(View $view) {
            $loggedInUser = User::with('permissions')->find(Auth::user()->id);
            if (! $loggedInUser->hasPermission('MY_PERMISSION')) {
                throw new \Exception("You are not authorized");
            }
            ...
        }
    }
    

    【讨论】:

      【解决方案2】:

      我花了一段时间才解决这个问题,我不得不挖掘源代码来解决它。不同之处在于您希望命令在 Laravel 应用程序循环的哪个时间点运行。

      Laravel 循环中有很多点涉及视图。

      您可以使用View::make() 进行查看。这是在实例化视图时 - 在 View::make() 命令期间,在函数返回之前调用任何 View::creators()

      通常你只需运行return View::make() - 这意味着视图是“创建的”,然后返回到 Laravel 核心,然后它被“组合”到屏幕上。这是调用 View::composer() 的时间(即在视图返回之后)。

      我不确定您为什么要使用其中一个,但这解释了两者之间的区别。

      【讨论】:

      【解决方案3】:

      当您使用View::creator 时,您有机会覆盖控制器中的视图变量。像这样:

      View::creator('layout', function($view) {
          $view->with('foo', 'bar');
      });
      
      // in controller
      return View::make('layout')->with('foo', 'not bar at all');
      
      // it's defined as 'not bar at all' in the view
      

      -

      View::composer('hello', function($view) {
          $view->with('foo', 'bar');
      });
      
      // in controller
      return View::make('hello')->with('foo', 'not bar at all');
      
      // it's defined as 'bar' in the view
      

      【讨论】:

      • 这是一个很好的答案,因为它提供了一个具体的例子。谢谢!
      • 这个答案很有道理
      • 应该包含在官方文档中。
      猜你喜欢
      • 2013-08-21
      • 2018-10-24
      • 2016-10-01
      • 2014-07-29
      • 2018-09-19
      • 1970-01-01
      • 1970-01-01
      • 2019-05-18
      • 2010-11-17
      相关资源
      最近更新 更多