Flubber #
Flubber 2.0 is built from ground up, while keeping the same principles of 1.0
Create project #
Download Flubber from https://github.com/madhugb/flubber/archive/master.zip
cd ~/
wget https://github.com/madhugb/flubber/archive/master.zip
After extracting the zip file, move Flubber folder to
cd ~/flubber
mv Flubber ~/.Flubber
To start working you need to run this
php ~/.Flubber/setup.php --path=/var/www/example --url=example.com
It creates a folder structure for you to in /var/www/example.
Note : This needs you to have full write access to the path of the project and Flubber codebase
Folder structure #
your/application/path/
|
|----config/
| |
| |----locale/
| | |
| | |----en.ini
| | |
| | |----<some_lang>.ini
| |
| |----config.php
| |
| |----functions.php
| |
| |----urls.php
|
|----handlers/
| |
| |---- <HandlerName>.php
|
|
|----public/
| |
| |---- js/, css/, images/
| |
| |---- index.php
|
|----views/
|
|----templates/
|
|---- <base>.html
|
|---- <template>.html
Configurations #
To configure Flubber application you need to provide the following
SITEURL - url without protocol (i.e http:// , https:// )
Example:
"demo.example.com"
"example.com"
"test.domain.example.com"
HAS_SSL - false | true
SITEADMIN - “[email protected]”
TIMEZONE - “Asia/Kolkata”
SESSION_NAME - “__ses”
SESSION_EXPIRY - 3600 // in seconds
SESSION_IDLE - 3600 // in seconds
SESSION_AUTO_RENEW - true | false
LOGIN_URI - path to login url if exists
Example:
"/login"
"/app/login"
"/"
TOKEN_SECRET - A long random string for csrf token secret
make sure to put a long random string.
TOKEN_EXPIRY - 300 // in seconds
DBTYPE - “mysql” // for now only mysql is supported
DBHOST - “localhost”
DBUSER - “dbusername”
DBPASS - “dbpassword”
DBNAME - “databasename”
Nginx #
server {
listen 80;
server_name flubber.co;
root /var/www/example/public/;
index index.php index.html;
location / {
try_files $uri $uri/ /index.php?$args;
}
location ~ \.php$ {
try_files $uri =404;
include /etc/nginx/fastcgi_params;
fastcgi_pass unix:/var/run/php5-fpm.sock;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_index index.php;
proxy_buffer_size 128k;
proxy_buffers 4 256k;
proxy_busy_buffers_size 256k;
}
}
Urls #
/config/urls.php contains all url patterns for the application
it must contain a variable $urls as an array.
each index of url
$urls = array(
array(
"<regex_pattern>", "HandlerName"
),
...
);
For example:
array(
"/^login$/", "LoginHandler"
)
which translates to if the url is http://example.com/login.
the request is passed to LoginHandler.
array(
"/^user\/(?P<user_id>[0-9]+)$", "UserHandler"
)
which translates to if the url is http://example.com/user/123
the request is passed to UserHandler with an argument $user_id = "123"
Handlers #
You will be spending more time here; as your application logic is written here.
take a look at a sample UserHandler handler
handlers/UserHandler.php
<?php
use Flubber\BaseHandler as BaseHandler;
class UserHandler extends BaseHandler {
function __construct() {
parent::__construct(array(
"auth" => array( "get", "post"),
"csrf_check" => false
)
);
}
function get() {
$this->set_status(200);
// Composre your response here
$response = array( "message" => "hello");
// Show `home` template
$this->show_page("home", $response);
}
function post() {
$data = $this->request->data["post"];
// send the same data back
$this->send_json($data);
}
}
Let us see how this handler work
Class Structure #
Every handler must be extended to BaseHandler
Apart from extending we must call the parent constructor in the constructor of
the handler.
function __construct() {
$config = array();
parent::__construct($config);
}
There are some things you can configure per handler those should be passed to parent constructor in an array.
Configurations are as below
-
auth- this sets the authentication check for “get”, “post”, “put” requests$config["auth"] = array("post","put");which checks for authentication for post and put requests. If not authenticated it will redirect to login page for any other type of requests authentication will not be ckecked.
-
csrf_check- this boolean key enables or disables the checks for csrf tokenif the value is true then it checks csrf token in the following places
a.
X-Csrf-Tokenheaderb.
_csrfin post or put data
Accessing request data #
To handle different request methods you need to have function by
the name of request methods. Allowed methods are GET, POST,
PUT, DELETE,OPTIONS.
To handle GET request you need to have function get(){ } in the
handler (note that the function names are in lowercase).
In every handler you can access $this->request object which contains
all request data.
-
$this->request->get("key")- value ofGETargument key. -
$this->request->post("key")- value ofPOSTdata key.
Or you can access $this->request->data directly which has
array(
"get" => array(
"get_data_key_1" => "get_data_value_1"
...
),
"post" => array(
"post_data_key_1" => "post_data_value_1"
...
),
"put" => array(),
"files" => array()
)
There is a special params key in requests.
This can be accessed from $this->request->params will get
all the values from url path based on named regex match.
For example “/^user\/(?P
and $this->request->params["user_id"] contains value 123
also you can access this from function argument like below
function get($user_id=false) {
// here $user_id will contain 123
}
Response Handling #
You can respond by showing a template file or sending a json response.
to show a template page
$this->show_page("template_name", $data);
where $data is array of data to be used in template
to send a json response
$this->send_json($data);
where $data is array which can be json encoded.
find more detail about Templates below
Headers #
To access request headers
$this->request->headers;
To respond with headers the below functions will help
$this->set_status(200); // sets status to "200 OK"
$this->headers["X-My-Custom-Header"] = "Some Value"; // will sets the header
Session Handling #
Flubber Session is identified based on Cookie. Cookie name can be
changed from config SESSION_NAME
To start a session
$this->session->start();
One must set a session identifier uid after starting session
$this->session->set("uid", "<unique id for the user>");
To destroy a session
$this->session->destroy();
Templates #
Flubber uses Twig templating library for rendring html templates
although this is bigger (~500Kb) than actual framework size (~200Kb). It made
lot of sense to just include this instead of writing one more. However someday
we will have a lighter solution.
Flubber uses a wrapper method to Twig the APIs are listed below
As we have shown before to show a template page you can call
$this->show_page("<template file name>", $response);
Read Twig documentation for more details
Localization #
language files are located in config/locale/ directory of your app
each language should have a dedicated ini file, which should contain all the strings
for example :
;en.ini
hello="Hello World!"
flubber="Flubber"
flubber_url="http://Flubber.co"
To set a locale for your handler in constructor
function __construct() {
...
// Get locale from session / cookie / db or hard code
// $mylocale = "en";
$this->locale = $mylocale;
}