Разница между 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());
});
Итак, вопрос: В чем разница?
Ответы
Ответ 1
При использовании View::creator
у вас есть возможность переопределить переменные вида в контроллере. Вот так:
View::creator('layout', function($view) {
$view->with('foo', 'bar');
});
// in controller
return View::make('layout')->with('foo', 'not bar at all');
// it 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 defined as 'bar' in the view
Ответ 2
Мне потребовалось некоторое время, чтобы разобраться в этом, мне нужно было найти исходный код для его работы. Разница заключается в том, в какой момент цикла приложения Laravel вы хотите, чтобы команда запускалась.
В цикле Laravel, включающем представления, есть несколько точек.
Вы можете сделать вид, используя View::make()
. Это когда создается представление - и во время команды View::make()
вызывается любой View::creators()
, прежде чем функция возвращается.
Обычно вы просто запускаете return View::make()
- это означает, что представление "создано", а затем возвращается в ядро Laravel, где оно затем "составлено" для экранирования. Это когда вызывается View::composer()
(т.е. После возвращения представления).
Я не уверен, почему вы хотели бы использовать тот или другой, но это объясняет разницу между ними.
Ответ 3
Другое отличие состоит в том, что Исключение, созданное в 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");
}
...
}
}