[Catalyst] Creating my own controller and another question
Matt S Trout
dbix-class at trout.me.uk
Fri Apr 28 18:45:40 CEST 2006
John Napiorkowski wrote:
> Thanks for such a quick reply. I'm still shaking my
> head about the strange config problem. I think I'll
> have to break out a separate instance of catalyst to
> clarify it and try to write a test case for it.
The other reply explains the problem. Making the code do the _config({ %{
_config } }) trick I described in my last mail should fix it.
> One thing that I am rather confused about is how and
> when $self and $c appear or not. I got that you have
> to use the "my ($self, $c) = @_);" and not try to
> shift them in the way I am used to with other perl
> development. However I get into a lot of trouble when
> I need the $c but only have $self (such as when I have
> some controller accessors) or I have $c but not $self
> (such as is the default with template toolkit
> templates). I am not sure what you mean when you say:
The first is fixed by passing $c, using ACCEPT_CONTEXT or making the method an
action and ->forward-ing to it.
The second is simply not true, [% c.controller %] will give the primary
controller for a request on latest Catalyst, and [% c.comp(c.action.class) %]
will work right back to 5.50.
>> when Catalyst retrieves a component of any type for
>> use, if the component has
>> an ACCEPT_CONTEXT method it calls that with $c as an
>> argument and returns the
>> result.
"when Catalyst retrieves a component" as in "when $c->comp or
->model/view/controller is called". Which Catalyst does to provide the
execution environment for actions.
> For example, in the code snippet you suggested I could
> used to override the new subroutine for a subclass of
> controller, would there be any way to get the $c
> context object?
>
>> sub new {
>> my $self = shift;
>> my $new = $self->NEXT::new(@_);
>> $new->init;
>> return $new;
>> }
>
> From the source code of Catalyst::Component it looks
> like I could just say "my ( $self, $c ) = @_;" instead
> of "my $self = shift;" but for some reason I have
> trouble with that. Should that work? And how could I
> get the context object if I had something like:
Read through the source to Catalyst::Component again, and bear in mind you can
always do things like
my $self = shift;
my ($c) = @_;
> package mycontroller;
> use base 'Catalyst::Controller';
>
> sub index: Private
> {
> my ($self, $c) = @_;
>
> $self->test;
> }
>
> sub test
> {
> my $self = shift @_;
>
> ##I NEED the $c here?
> }
if you need it, either stash it at ACCEPT_CONTEXT time, pass it through
explicitly, or make test :Private and $c->forward('test');
> Maybe there is different best practices way for me to
> do this. Your suggestions would be helpful.
It depends what you're trying to achieve, and the contrived examples you've
posted so far don't make that remotely clear.
> On a side issue, right now I am working on a project
> using catalyst and trying to get my client to agree to
> me posting the code in a public location for other
> developers to check out. If I can do this is there a
> place where catalyst developers prefer to find such
> examples? For example I noticed a list of catalyst
> driven sites on the developers wiki.
Depending on the license it might be possible to accept the code to examples/
in trunk. Otherwise, linking it from the wiki is probably good.
--
Matt S Trout Offering custom development, consultancy and support
Technical Director contracts for Catalyst, DBIx::Class and BAST. Contact
Shadowcat Systems Ltd. mst (at) shadowcatsystems.co.uk for more information
+ Help us build a better perl ORM: http://dbix-class.shadowcatsystems.co.uk/ +
More information about the Catalyst
mailing list