lean / lean
Lean PHP, a micro Framework PHP really simple.
Requires
- php: >=5.3.0
README
Lean PHP Framework is a micro framework PHP (~40KB). Modern frameworks are powerfull but so much complicated, the mostly of resources you never gonna use, some functionality sounds good but if you don't really need it's a only waste of time. With Lean you can construct fast e lightweight softwares, with follows resources:
- Structure MVC, REST or both;
- Requests;
- Routes (automatic or custom);
- Namespaces;
- Class autoload;
- PHP code hidden;
- Basic template engine;
- Date and Time manipulation;
- Easy configuration;
Requirement
PHP 5.3+
Basic structure
-- rootdir -- app -- main (module) -- controllers -- HomeController.php -- models -- views -- home -- index.phtml -- Bootstrap.php -- Routes.php -- public_html -- css -- js -- img -- index.php -- .htaccess -- vendor -- composer -- lean -- autoload.php
Create into your rootdir teh follows directories:
-
app
: You will write all your application php into app directory (controllers, models, views and configs), this way your application not stay exposed. -
public_html
: Into public_html directory we have only index.php as file .php. You can put all yours public files, like css, javascripts, images, fonts, etc. -
vendor
: Composer will create it and copy our lib to lean directory.
Getting started
Instalation
Install via Composer
composer require lean/lean
Easy configuration
create file index.php
into public_html directory
Into index.php we have only one line, all of rest application php keep safe into app directory.
<?php require_once '../app/Bootstrap.php'; ?>
create file .htaccess
into public_html directory to custom urls works
Don't forget enable mod_rewrite on apache
RewriteEngine On RewriteCond %{REQUEST_FILENAME} -s [OR] RewriteCond %{REQUEST_FILENAME} -l [OR] RewriteCond %{REQUEST_FILENAME} -d RewriteRule ^.*$ - [NC,L] RewriteRule ^.*$ index.php [NC,L]
Create file Bootstrap.php
into app directory
<?php require_once '../vendor/autoload.php'; /** * errors - use E_ALL only in development */ error_reporting(E_ALL); /** * include path */ set_include_path( PATH_SEPARATOR . '..' . DIRECTORY_SEPARATOR . PATH_SEPARATOR . get_include_path()); /** * locale e zone * Lean has some great Date and Hour classes, so keep it configured to use them */ date_default_timezone_set('America/Sao_Paulo'); setlocale(LC_ALL, 'pt_BR', 'pt_BR.iso-8859-1', 'pt_BR.utf-8', 'portuguese'); /** * init lean framework */ Lean\Launch::instance()->run();
Well done! It's all configuration necessary to run like a pro.
Hello world
Regardless of whether their application is rest or not, I think is a good ideia keep your access logic always into controllers, into Routes.php you keep only routes ;)
<?php namespace app\main\controllers; class IndexController extends \Lean\App { public function index() { echo 'Hello World!'; } }
It's work, access in your browser http://localhost/rootdir/public_html
Remember, in your site type only www.your-domain.com, everything else php is hidden.
Automatic route controller
http://localhost/rootdir/public_html/`$1`/`$2`/`$3`
$1
: Module - if not informed, use main module (main directory)$2
: Controller - if not informed, instance indexController class$3
: Method - if not informed, call index method
<?php namespace app\main\controllers; class ProductController extends \Lean\App { public function index() { echo 'About Product' } public function festures_list() { echo 'Product list'; } public function buy_action() { echo 'Processing your order...' } }
To ProductController example, the result is:
uri
/main/product
result is About Product!
uri/main/product/index
result is About Product!
uri/main/product/features-list
result is Product list!
uri/main/product/features_list
result is Product list!
uri/main/product/buy
result is Processing your order...
uri/main/product/buy-action
result is Processing your order...
uri/main/product/buy_action
result is Processing your order...
To IndexController example, the result is:
uri
/
result is Hello World!
uri/main
result is Hello World!
uri/main/index
result is Hello World!
uri/main/index/index
result is Hello World!
Custom routes
Config routes file
In app/Bootstrap.php
add file routes before launch Lean
... /** * routes file */ Lean\Route::set_routes_path('app/Routes.php'); /** * init lean framework */ Lean\Launch::instance()->run();
Basic route
create file Routes.php
into app directory
<?php use Lean\Route; Route::set('foo/bar', function() { echo 'Hi'; });
Url: http://your-site.com/foo/bar // result is 'Hi'
Route to method in controller
<?php use Lean\Route; Route::set('product', array( 'controller' => 'product', )); Route::set('resources', array( 'controller' => 'product', 'method' => 'resources_list' )); Route::set('learn-more-about-product', array( 'controller' => 'product', 'method' => 'resources_list' ));
Url
http://your-site.com/product
result is About Product
Urlhttp://your-site.com/resources
result is Product List
Urlhttp://your-site.com/learn-more-about-product
result is Product List
Route to different module
<?php use Lean\Route; Route::set('checkout', array( 'module' => 'api' 'controller' => 'payment', ));
Simple route alias
Route::alias('old-page-about-product', 'product');
Multiple route alias
Route::alias(array('old-page-about-product', 'foo', 'bar'), 'product');
Request object
Recovery request data in controllers
<?php namespace app\main\controllers; class ProductController extends \Lean\App { public function index() { ... /** * get all methods - same of variable $_REQUEST */ echo $this->request->name; echo $this->request->last_name; /** * get only method post - same of variable $_POST */ echo $this->request()->post()->name; /** * get only method post - same of variable $_POST */ echo $this->request()->get()->name; /** * get only method file - same of variable $_FILE */ $request = $this->request()->file()->name; /** * you can too instance request object */ $request = new \Lean\Http\Request(); $request->name ... } }
Using Views
In views directory, you must create product
and layout
subdirectories with .phtml
files.
... -- controllers -- ProductController.php -- models -- views -- product -- index.phtml -- edit.phtml -- layout -- header.phtml -- footer.phtml -- template.html ...
Create template.phtml
in layout directory, you can include header and footer parts here
<html> <head> <title>My new app</title> </head> <body> <!-- include header.phtml from layout directory --> <? $this->app->view->render('layout.header') ?> <div id="container"> <!-- include page setted in content variable via ProductController --> <? $this->app->view->make('content') ?> </div> <!-- include footer.phtml from layout directory <? $this->app->view->render('layout.footer') ?> </body> </html>
Rendering yours views
<?php namespace app\main\controllers; class ProductController extends \Lean\App { public function index() { /** * set which page will rendered by "content" variable in "template.html" * by default, if informed only "index" will rendered .phtml file into product directory */ $this->view()->set('content', 'index'); /* * render template */ $this->view()->render('layout.template'); } public function edit() { /** * this example will rendered "/product/edit.phtml" file */ $this->view()->set('content', 'edit'); /* * render template */ $this->view()->render('layout.template'); } }
Date
Available date formats
Date::FORMAT_DATE = 'YYYY-mm-dd'; Date::FORMAT_DATE_TIME = 'YYYY-mm-dd HH:MM:SS'; Date::FORMAT_DATE_USER = 'dd/mm/YYYY'; Date::FORMAT_DATE_TIME_USER = 'dd/mm/YYYY HH:MM:SS'; Date::FORMAT_DATE_LONG = 'Sexta-feira, 30 de janeiro de 2015'; Date::FORMAT_DAY = 'dd'; Date::FORMAT_MONTH = 'mm'; Date::FORMAT_YEAR = 'YY'; Date::FORMAT_TIME = 'HH:MM:SS'; Date::FORMAT_TIME_SHORT = 'HH:MM'; Date::FORMAT_DATE_TIME_HASH = 'YYYYmmdd_HHMMSS';
YYYY
: Year 4 digitsmm
: Month 2 digitsdd
: Day 2 digitsHH
: Hours 2 digitsMM
: Minutes 2 digitsSS
: Seconds 2 digits
Now
Print today date
use Lean\Format\Date as Date; echo Date::now() // "YYYY-mm-dd HH:MM:SS" echo Date::now(Date::FORMAT_DATE_USER) // "dd/mm/YYYY" echo Date::now(Date::FORMAT_TIME) // "HH:MM:SS"
Format date
Format using constants date
echo Date:format('2015-01-30 10:59:59', Date::FORMAT_DATE) // 2015-01-30 echo Date:format('2015-01-30 10:59:59', Date::FORMAT_DATE_TIME) // 2015-01-30 10:59:59 (nothing change) echo Date:format('2015-01-30 10:59:59', Date::FORMAT_DATE_USER) // 30/01/2015 echo Date:format('2015-01-30 10:59:59', Date::FORMAT_DATE_TIME_USER) // 30/01/2015 10:59:59 echo Date:format('2015-01-30 10:59:59', Date::FORMAT_TIME_SHORT) // 10:59
Format to users
echo Date:format_to_human('2015-01-30 10:59:59') // 30/01/30 10:59:59 echo Date:format_to_human('2015-01-30') // 30/01/30 echo Date:format_to_human('30/01/2015 10:59:59') // 30/01/30 10:59:59 (nothing change) echo Date:format_to_human('30/01/2015') // 30/01/30 (nothing change) echo Date:format_to_human('30/01/2015 10:59:59', Date::FORMAT_DATE_USER) // 30/01/30 echo Date:format_to_human('2015-01-30 10:59:59', Date::FORMAT_DATE_USER) // 30/01/30
Format to datebase
echo Date:format_to_machine('2015-01-30 10:59:59') // 2015-01-30 10:59:59 (nothing change) echo Date:format_to_machine('2015-01-30') // 2015-01-30 (nothing change) echo Date:format_to_machine('30/01/2015 10:59:59') // 2015-01-30 10:59:59 echo Date:format_to_machine('30/01/2015') // 2015-01-30 echo Date:format_to_machine('30/01/2015 10:59:59', Date::FORMAT_DATE) // 2015-01-30 echo Date:format_to_machine('2015-01-30 10:59:59', Date::FORMAT_DATE) // 2015-01-30
Validating date
Validate date format
echo Date::validate('01/01/2015'); // true echo Date::validate('01/01/2015 12:10:00'); // true echo Date::validate('2015-01-01'); // true echo Date::validate('2015-01-01 12:10:00'); // true echo Date::validate('201-501-01'); // false echo Date::validate('foo'); // false
Validate especific date user format (00/00/0000 00:00:00)
echo Date::validate_format_human('01/01/2015'); // true echo Date::validate_format_human('01/01/2015 12:10:00'); // true echo Date::validate_format_human('2015-01-01'); // false echo Date::validate_format_human('2015-01-01 12:10:00'); // false echo Date::validate_format_human('201-501-01'); // false echo Date::validate_format_human('foo'); // false
Validate especific date datebase format (0000-00-00 00:00:00)
echo Date::validate_format_machine('01/01/2015'); // false echo Date::validate_format_machine('01/01/2015 12:10:00'); // false echo Date::validate_format_machine('2015-01-01'); // true echo Date::validate_format_machine('2015-01-01 12:10:00'); // true echo Date::validate_format_machine('201-501-01'); // false echo Date::validate_format_machine('foo'); // false
Time
Available time formats
Time::FORMAT_HOUR_MINUTES = 'HH:MM'; Time::FORMAT_HOUR_MINUTES_SECONDS = 'HH:MM:SS'; Time::FORMAT_HOUR = 'HH'; Time::FORMAT_MINUTES = 'MM'; Time::FORMAT_SECONDS = 'SS';
HH
: Hours 2 digitsMM
: Minutes 2 digitsSS
: Seconds 2 digits
Now
Print time at moment
use Lean\Format\Time as Time; echo Time::now() // "HH:MM:SS" echo Time::now(Time::FORMAT_HOUR_MINUTES) // "HH:MM" echo Time::now(Time::FORMAT_HOUR) // "HH"
Format time
Format time default
echo Time::format('12:10') // 12:10:00 echo Time::format('122:10') // 122:10:00 echo Time::format('12') // 12:00:00 echo Time::format('12:60') // 12:59:00 echo Time::format('12:99:99') // 12:59:59 echo Time::format('1:1') // 01:01:00 echo Time::format('5:30') // 05:30:00
Format using constants time
echo Time::format('12:10', Time::FORMAT_HOUR_MINUTES_SECONDS) // 12:10:00 echo Time::format('12:10:5', Time::FORMAT_HOUR_MINUTES_SECONDS) // 12:10:05 echo Time::format('12', Time::FORMAT_HOUR_MINUTES_SECONDS) // 12:00:00 echo Time::format('12:10:15', Time::FORMAT_HOUR_MINUTES) // 12:10 echo Time::format('12', Time::FORMAT_HOUR_MINUTES) // 12:00 echo Time::format('2:10:15', Time::FORMAT_HOUR_MINUTES) // 02:10
Converter time
Convert time to seconds
echo Time::time_to_seconds('01:30:00') // 5400 echo Time::time_to_seconds('01:15:00') // 4500 echo Time::time_to_seconds('00:01:15') // 75 echo Time::time_to_seconds('48:00:00') // 172800
Convert seconds to time
echo Time::seconds_to_time('5400') // 01:30:00 echo Time::seconds_to_time('4500') // 01:15:00 echo Time::seconds_to_time('75') // 00:01:15 echo Time::seconds_to_time('172800') // 48:00:00
Calculate time
Sum time
echo Time::sum('01:15:00', '02:30:05'); // 03:45:05 echo Time::sum('12:30:00', '07:00:00'); // 19:30:00 echo Time::sum('12:30:00', '12:00:00'); // 00:30:00
Subtract time
echo Time::subtract('02:30:05', '01:15:00'); // 01:15:05 echo Time::subtract('12:30:00', '07:00:00'); // 05:30:00 echo Time::subtract('12:30:00', '13:00:00'); // 23:30:00
Author
Created by Dyorg Almeida, a full-stack web developer and PHP expert (Zend Certified Engineer). Today Dyorg is founder and CTO at Rabbiit, a brazilian startup that develops a simple time tracking software.
http://rabbiit.com - Sign up for free (available only in portuguese for now)
License
The Lean PHP framework is released under MIT public license.
http://www.opensource.org/licenses/MIT
Copyright (c) 2015