https://trac.cakephp.org/milestone/2.0.0.x

"Change Models to return object instances instead of arrays"

On May 10, 2:34 pm, chrislewis <[EMAIL PROTECTED]> wrote:
> A seemingly common misconception regarding MVC is that models just
> hold data. This is incorrect. To use a buzzword, models represent
> 'business models' - conceptual entities that are part of a specific
> problem domain. So if your business/problem is a store of sorts, some
> business models might be the  shopping cart, cart items, shopper,
> order, etc. Business models don't just hold data - they should
> represent the concept as a whole, and group functionality with data -
> this is central to object oriented design. A cart then may supply
> certain obvious data members that map directly to database fields,
> such as the cart items, total quantity, etc. There may also be
> functionality that make sense for the cart to supply. An example may
> be an empty() method that purges all the items from the cart, or
> tally() which might give a sum of the price of all contained items.
> In my opinion, the cake's perspective of 'models' is its biggest
> weakness. Yes, you can add methods to models that make contextual
> sense, but it's difficult to achive any useful form of encapsulation
> because cake's models don't really encapsulate anything! Cake models
> represent themselves and simplistic arrays of scalar data ($this->data), and 
> as such it requries that you know the structure, field
>
> names and all, of any piece of data you want, whereever/whenever you
> want it.
> This is not at all object oriented. An object oriented 'model'
> declares a contract - an interface - to anyone that wishes to use it.
> This interface is simply its type, methods (method signatures), and
> any public properties. The world should _never_ know/care how the
> model handles its internal composition - that's the model's business.
> Instead it should hide all this nonsense and simply state - if you
> want my name, ask me - model->getName(). If you want my full name, ask
> me - model->getFullName().
> You shouldn't know/care whether or not name is a database field; if
> whole name is a field or a dynamic concatenation of other fields (like
> firstName and lastName). This is why we have encapsulation.
> Controllers on the other hand should almost exclusively interpret/
> execute commands on models based on user input from the views(s).
> Cake's perspective of controllers seems pretty sane IMO.
>
> I know the pain you're experiencing with the controller/model method
> issue. Cake does not really impose good design for larger apps. I'd
> wager the opposite in fact, and I credit most of this to it's
> perspective on models. It can be corrected I think - and cake does
> succeed in providing a pleasant, structured framework for web apps.
> This is why Ive started a cakeforge project to help fix this model
> problem in an unintrisive manner. If anyone is interested, check out
> Object Model:http://cakeforge.org/projects/object-model/. There's a
> small amount of very early code up at the moment, but i just started
> and am developing in the context of a cake app Im working on. Here's a
> controller and view snippet that show the difference when using object
> model:
>
>         //controller home() action
>         function home() {
>                 //Notice the method call; ofindAll() instead of findAll()
>                 $this->set('posts', $this->Post->ofindAll());
>         }
>
>         //View code that enumerates $posts. Notice that we are not
> interacting with post object data using cake model names
>         //as hash keys. $posts contains Post objects - NOT cake data arrays.
> So instead of using typical cake-style access:
>         //$posts[$i]['Post']['title'];
>         //we can access it as an object like so:
>         //$posts[$i]->title;
>
>         <div id="news-summary-content">
>                 <?php
>                 for($i = 0; $i < count($posts); $i++) {
>                         e("
>                                 <div class='summary-item'>
>                                         <div 
> class='title'>{$posts[$i]->title}</div>
>                                         <div 
> class='date'>".$sjcc->summaryDate($posts[$i]->created)."</
> div>
>                                         <div 
> class='summary'>{$posts[$i]->body}</div>
>                                 </div>
>                         ");
>                         if($i < count($posts) - 1) {
>                                 e('<div class="news-horiz-line"></div>');
>                         }
>                 }
>                 ?>
>         </div>


--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups "Cake 
PHP" 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/cake-php?hl=en
-~----------~----~----~----~------~----~------~--~---

Reply via email to