tags:

views:

203

answers:

4

Long time lurker, first time poster...

I'm now at the point where I'd almost call myself a professional grade PHP programmer and have a lot of code I re-use in various projects. Also, a lot of Open Source packages I've worked with use the MVC model and as a result I've done a lot of research recently into how it all works so I can better edit them as required.

At this point, I'm considering taking a bare-bones MVC framework (from a tutorial) and extending it as required for my forthcoming programming jobs.

My question is whether the MVC model with pretty much all application logic separated from the presentation layer is considered best practice over a well structured OOP website with coding on the page as necessary e.g setting function variables.

Or will I run into issues when I want coding flexibility e.g.

  • using something like PHPthumb for a gallery where I want different output sizes on different pages and currently set parameters in the head of the page
  • a contact form with x fields and a feedback form with y fields - will this require 2 differrent models rather than a generic form class again with some parameters set in the head of the page
  • some pages requiring ob_start() and ob_flush() but not others?

Please don't tell me not to build my own framework - I'd rather know how each little bit works than use a slab of code I know nothing about - I'm really interested in the opinion of people who have gone this route and build sites every day. What are the real pros and cons of this over plain (but well structured) OOP and bunch of pages to a site as opposed to 1 index.php page and separate files.

Cheers, Niggles

+8  A: 

I know you say you don't want this advice, but don't write your own. The first thing I've done at every single job I've ever worked at is picked up some existing code or framework, often commercial but highly modified, and begin maintaining it. You'll seldom get the option to write your own, and doing so is a bad idea. It's hard, expensive, and somebody else has already written a better MVC PHP framework than you're likely to write.

Here, choose one of these: http://www.phpframeworks.com/

It doesn't matter which one - they're all maintained by a dozen people at least as smart as you who've been writing MVC frameworks a lot longer, and have spent months or years refining their frameworks and listening to user input.

All that said, if you want to write your own on your own time, as a hobby, so you're not wasting your boss's money, then by all means. There's a huge variety of interpretations of MVC. Some frameworks view views as basically templates. I personally think you can throw as much raw PHP in there as you'd like, so long as it's purpose is display, and you do the usual smart things like distilling out shared code into functions. Some frameworks have virtually no business logic in the models (where it belongs IMO) but have very heavy controllers. The best thing you can do is try other frameworks and see how they work, and which you like best, and decide what you'd like to see changed. Then, set out to change it in your own.

You say you're almost ready to consider yourself a professional? The hardest lesson I had to learn was that professionals don't write their own low-level libraries. They don't reinvent the wheel on the company buck. They use off-the-shelf components and get the job done today, rather than a month from now. You don't want to use a slab of unfamiliar code? That's the biggest part of your life to come as a programmer - get used to it.

meagar
+1 the last paragraph is simply beautiful it made my day!
Lukman
Thanks, I wasn't lying. I love writing low level code. *Love* it. But doing so is absolutely wasting company time, and it'll get you fired.
meagar
niggles
@meagar: Regarding your last paragraph, if everyone though the same way you do there wouldn't be any **professional PHP frameworks**, and there are plenty of them! I'm not saying he should roll his own on his company hours but total discouragement is not advisable in my opinion.
Alix Axel
+2  A: 

Its horses for courses. Writing your own framework is great for your own edification and for truly understanding the language.

Personally I find its as time consuming using a third party framework as it is to write your own. Yet I have total control of my own code. not something you can claim with third party MVC (or any other framework).

I also think many MVC frameworks are very resource intensive. For high volume sites you need to be prepared to throw hardware at them to get them to run nicely. For low volume sites (the majority) the rapid development of a third party MVC framework is a huge bonus.

So in my opinion if you have the time, roll your own and be proud of it. Just make sure you learn from others especially where security is concerned.

DC

DeveloperChris
A: 

Any MVC -- homegrown or not -- will allow you flexibility and re-usable code.

ob_start() / ob_* calls are no problem, they go in your model and called from your template, e.g.:

Hello <?php echo $this->getFormattedName(); ?>

where your model is

function getFormattedName() {
    ob_start();
    echo '<a href="/profile/' . $this->getName() . '">' . $this->getName() . '</a>';
    $return = ob_end_clean();
    return $return;
}

For your form scenario, you would probably want an abstract form class that defines how a field is made and its validation, then each specific form would extend your abstract.

You may want to consider using something like Zend Framework -- while it's an MVC library in its own right, you can pull in single components super easily (for example, you can pull in Zend_Form and Zend_Mail for your contact and feedback forms & validation and use your own models for everything else). This would also give you the extra benefit of having a fallback when/if the time comes when your homebrew MVC framework starts to outgrow its original design. Or, at the very least, speed up your development time so that you're not held up for days because you suddenly realize you need an e-mail model.

gabrielk
This use of output buffering seems... excessive. What's wrong with string concatination?
meagar
Nothing's wrong with concatenation. Just an example, since the OP specifically asked about using `ob_start()` etc. :)
gabrielk
This is exactly wrong. Your models should never output HTML, that's what the view is for. The *entire point* of MVC is decoupling your business objects from your display code. This is also exactly how *not* to use output buffering. Shoe-horning it in because it was referenced in the question doesn't make it any more valid.
meagar
Touché. You are technically more correct than I. I would argue that my answer wasn't so much wrong as improper; I think it did validly answer the question. I'm not trying to teach the OP how to code. The line gets blurred sometimes, for example in Zend_Form the Zend_Form_Element class builds the structure of the form. While it doesn't straight up echo HTML, it gets pretty close.
gabrielk
A: 

It all depends on what are you project requirements are and how you design your application objects. MVC do not force you to use an specific class or view design, It will only provide you with an architecture that will help you isolate the business logic from the presentation and the data layer making you application more scalable and easy to test.

In MVC you are not tied to one view per controller you can use as many views as you want per controller since every exposed method can call a view itself and control how it looks and behave based on the business logic you define. That said you can have 2 methods to return a full size image and a thumbnail without having to create two pages. You can set everything on the view from the controller, header meta-data, scripts, links, theme, content, etc...

In regard to the models, it again depends on your project requirements but definitely, in any case, if you have several pages with different purposes and they require to modify different data sources there should be a model for each one of them and what you can do after is to create a class that encapsulates the form functionality by calling the model for getting the fields to create form, get and save the data. This is just an idea you can do it in a lot of different ways, that is the beauty of OOP.

In the end it is not a matter of comparing a well structured OOP site against an OOP MVC site, It is more an analysis of the time and effort you spend working on building a site architecture that can succeed in isolating concerns at the same time it still readable and scalable while it meets your project requirements.

If you want to get more ideas about design patterns you can use google MVP design pattern and/or MVVM design pattern.

denver_citizen