Есть ли способ добавить ресурс на каждую страницу в Phalcon?

Я читаю документацию для Phalcon, пытаясь найти способ использования Управляющий активами добавить файлы CSS или JS на каждую страницу по умолчанию. Мне не удалось найти какой-либо способ сделать это.

Добавление ресурса для всего контроллера легко выполняется с помощью:

public function initialize() {
$this->assets->addCss('css/global.css');
}
  • Можно ли как-нибудь добавить ресурс ко всем контроллерам по умолчанию?

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

Спасибо, благодарю за помощь.

1

Решение

Пока что делать это в базовом контроллере кажется лучшим способом, хотя я согласен, что он пахнет немного неаккуратно. Хотя кажется, что такие активы, как css и js, как предполагается, являются частью авторитета представления и не должны затрагиваться откуда-то еще, в реальной жизни это не так. Прежде всего, вы конфигурируете свои представления из контроллеров, вы указываете, какие параметры вводятся там, и вы указываете отдельные ресурсы для конкретных представлений и т. Д. Нет причин, по которым вы не должны предоставлять global.css с ним в базовом контроллере.

Единственное, что я нахожу действительно небрежным, — это то, что существует независимое представление и существует независимый управляющий активами, который на самом деле должен быть связан вместе, и активы, которые вы устанавливаете для определенного представления, должны относиться только к этому представлению. Бывают случаи, когда вы хотите визуализировать представление независимо от всего остального и использовать его собственные ресурсы из представления по умолчанию, например, вывести шаблон приветствия по электронной почте после регистрации. В текущей реализации это может быть достигнуто только путем перезаписи достаточного количества логики.

В качестве альтернативы вы можете прикрепить этот стиль непосредственно в шаблон, если вы не сводите их в один файл. Вы также можете попробовать добавить актив прямо в вашем представлении с assets.addCss('css/global.css') — это может не сработать сразу, если вольт делает это через вспомогательные функции, и в этом случае вы должны сначала реализовать свою собственную. Это, однако, подразумевает добавление логики к представлению, которое никогда не бывает хорошим, если вы не можете жить без него. Итак, придерживайтесь подхода базового контроллера.

Редактировать: по иронии судьбы, через день я обнаружил проблему с этим через initialize() обработчик событий после использования его более года.

Когда вы пересылаете данные с одного контроллера на другой, контроллер, куда вы пересылаете данные, также инициализируется. Это означает, что один и тот же ресурс добавляется дважды, и если они объединяются в один файл, бог знает, что произойдет … Это меньше проблем для css (только увеличенный размер), но JS, скорее всего, сломается, часто без любая индикация. Это легко исправить с помощью afterExecuteRoute() обработчик в контроллере с проверкой состояния диспетчера:

public function afterExecuteRoute()
{

// If dispatcher hasn't finished dispatching we shouldn't enter.

if (!$this->dispatcher->isFinished()) {
return;
}

$this->assets->addCss('css/global.css');
}

В вашем наследующем представлении просто переопределите это с помощью этого:

public function afterExecuteRoute()
{
parent::afterExecuteRoute();

if (!$this->dispatcher->isFinished()) {
return;
}

$this->assets->addCss('css/custom.css');
}
1

Другие решения

Вы также можете управлять менеджером активов в DI.

$di->setShared("assets", function() {

$assetManager = new \Phalcon\Assets\Manager();
$assetManager->addJs('/path/to/some/js/file');

return $assetManager;

});

Это позволит всегда загружать файлы js. Вы можете передать ему конфигурацию, чтобы сделать его динамичным. Просто зарегистрируйте это где-нибудь в вашем index.php перед запуском $ app-> handle () -> getContent () ;.

3

По вопросам рекламы [email protected]