Snabbstarta ditt projekt med Flight, php-activerecord och Twig

Jag nämde i mitt tidigare inlägg om att PHP fortfarande är störst "microramverket" Flight som jag har använt mig av en hel del på sistone.

Likt Flask, Sinatra och för all del Slim – är Flight ett enkelt ramverk som är gjort för att byggas vidare på helt efter tycke och smak.

Flight är väldigt "barebone" i standardutförande, du får inte så mycket mer en enkla metoder att route:a trafik och ett mycket grundläggande template-språk. Men med php-activerecord och Twig så blir Flight en perfekt start för både små och mellanstora webbapplikationer.

Börja med att sätta upp en struktur liknande det här:

Flight, php-activerecord and Twig

Nu ska vi använda composer för dra in Flight, php-activerecord och Twig till vårt projekt. Alla finns på Packagist, så skapa en composer.json-fil som ser ut ungefär så här:

{
    "require": {
        "twig/twig": "1.*",
        "mikecao/flight": "dev-master",
        "php-activerecord/php-activerecord": "dev-master"
    }
}

Dra sedan ner composer till ditt projekt:

$ curl -s http://getcomposer.org/installer | php

Och installera modulerna (notera att du måste ha Git installerat):

$ php composer.phar install

Släng också in en .htaccess-fil (om du använder Apache):

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php [QSA,L]

Nu borde du ha allt installerat i /vendor, och vara redo för att skriva lite PHP!

Skapa en index.php i projektmappen och inkludera composer:ns autoload.php. Testa sedan att med Flight skapa et route till /test:

<?php
    include dirname(__FILE__) . '/vendor/autoload.php';

    Flight::route('/test', function(){
        echo "hello world!";
    });

    Flight::start();

localhost/test (eller hur du nu har din miljö uppsatt) bör du kort och gott se "hello world!".

Nu kommer det roliga, att få alla delarna att leka snällt med varandra. Börja med att konfigurera upp Twig:

<?php
    /**
    * Initiate Twig, and register to Flight
    */
    $loader = new Twig_Loader_Filesystem(dirname(__FILE__) . '/views'); 
    $twigConfig = array(
        // 'cache'  =>  './cache/twig/',
        // 'cache'  =>  false,
        'debug' =>  true,
    );
    Flight::register('view', 'Twig_Environment', array($loader, $twigConfig), function($twig) {
        $twig->addExtension(new Twig_Extension_Debug()); // Add the debug extension
    });

På detta vis når vi nu Twig via

<?php
    Flight::view()->display('template.html', $data);

Testa så att allt fungerar genom att skapa en mall och lägg den i din views-mapp.

<?php
    // template.html
    hello {{name}}!

    // index.php
    Flight::route('/hello', function(){
        $data = array(
            'name' => Flight::request()->query->name
        );
        Flight::view()->display('template.html', $data);
    });

localhost/hello?name=Marcus borde ge "hello Marcus!".

Nu var det php-activerecord också. Om du har använt CodeIgniter eller Lithium så är chanserna stora att du har använt något derivat av php-activerecord, så du borde känna igen syntaxen – det är anledningen till att jag brukar köra på det. Men om du föredrar något annat ORM, kör för all del på det istället. För att ladda in det i Flight gör vi på följande vis:

<?php
    /**
    * Initiate ActiveRecord
    */
    ActiveRecord\Config::initialize(function($cfg) {
        $cfg->set_model_directory('./models');
        $cfg->set_connections(
            // mysql://
            array('development' => 'mysql://username:password@localhost/database')
        );
        $cfg->set_default_connection('development');
    });

För det här testet kan vi använda en väldigt enkel users-tabell:

CREATE TABLE `users` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `firstname` varchar(255) COLLATE utf8_swedish_ci NOT NULL,
  `surname` varchar(255) COLLATE utf8_swedish_ci NOT NULL,
  `email` varchar(255) COLLATE utf8_swedish_ci NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_swedish_ci AUTO_INCREMENT=1 ;

Sätt också upp en user-modell i /models:

<?php
    class User extends ActiveRecord\Model {
    }

Nu borde du enkelt kunna skapa en ny användare genom:

<?php 
    $user = new User();
    $user->firstname = 'Marcus';
    $user->surname = 'Olsson';
    $user->email = 'trash@thedumpster.com';
    $user->save();

    print_r(User::last());

    // User Object
    // (
    //     [...]
    //     [attributes:ActiveRecord\Model:private] => Array
    //         (
    //             [id] => 1
    //             [firstname] => Marcus
    //             [surname] => Olsson
    //             [email] => trash@dumpster.com
    //         )
    //         [...]
    // )

Det var allt egentligen – du har nu grunden för att snabbt kunna skapa en riktigt bra webbapplikation. Om du undrar varför vi satte upp /controllers i början är det för att man inte ska behöva ha allt i sin index.php – utan man kan mappa en route till en controller och metod, likt:

<?php 
    // index.php
    Flight::path(dirname(__FILE__) . '/controllers');
    Flight::route('/', array('IndexController', 'index'));

    // controllers/indexController.php
    class IndexController {
        public function __construct() {}

        public static function index() {
            echo 'Hello world!';
        }
    }

Hela den här guiden finns på GitHub för den som är intresserad, och jag är mer än intresserad av att höra vad du tycker om Flight, och andra microramverk för den delen.