Доступ к объекту Catalyst $ c из MyApp.pm - PullRequest
1 голос
/ 29 июля 2010

Я использую плагин Assets в своем приложении Catalyst, и мне хотелось бы, чтобы некоторые файлы javascript и css были включены в ресурсы каждой страницы.

Моя первая мысль - это вызов $ c-> assets-> include ('file.js') из MyApp / lib / MyApp.pm, где я делаю установку и настройку, но я не знаю, как получитьтрюм $ с там.

Моя следующая идея заключается в использовании WRAPPER и размещении вызовов типа [% c.assets.include ('file.js')%] в html-шаблоне по умолчанию, но вызовы сбрасывают информацию об объекте на страницутаким образом, вызовы должны были быть отключены, чтобы подавить вывод.

Решения или новые идеи приветствуются.Заранее спасибо.

1 Ответ

4 голосов
/ 30 июля 2010

Во время настройки приложения еще нет объекта контекста, поскольку $ c представляет текущий запрос.

Если вы используете Chained, вы можете выполнить вызов в своем действии корневой цепочки.Если вы используете не связанные цепочки типы действий, такие как Local, Path и т. Д., Вы можете поместить начальное действие в свой корневой контроллер.

Однако, на мой взгляд, самый правильный путь - расширить представление.Вот пример кода:

package MyApp::View::HTML;
use Moose;
use MooseX::Types::Moose qw( ArrayRef Str );
use namespace::autoclean;    

extends 'Catalyst::View::TT';

has common_assets => (
    traits  => [qw( Array )],
    isa     => ArrayRef[Str],
    handles => {
        common_assets => 'elements',
    },
);

before process => sub {
    my ($self, $ctx) = @_;

    $ctx->assets->include($_)
        for $self->common_assets;
};

1;

Затем вы можете настроить его следующим образом:

<view HTML>
    common_assets foo.css
    common_assets bar.js
</view>
...