Согласно документации 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"); } ... } }