It's so funny how this questions comes up over and over again. I even have 
to battle it myself from time to time, even when I know how stupid (Sorry 
for using "stupid", but I think I'm allowed as it reflects back on myself), 
limiting, hard to get around later, ... it would be to pass some $app-like 
object around to lower level models.

Also, I probably know how your mind is set on your statement, and how you 
probably just want to get confirmation instead of the answer I'm giving 
you. Yes... Me and many before you have been in the same state of mind.

So... I was hoping I could help you with my Mojo::Pg->new() example above, 
but it seems like I have failed.

I wish you the best of luck finding the right solution.

I also apologize if I'm stepping on yours or anyone else's toes. That is 
not my intention.


On Monday, April 20, 2015 at 10:31:45 AM UTC+2, Eugene Toropov wrote:
>
> Hi Jan,
>
> Having to pass "db => shift->model->db” in every model helper doesn’t seem 
> like invisible way ;) It would be really invisible if you had “use DB” 
> inside a model package and then “my $db = $DB::dbh” :) but then you’d have 
> to somehow pass app->config to DB. Also if you kept something in 
> app->config that model needs - would you pass it as another parameter to 
> every model you had? What if then you had app->cache (redis/memcached) ? 
> Another parameter to pass to every model again? I feel it doesn’t seem good 
> but can’t find any other way in Mojo to do it so thought someone had found 
> the solution...
>
> Cheers
> Eugene
>
> On Apr 20, 2015, at 11:18 AM, Jan Henning Thorsen <jan.henn...@thorsen.pm> 
> wrote:
>
> I pass on $db to every instance of a model in MCT: 
> https://github.com/mojoconf/MCT/blob/master/lib/MCT.pm#L33
>
> Just make a helper where the passing of $db (or any other common argument) 
> is "invisible".
>
> The nice thing is that the model will need to know less. It will then be 
> easier to use for "other things" outside of your Mojo app. To flip the 
> question around. Which version ofof the code below makes most sense?
>
>   my $app = Mojolicious->new;
>   $db = Mojo::Pg->new(app => $app);
>   $db = Mojo::Pg->new(app => $app->config->{db}{dsn});
>
> (I hope the version where $app is passed to new() looks weird...)
>
>
> On Monday, April 20, 2015 at 9:17:27 AM UTC+2, Eugene Toropov wrote:
>>
>> Hi Jan,
>>
>> Thanks for your reply. Don’t you think that passing app->db to every 
>> model is not a good idea neither because model must know itself where data 
>> are and how to fetch it and pass to controller? Also it’s simply 
>> inconvenient to always have one (or even 2 - app->db and app->redis for 
>> example) arguments passed to every model, no?
>>
>> Cheers
>> Eugene
>>
>> On 20 Apr 2015, at 10:07, Jan Henning Thorsen <jan.henn...@thorsen.pm> 
>> wrote:
>>
>> You don't. Passing $app or $c to a model is not a good idea. Reason for 
>> this is that it makes it hard to reuse the models elsewhere. What you can 
>> do, is passing data from $app when you construct your models, but I would 
>> strongly advice against passing $app.
>>
>>
>> On Friday, April 17, 2015 at 4:38:06 PM UTC+2, Eugene Toropov wrote:
>>>
>>> Greetings,
>>>
>>> In the following example how will you make MyApp::Model::Users have 
>>> access to app object (which is basically $self) that is necessary to use 
>>> app->db and app->config?
>>>
>>>
>>> http://mojolicio.us/perldoc/Mojolicious/Guides/Growing#WELL-STRUCTURED-APPLICATION
>>>
>>> package MyApp;use Mojo::Base 'Mojolicious';
>>> use MyApp::Model::Users;
>>> sub startup {
>>>   my $self = shift;
>>>
>>>   $self->secrets(['Mojolicious rocks']);
>>>   $self->helper(users => sub { state $users = MyApp::Model::Users->new });
>>>
>>>   my $r = $self->routes;
>>>
>>>   $r->any('/' => sub {
>>>     my $c = shift;
>>>
>>>     my $user = $c->param('user') || '';
>>>     my $pass = $c->param('pass') || '';
>>>     return $c->render unless $c->users->check($user, $pass);
>>>
>>>     $c->session(user => $user);
>>>     $c->flash(message => 'Thanks for logging in.');
>>>     $c->redirect_to('protected');
>>>   } => 'index');
>>>
>>>   my $logged_in = $r->under(sub {
>>>     my $c = shift;
>>>     return 1 if $c->session('user');
>>>     $c->redirect_to('index');
>>>     return undef;
>>>   });
>>>   $logged_in->get('/protected');
>>>
>>>   $r->get('/logout' => sub {
>>>     my $c = shift;
>>>     $c->session(expires => 1);
>>>     $c->redirect_to('index');
>>>   });}
>>> 1;
>>>
>>> Cheers
>>> Eugene
>>>
>>
>> -- 
>> 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 http://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 http://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 http://groups.google.com/group/mojolicious.
For more options, visit https://groups.google.com/d/optout.

Reply via email to