Разница между View Composer и Creator в Laravel 4?

Согласно документации Laravel 4.

Композитор :

Просмотр композиторов – это обратные вызовы или методы класса, вызываемые при визуализации представления. Если у вас есть данные, которые вы хотите привязать к данному представлению каждый раз, когда это представление отображается во всем приложении, композитор представления может организовать этот код в одном месте. Поэтому просмотр композиторов может функционировать как «модели просмотра» или «докладчики».

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

А также

Создатель :

Просмотр создателей работает почти так же, как просмотр композиторов; однако они запускаются немедленно, когда представление создается. Чтобы зарегистрировать создателя представления, просто используйте метод создателя

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

Итак, вопрос: в чем разница?

Когда вы используете 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 

Мне потребовалось некоторое время, чтобы поработать над этим, мне пришлось копаться в исходном коде, чтобы это исправить. Разница в том, в какой момент цикла приложения Laravel вы хотите, чтобы команда запускалась.

В цикле Laravel есть несколько точек, включающих представления.

Вы можете сделать вид, используя View::make() . Это когда создается представление – и во время команды View::make() вызывается любой объект View::creators() , прежде чем функция вернется.

Обычно вы просто запускаете return View::make() – это означает, что представление «создано», а затем возвращается в ядро ​​Laravel, где оно затем «составлено» для экранирования. Это когда вызывается View::composer() (т.е. после возвращения представления).

Я не уверен, почему вы хотели бы использовать тот или иной, но это объясняет разницу между ними.

Другое отличие состоит в том, что Исключение, созданное в 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"); } ... } }