Organizing an application using a micro-framework like Bullet can sometimes be a challenge because there is no pre-determined or enforced structure like there is with larger frameworks. This gives you a lot more freedom and control, but it also comes with questions about where to put certain things like configuration, templates, models, etc. and the best way to organize larger projects to maintain a good separation of concerns.
This page is offered as the recommended way to setup and organize an application built on Bullet so everyone on your team stays sane - even if that just means you.
Typically, it is desireable to setup your project with a few different top-level directories that contain your different main content types, and a single web-accessible folder that contains the main index.php and all the frontend files.
The ideal project setup is provided in the bullet example skeleton app and looks like this:
app
- All route files and anything related to this application
lang
- Language files, if using I18Nroutes
- Route filessrc
- For custom PHP classes. Anything in here is PSR-0 Autoloaded.templates
- Template filestest
- Tests for this application (any type)vendor
- Composer-created folder with Bullet and dependenciesweb
- All web-accessible files
assets
- All your frontend asset files like images, CSS, and javascript
images
- Image filesscripts
- JavaScript filesstyles
- CSS/StylesheetsThe easiest way to organize your project is to separate all the router handlers
for different base routes like posts
, events
, and comments
into different
same-named files, like posts.php
, events.php
, and comments.php
. This is
very similar to the way you would separate and organize your code in a larger
MVC framework with controller classes. If you are following the folder structure
above, these would be placed in app/routes
. You would then require
these
files in your main web/index.php
file that serves your Bullet application.
Your main index file would then look something like this:
<?php define('BULLET_ROOT', dirname(__DIR__)); define('BULLET_APP_ROOT', BULLET_ROOT . '/app/'); define('BULLET_SRC_ROOT', BULLET_APP_ROOT . '/src/'); // Composer Autoloader $loader = require BULLET_ROOT . '/vendor/autoload.php'; // Bullet App $app = new Bullet\App(require BULLET_APP_ROOT . 'config.php'); $request = new Bullet\Request(); // Common include require BULLET_APP_ROOT . '/common.php'; // Require all paths/routes $routesDir = BULLET_APP_ROOT . '/routes/'; require $routesDir . 'index.php'; require $routesDir . 'events.php'; require $routesDir . 'messages.php'; require $routesDir . 'users.php'; // Response echo $app->run($request);
So just like larger frameworks that have full MVC structures and controllers, a good separation of concerns can be maintained and all the routes and corresponding logic are broken up into more digestible independent files.