[Catalyst] Making a hash available across the application

J. Shirley jshirley at gmail.com
Wed Mar 17 18:04:35 GMT 2010


On Wed, Mar 17, 2010 at 9:43 AM, Dermot <paikkos at googlemail.com> wrote:
> Hi,
>
> I'm sure there is a way but it's not jumping out at me.
>
> I have a list of countries and their associated database ID's that I
> need to stash in the header of (almost) every page on a site. I have
> no problems creating a controller that can do
> $c->model(DB::Countries)->search({foo=>1}) and stick that into a
> $c->stash but I don't want to make repeated DB calls. I'd like to
> create a hash at startup and make it available to
> root/lib/site/header. Is it possible to create a hash within
> lib/MyApp.pm that will be available throughout and how would my
> templates access it?
>
> TIA,
> Dp.
>


You can quite easily create accessors off the schema, and use lazy_build.

Something like this:

package MyApp::Schema;

use Moose;
extends 'DBIx::Class::Schema';

has something => (
    is => ro,
    lazy_build => 1
);

sub _build_something {
    my ( $self ) = @_;
    [ $self->resultset('Countries')->search({ foo => 1 })->all ];
}

no Moose;

Then after that if you wish, you can do clear_something and it will be
refetched.

-J

(Code untested, typed out quickly)



More information about the Catalyst mailing list