Yip, your approach is pretty much how I do it.

1) getUser() is called in UserService() ( we could also be talking about an 
AuthenticationService here but lets keep it simple :-) )
2) the getUser() method creates a new User bean / business object and sets the 
username and password properties
3) It then delegates to your UserDAO's read() method, passing it the bean.
4) UserDAO's read() method runs the sql SELECT * FROM users WHERE ..... query.
5) If a record is found it converts the record into a struct and runs init() on 
the bean, passing it the struct. The read method returns void.
6) The UserService's getUser() method returns the loaded bean

As far as the bean's validate methods are concerned I only use them before 
saving the bean. ie if the html form is processed I init() the User bean with 
the form data, call UserService.save(User) which does an <cfif User.validate() 
then UserDAO.save(User). The service returns a result (either a Result object 
that Brian uses or an array of structs with all the error info on field, 
message, error type etc) This lets you either redirect the user back to the 
form, show the errors or to a success page etc.

If the validation for Users and Administrators was different your validate() 
method could do an <cfif IsAdministrator() validateAdministrator() etc. Your 
validate() method would also call isPasswordValid() etc

Your question about what if no records are returned is worth looking at. My 
usual use case for the above process is calling getXXXX() and passing it an id 
so it should find a record. I think for login stuff an AuthenticationService is 
a good thing that just concentrates and getting username and password, calling 
UserGateway. If one record is returned, the authenticationService returns true, 
else it returns false. Then your controller method can redirect to login page 
or go to the page its meant to be going to.

Hope this makes sense. Its worth remembering this is just one way of doing it 
and it seems to work fine for me. A friend of mine runs save() from his bean 
rather than his Service and injects DAO's into his beans. It works well for him 
so he's sticking with that.

Alan
________________________________________
From: [email protected] [EMAIL PROTECTED] On Behalf Of Matthew [EMAIL 
PROTECTED]
Sent: 27 August 2008 05:23
To: CFCDev
Subject: [CFCDEV] Re: CF, DAOs, CRUD and OO

Hi Alan

Thanks for the detailed response - very helpful.

Just one question regarding "Your User.cfc bean / business object
would enforce your business rules, ie isPasswordValid(),
isAdministrator(), validateUser()..." I don't get how this would
work... let me paint a picture of how I understand it working (lets
forget about the factory for now);

1. Call getUser() in UserService (passing in username and password for
validating)
2. So does the UserService call validateUser() in UserBean... but I
though Beans are objects with just getters and setters (i.e. no
querying).
I thought the process would have been:
1. Call getUser() in UserService (passing in username and password for
validating)
2. UserService init's a UserBean (passing in username and password)
3. UserService passes UserBean to Read() in UserDAO (passing in an
half-baked-bean)
4. UserDAO runs query looking for record (calls getUsername() and
getPassword() from the half-baked-bean which was passed in).
5. If a record was found then re-run the Init() function on the half-
baked-bean passing in query results as arguments i.e. if
(q.recordcount) { arguments.userBean.init(q.Firstname,q.Lastname)} and
then return the fully-baked-bean.
5b. I'm not to sure what you should do if no recordcount. Perhaps this
is your point that you return the bean to UserService regardless and
then run validateUser() on UserBean to check that it's a fully-baked-
bean.
Am I way off?
Cheers
Matthew


--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups 
"CFCDev" group.
To post to this group, send email to [email protected]
To unsubscribe from this group, send email to [EMAIL PROTECTED]
For more options, visit this group at 
http://groups.google.com/group/cfcdev?hl=en
-~----------~----~----~----~------~----~------~--~---

Reply via email to