Aura for PHP at Fossmeet 2014

29
FOSSMeet 2014 @ NIT Calicut Aura for PHP Hari KT @harikt http://harikt.com

description

Introduce aura project a collection of standalone library package for PHP

Transcript of Aura for PHP at Fossmeet 2014

Page 1: Aura for PHP at Fossmeet 2014

FOSSMeet 2014 @ NIT Calicut

Aura for PHP

Hari KT@harikt

http://harikt.com

Page 2: Aura for PHP at Fossmeet 2014

FOSSMeet 2014 @ NIT Calicut

About me

● Freelance LAMP developer

● Open-source lover and contributor

● Writes for sitepoint.com

● Technical reviewer of Packt

Page 3: Aura for PHP at Fossmeet 2014

FOSSMeet 2014 @ NIT Calicut

Aura

● 2nd major version of SolarPHP ( started in 2004 by Paul M Jones)

● Independent decoupled library packages● V1 started around late 2010 ( PSR-0 standard )● V2 started around late 2013 ( PSR-4 standard )

Page 4: Aura for PHP at Fossmeet 2014

FOSSMeet 2014 @ NIT Calicut

PSR-0 vs PSR-4

namespace Aura\Router;

class RouterFactory {

}

● PSR-0 : http://www.php-fig.org/psr/psr-0/

Aura\Router\RouteFactory => /path/to/src/Aura/Router/RouteFactory.php

Zend_Mail_Message => /path/to/lib/Zend/Mail/Message.php

● PSR-4 : http://www.php-fig.org/psr/psr-4/

Aura\Router\RouteFactory => /path/to/src/RouteFactory.php

Page 5: Aura for PHP at Fossmeet 2014

FOSSMeet 2014 @ NIT Calicut

Driving Principles

● Libraries first, framework 2nd● No use of globals within packages

( $_SERVER, $_GET etc )● No dependency on any other package● Tests and Assets inside the package

Page 6: Aura for PHP at Fossmeet 2014

FOSSMeet 2014 @ NIT Calicut

Library / Package Organization

Page 7: Aura for PHP at Fossmeet 2014

FOSSMeet 2014 @ NIT Calicut

Aura.Router v2

Page 8: Aura for PHP at Fossmeet 2014

FOSSMeet 2014 @ NIT Calicut

Aura.Router

● Provides a web router implementation● Given a URL path and a copy of $_SERVER, it

will extract path-info parameters and $_SERVER values for a specific route

Page 9: Aura for PHP at Fossmeet 2014

FOSSMeet 2014 @ NIT Calicut

Instantiation

require path/to/Aura.Router/autoload.php;

use Aura\Router\RouterFactory;

$router_factory = new RouterFactory;

$router = $router_factory->newInstance();

or

use Aura\Router\Router;

use Aura\Router\RouteCollection;

use Aura\Router\RouteFactory;

$router = new Router(new RouteCollection(new RouteFactory));

Page 10: Aura for PHP at Fossmeet 2014

FOSSMeet 2014 @ NIT Calicut

Adding Route

● // add a simple unnamed route with params

$router->add(null, '/{controller}/{action}/{id}');

● // add a route with optional params

$router->add('archive', '/archive{/year,month,day}')

● // add a named route with an extended specification

$router->add('read', '/blog/read/{id}{format}')

->addTokens(array('id' => '\d+', 'format' => '(\.[^/]+)?',))

->addValues(array('controller' => 'BlogPage', 'action' => 'read', 'format' => '.html',));

● // REST resource route

$router->attachResource('blog', '/blog');

Page 11: Aura for PHP at Fossmeet 2014

FOSSMeet 2014 @ NIT Calicut

Matching A Route

// get the incoming request URL path

$path = parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH);

// get the route based on the path and server

$route = $router->match($path, $_SERVER);

Page 12: Aura for PHP at Fossmeet 2014

FOSSMeet 2014 @ NIT Calicut

Example

$path = '/blog/read/42.json';

$route = $router->match($path, $_SERVER);

var_export($route->params);

[

'controller' => 'BlogPage',

'action' => 'read',

'id' => 42,

'format' => 'json'

]

Page 13: Aura for PHP at Fossmeet 2014

FOSSMeet 2014 @ NIT Calicut

Dispatching a Routeif ($route) {

echo "No application route was found for that URL path.";

exit();

}

$class = $route->params['controller']; // BlogPage

$method = $route->params['action']; // read

// instantiate the controller class

$object = new $class();

echo $object->$method($route->params);

// $object->read($route->params);

Page 14: Aura for PHP at Fossmeet 2014

FOSSMeet 2014 @ NIT Calicut

Microframework Route

$router->add('read', '/blog/read/{id}')

->addTokens(array( 'id' => '\d+', ))

->addValues(array(

'controller' => function ($params) {

$id = (int) $params['id'];

header('Content-Type: application/json');

echo json_encode(['id' => $id]);

},

));

Page 15: Aura for PHP at Fossmeet 2014

FOSSMeet 2014 @ NIT Calicut

Microframework Dispatcher

$controller = $route->params['controller'];

echo $controller($route->params);

Page 16: Aura for PHP at Fossmeet 2014

FOSSMeet 2014 @ NIT Calicut

Generating a route path

// $path => "/blog/read/42.atom"

$path = $router->generate('read', array(

'id' => 42,

'format' => '.atom',

));

$href = htmlspecialchars($path, ENT_QUOTES, 'UTF-8');

echo '<a href="$href">Atom feed for this blog entry</a>';

Page 17: Aura for PHP at Fossmeet 2014

FOSSMeet 2014 @ NIT Calicut

Aura.Filter v1

Page 18: Aura for PHP at Fossmeet 2014

FOSSMeet 2014 @ NIT Calicut

Instantiation$filter = require "/path/to/Aura.Filter/scripts/instance.php";

oruse Aura\Filter\RuleCollection as Filter;

use Aura\Filter\RuleLocator;

use Aura\Filter\Translator;

$filter = new Filter(

new RuleLocator,

new Translator(require 'path/to/Aura.Filter/intl/en_US.php')

);

Page 19: Aura for PHP at Fossmeet 2014

FOSSMeet 2014 @ NIT Calicut

Rule Types

● Soft : if the rule fails, the filter will keep applying all remaining rules to that field and all other fields

● Hard : if the rule fails, the filter will not apply any more rules to that field, but it will keep filtering other fields.

● Stop : if the rule fails, the filter will not apply any more filters to any more fields; this stops all filtering on the data object.

Page 20: Aura for PHP at Fossmeet 2014

FOSSMeet 2014 @ NIT Calicut

Aura.Filter$filter->addSoftRule('username', $filter::IS, 'alnum');

$filter->addSoftRule('username', $filter::IS, 'strlenBetween', 6, 12);

$filter->addSoftRule('username', $filter::FIX, 'string');

$filter->addSoftRule('password', $filter::IS, 'strlenMin', 6);

$filter->addSoftRule('password_confirm', $filter::IS, 'equalToField', 'password');

$data = [ 'username' => 'bolivar', 'password' => 'p@55w0rd', 'password_confirm' => 'p@55word', // not the same!];

$success = $filter->values($data);

if (! $success) {

$messages = $filter->getMessages();

}

Page 21: Aura for PHP at Fossmeet 2014

FOSSMeet 2014 @ NIT Calicut

Validating and Sanitizing

● RuleCollection::IS means the field value must match the rule.

● RuleCollection::IS_NOT means the field value must not match the rule.

● RuleCollection::IS_BLANK_OR means the field value must either be blank, or match the rule.

● RuleCollection::FIX to force the field value to comply with the rule; this may forcibly transform the value.

● RuleCollection::FIX_BLANK_OR will convert blank values to null; non-blank fields will be forced to comply with the rule.

Page 22: Aura for PHP at Fossmeet 2014

FOSSMeet 2014 @ NIT Calicut

Available Rules

alnum alpha between blank creditCard

dateTime email equalToField equalToValue float

inKeys inValues int ipv4 locale

max min regex strictEqualToField

strictEqualToValue

string strlen strlenBetween strlenMax strlenMin

trim upload url word isbn

any all

Page 23: Aura for PHP at Fossmeet 2014

FOSSMeet 2014 @ NIT Calicut

Custom Rules

● Write a rule class● Set that class as a service in the RuleLocator● Use the new rule in our filter chain

Page 24: Aura for PHP at Fossmeet 2014

FOSSMeet 2014 @ NIT Calicut

Rule Class

● Extend Aura\Filter\AbstractRule with two methods: validate() and sanitize()

● Add params as needed to each method.

● Each method should return a boolean: true on success, or false on failure.

● Use getValue() to get the value being validated, and setValue() to change the value being sanitized.

● Add a property $message to indicate a string that should be translated as a message when validation or sanitizing fails.

Page 25: Aura for PHP at Fossmeet 2014

FOSSMeet 2014 @ NIT Calicut

Exampleuse Aura\Filter\AbstractRule;

class Hex extends AbstractRule {

protected $message;

public function validate($max = null) {

$value = $this->getValue();

}

public function sanitize($max = null) { $this->setValue('Hello'); // some code }

}

$locator = $filter->getRuleLocator();

$locator->set('hex', function () {

return new Hex;

});

Page 26: Aura for PHP at Fossmeet 2014

FOSSMeet 2014 @ NIT Calicut

Questions ?

● Hire me to coach you PHP, Aura

Hari KT

harikt.com

https://github.com/harikt

Page 27: Aura for PHP at Fossmeet 2014

FOSSMeet 2014 @ NIT Calicut

more library / framework

Aura.Cli Aura.Di Aura.Includer

Aura.Input Aura.Web Aura.Di

Aura.Dispatcher Aura. Sql Aura.View

Aura.Html Aura.Http Aura.Intl

Aura.Router Aura.Signal Aura.Filter

Aura.Session Aura.Sql_Query Aura.Sql_Schema

Aura.Marshal Aura.Autoload Aura.Web_Project

Aura.Framework Aura.Framework_Project Aura.Project_Kernel

Aura.Web_Kernel Aura.Web_Project Aura.Cli_Kernel

Aura.Cli_Project .....

Page 28: Aura for PHP at Fossmeet 2014

FOSSMeet 2014 @ NIT Calicut

PHP User Group in Calicut

● Plan to organize a user group meetup once in a month

● Looking for space and audience● Join https://groups.google.com/forum/#!

forum/php-clt

Page 29: Aura for PHP at Fossmeet 2014

FOSSMeet 2014 @ NIT Calicut

Thanks

● Website : http://auraphp.com/● Source Code : http://github.com/auraphp● Groups :

https://groups.google.com/d/forum/auraphp● Paul M Jones : http://paul-m-jones.com/● Chris Tankersley

http://www.slideshare.net/ctankersley/dtyu● SolarPHP : http://solarphp.com/