Подтвердить что ты не робот

Разница между 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());
});

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

4b9b3361

Ответ 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");
        }
        ...
    }
}