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 -~----------~----~----~----~------~----~------~--~---
