Difference between revisions of "Catalyst"
(Start page) |
|||
(One intermediate revision by the same user not shown) | |||
Line 2: | Line 2: | ||
This generates an interface for Catalyst to a 'MyApp::Item' object and passes all methods through to the object. The example merely passes a 'datadir' attribute on the object that contains the full path to the "data" directory within the application root. | This generates an interface for Catalyst to a 'MyApp::Item' object and passes all methods through to the object. The example merely passes a 'datadir' attribute on the object that contains the full path to the "data" directory within the application root. | ||
+ | |||
+ | === single instance per application === | ||
+ | |||
+ | This can be useful if you need a counter that persists between requests for example | ||
package MyApp::Model::Item; | package MyApp::Model::Item; | ||
Line 33: | Line 37: | ||
1; | 1; | ||
+ | |||
+ | === one instance per request === | ||
+ | |||
+ | If you need one instance of $c->model('Item') per request, remove the COMPONENT method and add: | ||
+ | |||
+ | with 'Catalyst::Component::InstancePerContext'; | ||
+ | |||
+ | sub build_per_context_instance { | ||
+ | my ($self, $c) = @_; | ||
+ | return MyApp::Item->new( datadir => $c->path_to("data") ); | ||
+ | } | ||
+ | |||
+ | === multiple instance per request === | ||
+ | |||
+ | If you need a different instance of $c->model('Item') every time this is called (eg several items in a single request), start with the original example, remove the COMPONENT method and existing ''use base'' line and add: | ||
+ | |||
+ | use base 'Catalyst::Model::Factory'; | ||
+ | |||
+ | sub ACCEPT_CONTEXT { | ||
+ | my ($self, $c, @args) = @_; | ||
+ | return MyApp::Item->new( datadir => $c->path_to("data") ); | ||
+ | } | ||
+ | |||
+ | |||
+ | == Rewriting all urls from uri_for() == | ||
+ | |||
+ | Useful for when there's a proxy in front and it's rewriting things, or when SSL should be enabled and isn't. | ||
+ | |||
+ | Install Catalyst::TraitFor::Request::ProxyBase and add these two bits either side of the line: extends 'Catalyst'; | ||
+ | |||
+ | use CatalystX::RoleApplicator; | ||
+ | ... | ||
+ | __PACKAGE__->apply_request_class_roles(qw/ | ||
+ | Catalyst::TraitFor::Request::ProxyBase | ||
+ | /); | ||
+ | |||
+ | In Apache config, add into the same sections as your ProxyPass lines: | ||
+ | |||
+ | <Location /preview> | ||
+ | RequestHeader set X-Request-Base http://www.example.com/preview | ||
+ | </Location> |
Latest revision as of 21:49, 16 August 2016
Contents
Creating a model
This generates an interface for Catalyst to a 'MyApp::Item' object and passes all methods through to the object. The example merely passes a 'datadir' attribute on the object that contains the full path to the "data" directory within the application root.
single instance per application
This can be useful if you need a counter that persists between requests for example
package MyApp::Model::Item; use strict; use warnings; use base 'Catalyst::Model'; use MyApp::Item; use Moose; our $AUTOLOAD; has 'Instance' => ( is => 'rw', isa => 'MyApp::Item', ); __PACKAGE__->config( class => 'MyApp::Item' ); sub COMPONENT { my ($self, $app) = @_; return MyApp::Item->new( datadir => $app->path_to("data") ); } sub AUTOLOAD { my $self = shift; my $name = $AUTOLOAD; $name =~ s/.*://; $self->Instance->$name(@_); } 1;
one instance per request
If you need one instance of $c->model('Item') per request, remove the COMPONENT method and add:
with 'Catalyst::Component::InstancePerContext'; sub build_per_context_instance { my ($self, $c) = @_; return MyApp::Item->new( datadir => $c->path_to("data") ); }
multiple instance per request
If you need a different instance of $c->model('Item') every time this is called (eg several items in a single request), start with the original example, remove the COMPONENT method and existing use base line and add:
use base 'Catalyst::Model::Factory'; sub ACCEPT_CONTEXT { my ($self, $c, @args) = @_; return MyApp::Item->new( datadir => $c->path_to("data") ); }
Rewriting all urls from uri_for()
Useful for when there's a proxy in front and it's rewriting things, or when SSL should be enabled and isn't.
Install Catalyst::TraitFor::Request::ProxyBase and add these two bits either side of the line: extends 'Catalyst';
use CatalystX::RoleApplicator; ... __PACKAGE__->apply_request_class_roles(qw/ Catalyst::TraitFor::Request::ProxyBase /);
In Apache config, add into the same sections as your ProxyPass lines:
<Location /preview> RequestHeader set X-Request-Base http://www.example.com/preview </Location>