Hey, no problem. Mojolicious so far, can do just about anything I can think 
of, without much difficulty, as most stuff just work out of the box, which 
is a pleasant surprise.

If you don't mind, I'll take a step back, and describe my design and reason 
behind it, and see if you can maybe spot something that's wrong with my 
approach. Here's the hypothetical scenario:

1. Two customers, one Kwikemart, and one Ezymart, they both handle boxes, 
but in different ways, one open it with a cutter, say, and the other one 
insist on using bare hands.
2. So I build one Customer class, and extend it, to implement actual 
customer. Both Kwikemart and Ezymart are children of Customer class, and 
each has a open_box() method, but within it, they each do their own thing.
3. In order to expose the boxes' content as RESTful resource, the url to 
access them, will be something like /api/v1/:customer/box/:boxid

Of course, I could just code the route explicitly, since there's only two 
customer, by having:

    
 $r->get('/api/v1/kwikemart/box/:id')->to('Customer::Kwikemart#open_box');
     $r->get('/api/v1/ezymart/box/:id')->to('Customer::Ezymart#open_box');

However, it just feels not elegant. The name of the class, is the only 
difference between the two different routes, and it'll be great to 
generalize it within the dispatching process, so if I have hundreds 
customers to do tomorrow, each of their own variants of 'open_box()' 
action, can be routed with just one call, instead of hundreds, as long as 
the url conforms to the '/api/v1/:customer/box/:id' format.

Maybe I am just trying to be too clever for my own good, but I really think 
there must be an easy and elegant way to do this?




On Wednesday, January 2, 2019 at 4:27:44 PM UTC-6, Stefan Adams wrote:
>
> Hi!  I'm glad you were able to figure that out and even using the more 
> advanced hook feature, but if I'm understanding your objective correctly, I 
> would advise that you follow the references I shared.  In essence, if I'm 
> reading it correctly, you are using a framework and then solving problems 
> on your own which are already solved by the framework.
>
> I just want to make sure you get off to a good start with Mojolicious so 
> that you can reap the full benefits of the framework and not become 
> irritated that it's not doing things that you want easily -- essentially 
> questioning why you're using this framework in the first place.  :)
>
> I'd recommend starting with a Mojolicious::Lite app.
>
> Start with the Hello World 
> <https://mojolicious.org/perldoc/Mojolicious/Guides/Tutorial#Hello-World> 
> in the Tutorial.  And then expand it for your needs, perhaps like so:
>
> #!/usr/bin/env perluse Mojolicious::Lite;
> get '/:customer' => sub {
>   my $c = shift;
>   $c->render(inline => 'Hello, <%= param "customer" %>!');};
>
> app->start;
>
>
> Also, just to show some other equivalent ways to do the same thing:
>
> #!/usr/bin/env perluse Mojolicious::Lite;
> get '/:customer' => sub {
>   my $c = shift;  my $customer = $c->param('customer');
>   $c->render(inline => 'Hello, <%= $customer %>!', customer => $customer);};
>
> app->start;
>
>
> Also:
>
> #!/usr/bin/env perluse Mojolicious::Lite;
> get '/:customer' => sub {
>   my $c = shift;  $c->render(inline => 'Hello, <%= $c->param("customer") 
> %>!');};
>
> app->start;
>
>
> On Wed, Jan 2, 2019 at 3:39 PM <hwmbo...@gmail.com <javascript:>> wrote:
>
>> Thanks Stefan. 
>>
>>
>> So, trying a different tack, I was able to parse the url of a request 
>> with a 'before_depatch' hook, and figure out what Customer Class should be 
>> used, before routing happens.
>>
>> Assuming the request url is /kwikemart/liquor/22, I figure out the 
>> customer name (kwikemart) like this:
>>
>>
>> sub startup {
>>     my $self = shift;
>>     $self->req->url->path =~ m#^/(\w+)/.+#;
>>     $customer = $1;}
>>
>>
>> The question is, where to store this $customer, so I can use it to 
>> specify the correct route later? I still don't quite get how Mojo::Base 
>> Class work. Not sure how to correctly create custom attribute, that's local 
>> to each request, so it can be used within a $r->to() call.
>>
>>
>>
>>
>>
>> On Wednesday, January 2, 2019 at 4:34:20 AM UTC-6, hwmbo...@gmail.com 
>> wrote:
>>>
>>> Hi. I want to route a request to a controller that's dynamically 
>>> constructed, base on a place holder in the url. To illustrate, I want do 
>>> something like the following:
>>>
>>> use Mojo::Base 'Mojolicious';
>>>
>>> sub startup {
>>>
>>> my $r = $self->routes;
>>>
>>>            my $route = $r->get('/:customer/boxs/:id');
>>>  
>>>
>>> [ somehow, extract the :customer holder into a variable $customer, then ]
>>>
>>>            $route->(
>>>
>>> controller => "$customer::boxs',
>>>
>>> action     => 'get_list',
>>>
>>> );
>>>
>>> }
>>>
>>>
>>> I tried but can't seem to find way to this, and I'm not sure if this is 
>>> possible?
>>> Some pointer is appreciated. Thanks. 
>>>
>>>  
>>>
>>> -- 
>> You received this message because you are subscribed to the Google Groups 
>> "Mojolicious" group.
>> To unsubscribe from this group and stop receiving emails from it, send an 
>> email to mojolicious...@googlegroups.com <javascript:>.
>> To post to this group, send email to mojol...@googlegroups.com 
>> <javascript:>.
>> Visit this group at https://groups.google.com/group/mojolicious.
>> For more options, visit https://groups.google.com/d/optout.
>>
>

-- 
You received this message because you are subscribed to the Google Groups 
"Mojolicious" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to mojolicious+unsubscr...@googlegroups.com.
To post to this group, send email to mojolicious@googlegroups.com.
Visit this group at https://groups.google.com/group/mojolicious.
For more options, visit https://groups.google.com/d/optout.

Reply via email to