What's Under the Hood?
-
Robust Dispatcher
Enforce a logical separation between GET and POST by splitting actions based on the method by which they were called.
function GET_edit() { $this->render('edit_form.php'); } function POST_edit() { $this->flash('All done!'); }
-
Compatible with PHP4 and PHP5
While we don't necessary like PHP4 as much as PHP5, we realize that many hosting providers still use it, and we'd hate to leave them out of the fun. So despite PHP4's EOL, we will still support it until it makes sense to do otherwise.
If you'd like a second opinion, check the stats.
-
Regexp-Based URL Routing
Route URL patterns to specific page controllers, or specific actions within page controllers.
$URLS = array( '/user/(.*)' => 'User', '/login/' => array('User','login') );
-
CRUD Scaffolding
Many framework scaffold facilities are only truly useful for the development stages of a data entity, and lack the flexibility to be of use in the final product. Not so with Pronto. With its avid use of process hooks, you can override things whenever you need to.
-
Generator for Data Entities
Many simple entities essentially require the exact same functions around them (typically the CRUD ones). Using Pronto's CRUD generator, you can now avoid one more mundane aspect of introducing a new data entity to your application.
$ php pronto/bin/generator/generate.php book books Entity: book DB Table: books Examining DB table for data introspection... New Model: models/book.php New Page Controller: pages/book.php New Template: templates/book/list.php New Template: templates/book/create.php
-
SQL-centric Models (not ORM)
We don't want to start a big religious debate on the merits of ORM, and we acknowledge that it can be a very powerful offering. But at this time, the Pronto developers find that using an English-like query language such as SQL isn't so tedious either.
If you write queries well and with reusability in mind, then SQL is an efficient method of data access. Combined with a number of convenience functions for simple (eg, PK-based) queries, Pronto's data models are efficient and easy to use.
-
Rich Plugins at Template and Controller Levels
Pronto comes with a number of plugins to assist you in eliminating redundant code, and it's trivially easy to make your own.
Need a way to generate rich forms? We got it.
Need a powerful table/grid for enumerating data? Done.
Want to process and resize uploaded images? Sure.
Need to paginate some sort of data entity? Why not?
In our early stages of development, we certainly don't have the foresight to anticipate all your plugin needs, but we expect the collection will grow as the community does.
-
Execution Profiles
Pronto code can be executed in different environments, called Execution Profiles in our parlance. We provide two by default, one for standard web-based stuff and one for commandline stuff, but you can add as many as you see fit. Maybe a special one for developers? Maybe different parts of the app require different profiles? Up to you.
-
Brainless AJAX via Plugins and jQuery
Thanks to all the libraries out there, AJAX is getting easier and more accessible for web developers to embrace. Pronto keeps the ball rolling by making heavy use of jQuery for its AJAX and most things JavaScript.
Now, we love jQuery, but that doesn't mean you have to. If you'd like to use another JavaScript library, you're free to. But the core elements of Pronto expect jQuery to be available, so pick a library that can co-exist with it, if you do choose to stray.
Wanna see how easy AJAX is? This easy.
<!-- our normal, boring Web 1.0 form --> <form id="myform"> ... </form> <!-- now let's spruce it up! --> <?php $html->js_run("$('#myform').ajaxForm();") ?>
Yes, we do this with other things too, like anchors and grid elements.
-
Efficient and Automatic Data Caching
Pronto supports a number of caching implementations, including APC, eAccelerator, Memcached, XCache, and plain old SHM.
Once enabled, Pronto can automatically and transparently cache any data records that are retrieved through their respective data models. You're also free to use the cache facility to manually cache any other items you wish.
We've achieved some impressive results with just our automatic caching. In one of our more heavy apps (190 queries on the home page), we went from 8.92 requests/second to 54.23 requests/second!
-
UTF8 and I18N
Face it, you just can't ignore internationalization issues anymore. Starting an app with I18N in mind is much easier than trying to convert one to be I18N-friendly after it's already well into development.
Pronto encourages you to start your day off right by feeding all strings through our custom I18N layer. Like the rest of Pronto, it's easy to use and it saves your butt down the road when your boss asks, "Can we add French, German and Spanish to the app?"
Not only that, but we even made a hackish little script to feed your messages into Google Translate for rough translations. Works great for the development phase of a project, when you're not yet ready to hire/solicit translators.
-
Flexible Access Control
Pronto supports two access models: roles and discrete. The former is simpler, while latter allows for more fine-grained control over who can access what. Best of all worlds.
Welcome
Welcome to the site of yet another web framework. While we won't pretend to be a unique or ground-shaking addition to the world of web development, we do have something to contribute:
A robust, feature-rich, flexible framework that abstracts the mundane and gets out of the way, letting you (the brains) get the job done.
Ask yourself:
- On your umpteenth web project, do you really want to be micro-managing your authentication routines, your SQL injection protection, or your form widgets?
- Are you sick of writing
<table><tr><td>
and<form>
for every page? - Does your current framework-of-choice limit you too much? Do you feel like you're being guided/forced in a direction that doesn't align with the design or goals of your project?
Yea, us too. Still interested?