symfony components confoo 2010 100310231007 phpapp02

148
The Symfony Components – Fabien Potencier

Upload: jesus-solis

Post on 10-Apr-2018

228 views

Category:

Documents


0 download

TRANSCRIPT

8/8/2019 Symfony Components Confoo 2010 100310231007 Phpapp02

http://slidepdf.com/reader/full/symfony-components-confoo-2010-100310231007-phpapp02 1/148

The Symfony Components – Fabien Potencier

8/8/2019 Symfony Components Confoo 2010 100310231007 Phpapp02

http://slidepdf.com/reader/full/symfony-components-confoo-2010-100310231007-phpapp02 2/148

The Symfony Components – Fabien Potencier

Serial entrepreneur

Developer by passion

Founder of Sensio

Creator and lead developer of Symfony

On Twitter @fabpotOn github http://www.github.com/fabpot

http://fabien.potencier.org/

8/8/2019 Symfony Components Confoo 2010 100310231007 Phpapp02

http://slidepdf.com/reader/full/symfony-components-confoo-2010-100310231007-phpapp02 3/148

The Symfony Components – Fabien Potencier

Standalone components for PHP 5.3

No dependency between them

Used extensively in Symfony 2, the framework

8/8/2019 Symfony Components Confoo 2010 100310231007 Phpapp02

http://slidepdf.com/reader/full/symfony-components-confoo-2010-100310231007-phpapp02 4/148

The Symfony Components – Fabien Potencier

Low-level libraries

needed by most websites

8/8/2019 Symfony Components Confoo 2010 100310231007 Phpapp02

http://slidepdf.com/reader/full/symfony-components-confoo-2010-100310231007-phpapp02 5/148The Symfony Components – Fabien Potencier

Event Dispatcher

Output Escaper

YAML

Routing

Console

Dependency Injection Container

Request HandlerTemplating

Extracted from symfony 1

Written from scratch

for Symfony 2

Stable

Stable

Stable

Beta

Stable

Stable

Stable

Stable

8/8/2019 Symfony Components Confoo 2010 100310231007 Phpapp02

http://slidepdf.com/reader/full/symfony-components-confoo-2010-100310231007-phpapp02 6/148The Symfony Components – Fabien Potencier

YAML

Event Dispatcher

Templating

Dependency Injection Container

Console

Routing

Output EscaperRequest Handler

PHP Quebec 2009

ConFoo 2010

8/8/2019 Symfony Components Confoo 2010 100310231007 Phpapp02

http://slidepdf.com/reader/full/symfony-components-confoo-2010-100310231007-phpapp02 7/148The Symfony Components – Fabien Potencier

Download / Installation

8/8/2019 Symfony Components Confoo 2010 100310231007 Phpapp02

http://slidepdf.com/reader/full/symfony-components-confoo-2010-100310231007-phpapp02 8/148The Symfony Components – Fabien Potencier

git clone git://github.com/symfony/symfony.git

Main reposi tor y

8/8/2019 Symfony Components Confoo 2010 100310231007 Phpapp02

http://slidepdf.com/reader/full/symfony-components-confoo-2010-100310231007-phpapp02 9/148

The Symfony Components – Fabien Potencier

svn checkout http://svn.symfony-project.org/branches/2.0/

Gi t Mirror

S ynchronized

e ver y 15 minu tes

8/8/2019 Symfony Components Confoo 2010 100310231007 Phpapp02

http://slidepdf.com/reader/full/symfony-components-confoo-2010-100310231007-phpapp02 10/148

The Symfony Components – Fabien Potencier

curl -O http://github.com/symfony/symfony/tarball/mastertar zxpf symfony-symfony-XXXXXXX.tar.gz

curl -O http://github.com/symfony/symfony/zipball/masterunzip symfony-symfony-XXXXXXX.zip

Nigh tl y build

8/8/2019 Symfony Components Confoo 2010 100310231007 Phpapp02

http://slidepdf.com/reader/full/symfony-components-confoo-2010-100310231007-phpapp02 11/148

The Symfony Components – Fabien Potencier

app/

.../Symfony/

Components/Foundation/

Framework/

8/8/2019 Symfony Components Confoo 2010 100310231007 Phpapp02

http://slidepdf.com/reader/full/symfony-components-confoo-2010-100310231007-phpapp02 12/148

The Symfony Components – Fabien Potencier

Autoloading Classes

8/8/2019 Symfony Components Confoo 2010 100310231007 Phpapp02

http://slidepdf.com/reader/full/symfony-components-confoo-2010-100310231007-phpapp02 13/148

The Symfony Components – Fabien Potencier

Before PHP 5.3

PEAR naming convention

8/8/2019 Symfony Components Confoo 2010 100310231007 Phpapp02

http://slidepdf.com/reader/full/symfony-components-confoo-2010-100310231007-phpapp02 14/148

8/8/2019 Symfony Components Confoo 2010 100310231007 Phpapp02

http://slidepdf.com/reader/full/symfony-components-confoo-2010-100310231007-phpapp02 15/148

The Symfony Components – Fabien Potencier

PEAR_Log > PEAR/Log.php

Zend_Log > Zend/Log.php

Swift_Mime_Message > Swift/Mime/Message.phpDoctrine_Pager_Range > Doctrine/Pager/Range.php

Twig_Node_For > Twig/Node/For.php

 Vendor name

8/8/2019 Symfony Components Confoo 2010 100310231007 Phpapp02

http://slidepdf.com/reader/full/symfony-components-confoo-2010-100310231007-phpapp02 16/148

The Symfony Components – Fabien Potencier

As of PHP 5.3

PHP 5.3 technical

interoperability standards

8/8/2019 Symfony Components Confoo 2010 100310231007 Phpapp02

http://slidepdf.com/reader/full/symfony-components-confoo-2010-100310231007-phpapp02 17/148

The Symfony Components – Fabien Potencier

Symfony\Foundation\Kernel > Symfony/Foundation/Kernel.php

Doctrine\DBAL\Driver > Doctrine/DBAL/Driver.phppdepend\reflection\ReflectionSession > pdepend/reflection/ReflectionSession.php

8/8/2019 Symfony Components Confoo 2010 100310231007 Phpapp02

http://slidepdf.com/reader/full/symfony-components-confoo-2010-100310231007-phpapp02 18/148

The Symfony Components – Fabien Potencier

Symfony\Foundation\Kernel > Symfony/Foundation/Kernel.php

Doctrine\DBAL\Driver > Doctrine/DBAL/Driver.phppdepend\reflection\ReflectionSession > pdepend/reflection/ReflectionSession.php

 Vendor name

8/8/2019 Symfony Components Confoo 2010 100310231007 Phpapp02

http://slidepdf.com/reader/full/symfony-components-confoo-2010-100310231007-phpapp02 19/148

The Symfony Components – Fabien Potencier

PHP 5.3 technical interoperability standards

« … describes the mandatory requirements

that must be adhered to

for autoloader interoperability »

http://groups.google.com/group/php-standards/web/psr-0-final-proposal

8/8/2019 Symfony Components Confoo 2010 100310231007 Phpapp02

http://slidepdf.com/reader/full/symfony-components-confoo-2010-100310231007-phpapp02 20/148

The Symfony Components – Fabien Potencier

use Symfony\Foundation\UniversalClassLoader;

8/8/2019 Symfony Components Confoo 2010 100310231007 Phpapp02

http://slidepdf.com/reader/full/symfony-components-confoo-2010-100310231007-phpapp02 21/148

8/8/2019 Symfony Components Confoo 2010 100310231007 Phpapp02

http://slidepdf.com/reader/full/symfony-components-confoo-2010-100310231007-phpapp02 22/148

The Symfony Components – Fabien Potencier

$loader->registerNamespaces(array('Symfony' => '/path/to/symfony/src','Doctrine' => '/path/to/doctrine/lib',

'pdepend' => '/path/to/reflection/source',)); 

PHP 5.3  technical 

in teroperabili t y s tandards

8/8/2019 Symfony Components Confoo 2010 100310231007 Phpapp02

http://slidepdf.com/reader/full/symfony-components-confoo-2010-100310231007-phpapp02 23/148

The Symfony Components – Fabien Potencier

$loader->registerPrefixes(array('Swift_' => '/path/to/swiftmailer/lib/classes',

'Zend_' => '/path/to/vendor/zend/library',)); 

PEAR s t yle

i ' /S f /F d ti /U i lCl L d h '

8/8/2019 Symfony Components Confoo 2010 100310231007 Phpapp02

http://slidepdf.com/reader/full/symfony-components-confoo-2010-100310231007-phpapp02 24/148

The Symfony Components – Fabien Potencier

require_once '.../Symfony/Foundation/UniversalClassLoader.php';

use Symfony\Foundation\UniversalClassLoader;

$loader = new UniversalClassLoader();$loader->registerNamespaces(array('Symfony' => '/path/to/symfony/src','Doctrine' => '/path/to/doctrine/lib',

));$loader->registerPrefixes(array('Swift_' => '/path/to/swiftmailer/lib/classes','Zend_' => '/path/to/vendor/zend/library',

));

$loader->register();

// use any class 

8/8/2019 Symfony Components Confoo 2010 100310231007 Phpapp02

http://slidepdf.com/reader/full/symfony-components-confoo-2010-100310231007-phpapp02 25/148

The Symfony Components – Fabien Potencier

Console

8/8/2019 Symfony Components Confoo 2010 100310231007 Phpapp02

http://slidepdf.com/reader/full/symfony-components-confoo-2010-100310231007-phpapp02 26/148

The Symfony Components – Fabien Potencier

Console

8/8/2019 Symfony Components Confoo 2010 100310231007 Phpapp02

http://slidepdf.com/reader/full/symfony-components-confoo-2010-100310231007-phpapp02 27/148

The Symfony Components – Fabien Potencier

Automate things

code generatorsdeployment

8/8/2019 Symfony Components Confoo 2010 100310231007 Phpapp02

http://slidepdf.com/reader/full/symfony-components-confoo-2010-100310231007-phpapp02 28/148

The Symfony Components – Fabien Potencier

Long running tasks

deploymentget « things » from the Internet

8/8/2019 Symfony Components Confoo 2010 100310231007 Phpapp02

http://slidepdf.com/reader/full/symfony-components-confoo-2010-100310231007-phpapp02 29/148

The Symfony Components – Fabien Potencier

Batches

cleanup a database from time to timemigrate a DB to a new schema

8/8/2019 Symfony Components Confoo 2010 100310231007 Phpapp02

http://slidepdf.com/reader/full/symfony-components-confoo-2010-100310231007-phpapp02 30/148

The Symfony Components – Fabien Potencier

These tasks should never

be run from a browser

8/8/2019 Symfony Components Confoo 2010 100310231007 Phpapp02

http://slidepdf.com/reader/full/symfony-components-confoo-2010-100310231007-phpapp02 31/148

The Symfony Components – Fabien Potencier

But PHP is

a web language, right?

8/8/2019 Symfony Components Confoo 2010 100310231007 Phpapp02

http://slidepdf.com/reader/full/symfony-components-confoo-2010-100310231007-phpapp02 32/148

The Symfony Components – Fabien Potencier

So, why not use the right toolfor the job?

… like Perl or Python?

8/8/2019 Symfony Components Confoo 2010 100310231007 Phpapp02

http://slidepdf.com/reader/full/symfony-components-confoo-2010-100310231007-phpapp02 33/148

The Symfony Components – Fabien Potencier

Don’t want to use/learn another language

Want to share code

8/8/2019 Symfony Components Confoo 2010 100310231007 Phpapp02

http://slidepdf.com/reader/full/symfony-components-confoo-2010-100310231007-phpapp02 34/148

The Symfony Components – Fabien Potencier

PHP natively supports

the CLI environment

8/8/2019 Symfony Components Confoo 2010 100310231007 Phpapp02

http://slidepdf.com/reader/full/symfony-components-confoo-2010-100310231007-phpapp02 35/148

The Symfony Components – Fabien Potencier

<?php

// ... 

8/8/2019 Symfony Components Confoo 2010 100310231007 Phpapp02

http://slidepdf.com/reader/full/symfony-components-confoo-2010-100310231007-phpapp02 36/148

The Symfony Components – Fabien Potencier

#!/usr/bin/env php<?php

// ... 

$ ./ foo …

8/8/2019 Symfony Components Confoo 2010 100310231007 Phpapp02

http://slidepdf.com/reader/full/symfony-components-confoo-2010-100310231007-phpapp02 37/148

The Symfony Components – Fabien Potencier

$ ./foobar Fabien

$name = $argv[1];echo 'Hello '.$name;

8/8/2019 Symfony Components Confoo 2010 100310231007 Phpapp02

http://slidepdf.com/reader/full/symfony-components-confoo-2010-100310231007-phpapp02 38/148

The Symfony Components – Fabien Potencier

… but the complexity lies in the details

option / arguments handling

8/8/2019 Symfony Components Confoo 2010 100310231007 Phpapp02

http://slidepdf.com/reader/full/symfony-components-confoo-2010-100310231007-phpapp02 39/148

The Symfony Components – Fabien Potencier

option / arguments handling

exit codesshell

output colorizationtests

error messages…

8/8/2019 Symfony Components Confoo 2010 100310231007 Phpapp02

http://slidepdf.com/reader/full/symfony-components-confoo-2010-100310231007-phpapp02 40/148

8/8/2019 Symfony Components Confoo 2010 100310231007 Phpapp02

http://slidepdf.com/reader/full/symfony-components-confoo-2010-100310231007-phpapp02 41/148

The Symfony Components – Fabien Potencier

don’t reinvent the wheel…

use a “framework”

8/8/2019 Symfony Components Confoo 2010 100310231007 Phpapp02

http://slidepdf.com/reader/full/symfony-components-confoo-2010-100310231007-phpapp02 42/148

8/8/2019 Symfony Components Confoo 2010 100310231007 Phpapp02

http://slidepdf.com/reader/full/symfony-components-confoo-2010-100310231007-phpapp02 43/148

The Symfony Components – Fabien Potencier

Let’s create a CLI tool

to get the weatheranywhere in the world

8/8/2019 Symfony Components Confoo 2010 100310231007 Phpapp02

http://slidepdf.com/reader/full/symfony-components-confoo-2010-100310231007-phpapp02 44/148

The Symfony Components – Fabien Potencier

use Life\YahooWeather;

8/8/2019 Symfony Components Confoo 2010 100310231007 Phpapp02

http://slidepdf.com/reader/full/symfony-components-confoo-2010-100310231007-phpapp02 45/148

The Symfony Components – Fabien Potencier

use Life\YahooWeather;

$weather = new YahooWeather('API_KEY', $argv[1]);

echo $weather->getTitle()."\n";

$attrs = $weather->getCurrentConditions();

echo "Current conditions:\n";

echo sprintf(" %s, %sC\n", $attrs['text'], $attrs['temp']);

$attrs = $weather->getForecast();

echo sprintf("\nForecast for %s\n", $attrs['date']);

echo sprintf(" %s, low: %s, high: %s\n", $attrs['text'],$attrs['low'], $attrs['high']);

8/8/2019 Symfony Components Confoo 2010 100310231007 Phpapp02

http://slidepdf.com/reader/full/symfony-components-confoo-2010-100310231007-phpapp02 46/148

The Symfony Components – Fabien Potencier

use Symfony\Components\Console\Application;

$application = new Application();$application->run();

8/8/2019 Symfony Components Confoo 2010 100310231007 Phpapp02

http://slidepdf.com/reader/full/symfony-components-confoo-2010-100310231007-phpapp02 47/148

The Symfony Components – Fabien Potencier

$command = new Command('weather');

$command->setCode(function ($input, $output){// do something

});

$application->addCommand($command);

8/8/2019 Symfony Components Confoo 2010 100310231007 Phpapp02

http://slidepdf.com/reader/full/symfony-components-confoo-2010-100310231007-phpapp02 48/148

The Symfony Components – Fabien Potencier

use Symfony\Components\Console\Application;

$application = new Application();

$application->addCommand(new WeatherCommand());$application->run();

use Symfony\Components\Console\Command\Command;

8/8/2019 Symfony Components Confoo 2010 100310231007 Phpapp02

http://slidepdf.com/reader/full/symfony-components-confoo-2010-100310231007-phpapp02 49/148

The Symfony Components – Fabien Potencier

use Symfony\Components\Console\Input\InputInterface;use Symfony\Components\Console\Output\OutputInterface;

class WeatherCommand extends Command{

protected function configure(){$this->setName('weather');

}

protected function execute(InputInterface $input, OutputInterface$output)

{// do something

}}

8/8/2019 Symfony Components Confoo 2010 100310231007 Phpapp02

http://slidepdf.com/reader/full/symfony-components-confoo-2010-100310231007-phpapp02 50/148

The Symfony Components – Fabien Potencier

Console

The Output

8/8/2019 Symfony Components Confoo 2010 100310231007 Phpapp02

http://slidepdf.com/reader/full/symfony-components-confoo-2010-100310231007-phpapp02 51/148

The Symfony Components – Fabien Potencier

$output->writeln($weather->getTitle());

8/8/2019 Symfony Components Confoo 2010 100310231007 Phpapp02

http://slidepdf.com/reader/full/symfony-components-confoo-2010-100310231007-phpapp02 52/148

The Symfony Components – Fabien Potencier

$output->writeln(sprintf('<info>%s</info>', $weather->getTitle())

);

$output->writeln("<comment>Conditions</comment>");

8/8/2019 Symfony Components Confoo 2010 100310231007 Phpapp02

http://slidepdf.com/reader/full/symfony-components-confoo-2010-100310231007-phpapp02 53/148

The Symfony Components – Fabien Potencier

8/8/2019 Symfony Components Confoo 2010 100310231007 Phpapp02

http://slidepdf.com/reader/full/symfony-components-confoo-2010-100310231007-phpapp02 54/148

The Symfony Components – Fabien Potencier

8/8/2019 Symfony Components Confoo 2010 100310231007 Phpapp02

http://slidepdf.com/reader/full/symfony-components-confoo-2010-100310231007-phpapp02 55/148

The Symfony Components – Fabien Potencier

Console

Getting help

8/8/2019 Symfony Components Confoo 2010 100310231007 Phpapp02

http://slidepdf.com/reader/full/symfony-components-confoo-2010-100310231007-phpapp02 56/148

The Symfony Components – Fabien Potencier

8/8/2019 Symfony Components Confoo 2010 100310231007 Phpapp02

http://slidepdf.com/reader/full/symfony-components-confoo-2010-100310231007-phpapp02 57/148

The Symfony Components – Fabien Potencier

$application = new Application('Life Tool', '0.1');

class WeatherCommand extends Command{

protected function configure()

8/8/2019 Symfony Components Confoo 2010 100310231007 Phpapp02

http://slidepdf.com/reader/full/symfony-components-confoo-2010-100310231007-phpapp02 58/148

The Symfony Components – Fabien Potencier

{$this->setName('weather')

->setDescription('Displays weather forecast')

->setHelp(<<<EOF The <info>weather</info> command displaysweather forecast for a given city:

<info>./life weather Paris</info>

You can also change the default degree unitwith the <comment>--unit</comment> option:

<info>./life weather Paris --unit=c</info><info>./life weather Paris -u c</info>

EOF );}

8/8/2019 Symfony Components Confoo 2010 100310231007 Phpapp02

http://slidepdf.com/reader/full/symfony-components-confoo-2010-100310231007-phpapp02 59/148

The Symfony Components – Fabien Potencier

8/8/2019 Symfony Components Confoo 2010 100310231007 Phpapp02

http://slidepdf.com/reader/full/symfony-components-confoo-2010-100310231007-phpapp02 60/148

The Symfony Components – Fabien Potencier

8/8/2019 Symfony Components Confoo 2010 100310231007 Phpapp02

http://slidepdf.com/reader/full/symfony-components-confoo-2010-100310231007-phpapp02 61/148

The Symfony Components – Fabien Potencier

$ ./life weather

$ ./life weath$ ./life w

8/8/2019 Symfony Components Confoo 2010 100310231007 Phpapp02

http://slidepdf.com/reader/full/symfony-components-confoo-2010-100310231007-phpapp02 62/148

The Symfony Components – Fabien Potencier

Console

The Input

8/8/2019 Symfony Components Confoo 2010 100310231007 Phpapp02

http://slidepdf.com/reader/full/symfony-components-confoo-2010-100310231007-phpapp02 63/148

8/8/2019 Symfony Components Confoo 2010 100310231007 Phpapp02

http://slidepdf.com/reader/full/symfony-components-confoo-2010-100310231007-phpapp02 64/148

The Symfony Components – Fabien Potencier

8/8/2019 Symfony Components Confoo 2010 100310231007 Phpapp02

http://slidepdf.com/reader/full/symfony-components-confoo-2010-100310231007-phpapp02 65/148

The Symfony Components – Fabien Potencier

protected function execute(InputInterface $input,OutputInterface $output){$city = $input->getArgument('place');$unit = $input->getOption('unit');

$output->writeln("<comment>Conditions</comment>");}

8/8/2019 Symfony Components Confoo 2010 100310231007 Phpapp02

http://slidepdf.com/reader/full/symfony-components-confoo-2010-100310231007-phpapp02 66/148

The Symfony Components – Fabien Potencier

Console

Error codes / Exit status

8/8/2019 Symfony Components Confoo 2010 100310231007 Phpapp02

http://slidepdf.com/reader/full/symfony-components-confoo-2010-100310231007-phpapp02 67/148

The Symfony Components – Fabien Potencier

8/8/2019 Symfony Components Confoo 2010 100310231007 Phpapp02

http://slidepdf.com/reader/full/symfony-components-confoo-2010-100310231007-phpapp02 68/148

The Symfony Components – Fabien Potencier

d f i ( f $i

8/8/2019 Symfony Components Confoo 2010 100310231007 Phpapp02

http://slidepdf.com/reader/full/symfony-components-confoo-2010-100310231007-phpapp02 69/148

The Symfony Components – Fabien Potencier

protected function execute(InputInterface $input,OutputInterface $output){$city = $input->getArgument('place');$unit = $input->getOption('unit');

$output->writeln("<comment>Conditions</comment>");

return 120;}

8/8/2019 Symfony Components Confoo 2010 100310231007 Phpapp02

http://slidepdf.com/reader/full/symfony-components-confoo-2010-100310231007-phpapp02 70/148

The Symfony Components – Fabien Potencier

Console

Interact with the user

t t d f ti i t t($i t $ t t)

8/8/2019 Symfony Components Confoo 2010 100310231007 Phpapp02

http://slidepdf.com/reader/full/symfony-components-confoo-2010-100310231007-phpapp02 71/148

The Symfony Components – Fabien Potencier

protected function interact($input, $output){

$city = $this->dialog->ask($output,'<comment>Which city?</comment> (Paris)','Paris’

);

$input->setArgument('place', $city);}

8/8/2019 Symfony Components Confoo 2010 100310231007 Phpapp02

http://slidepdf.com/reader/full/symfony-components-confoo-2010-100310231007-phpapp02 72/148

The Symfony Components – Fabien Potencier

./life weather --no-interaction

dialogask()askConfirmation()

8/8/2019 Symfony Components Confoo 2010 100310231007 Phpapp02

http://slidepdf.com/reader/full/symfony-components-confoo-2010-100310231007-phpapp02 73/148

The Symfony Components – Fabien Potencier

askConfirmation()askAndValidate()

formatterformatSection()

formatBlock()

... your own

8/8/2019 Symfony Components Confoo 2010 100310231007 Phpapp02

http://slidepdf.com/reader/full/symfony-components-confoo-2010-100310231007-phpapp02 74/148

$output >writeln(sprintf(

8/8/2019 Symfony Components Confoo 2010 100310231007 Phpapp02

http://slidepdf.com/reader/full/symfony-components-confoo-2010-100310231007-phpapp02 75/148

The Symfony Components – Fabien Potencier

$output->writeln(sprintf(" %s, low: %s, high: %s",

$attrs['text'],$this->weather->formatTemperature($attrs['low'],$input->getOption('unit')),

$this->weather->formatTemperature($attrs['high'],$input->getOption('unit'))

));

8/8/2019 Symfony Components Confoo 2010 100310231007 Phpapp02

http://slidepdf.com/reader/full/symfony-components-confoo-2010-100310231007-phpapp02 76/148

The Symfony Components – Fabien Potencier

8/8/2019 Symfony Components Confoo 2010 100310231007 Phpapp02

http://slidepdf.com/reader/full/symfony-components-confoo-2010-100310231007-phpapp02 77/148

The Symfony Components – Fabien Potencier

Console

Testing

8/8/2019 Symfony Components Confoo 2010 100310231007 Phpapp02

http://slidepdf.com/reader/full/symfony-components-confoo-2010-100310231007-phpapp02 78/148

The Symfony Components – Fabien Potencier

$input = new ArrayInput(array('place' => 'Paris', '--unit' => 'C')

);$application->run($input);

$input = new StringInput('Paris --unit=C');$application->run($input);

8/8/2019 Symfony Components Confoo 2010 100310231007 Phpapp02

http://slidepdf.com/reader/full/symfony-components-confoo-2010-100310231007-phpapp02 79/148

The Symfony Components – Fabien Potencier

$stream = fopen('php://memory', 'a', false);$output = new StreamOutput($stream);

$application->run($input, $output);

rewind($output->getStream());echo stream_get_contents($output->getStream());

8/8/2019 Symfony Components Confoo 2010 100310231007 Phpapp02

http://slidepdf.com/reader/full/symfony-components-confoo-2010-100310231007-phpapp02 80/148

The Symfony Components – Fabien Potencier

$application = new Application();

// for testing

$application->setCatchExceptions(false);$application->setAutoExit(false);

8/8/2019 Symfony Components Confoo 2010 100310231007 Phpapp02

http://slidepdf.com/reader/full/symfony-components-confoo-2010-100310231007-phpapp02 81/148

8/8/2019 Symfony Components Confoo 2010 100310231007 Phpapp02

http://slidepdf.com/reader/full/symfony-components-confoo-2010-100310231007-phpapp02 82/148

The Symfony Components – Fabien Potencier

$command = new WeatherCommand();

echo $command->asXml();

8/8/2019 Symfony Components Confoo 2010 100310231007 Phpapp02

http://slidepdf.com/reader/full/symfony-components-confoo-2010-100310231007-phpapp02 83/148

The Symfony Components – Fabien Potencier

Create a PHAR archive

out of your CLI toolfor distribution

8/8/2019 Symfony Components Confoo 2010 100310231007 Phpapp02

http://slidepdf.com/reader/full/symfony-components-confoo-2010-100310231007-phpapp02 84/148

8/8/2019 Symfony Components Confoo 2010 100310231007 Phpapp02

http://slidepdf.com/reader/full/symfony-components-confoo-2010-100310231007-phpapp02 85/148

8/8/2019 Symfony Components Confoo 2010 100310231007 Phpapp02

http://slidepdf.com/reader/full/symfony-components-confoo-2010-100310231007-phpapp02 86/148

The Symfony Components – Fabien Potencier

Routing

Pretty and Smart URLs

8/8/2019 Symfony Components Confoo 2010 100310231007 Phpapp02

http://slidepdf.com/reader/full/symfony-components-confoo-2010-100310231007-phpapp02 87/148

The Symfony Components – Fabien Potencier

http://example.com/article.php?id=44

http://example.com/article/confoo-2010

8/8/2019 Symfony Components Confoo 2010 100310231007 Phpapp02

http://slidepdf.com/reader/full/symfony-components-confoo-2010-100310231007-phpapp02 88/148

The Symfony Components – Fabien Potencier

Routing is a two-way process

Matching incoming requests (URLs)Generating URLs

8/8/2019 Symfony Components Confoo 2010 100310231007 Phpapp02

http://slidepdf.com/reader/full/symfony-components-confoo-2010-100310231007-phpapp02 89/148

The Symfony Components – Fabien Potencier

The architecture

is difficult to get right

8/8/2019 Symfony Components Confoo 2010 100310231007 Phpapp02

http://slidepdf.com/reader/full/symfony-components-confoo-2010-100310231007-phpapp02 90/148

The Symfony Components – Fabien Potencier

Symfony one is built

with performance in mind

8/8/2019 Symfony Components Confoo 2010 100310231007 Phpapp02

http://slidepdf.com/reader/full/symfony-components-confoo-2010-100310231007-phpapp02 91/148

The Symfony Components – Fabien Potencier

Routing

Describing your routes

use Symfony\Components\Routing\RouteCollection;

8/8/2019 Symfony Components Confoo 2010 100310231007 Phpapp02

http://slidepdf.com/reader/full/symfony-components-confoo-2010-100310231007-phpapp02 92/148

The Symfony Components – Fabien Potencier

use Symfony\Components\Routing\Route;

$routes = new RouteCollection();$route = new Route(

'/',array('to' => function () { echo "Home!"; }));$routes->addRoute('home', $route);

(

8/8/2019 Symfony Components Confoo 2010 100310231007 Phpapp02

http://slidepdf.com/reader/full/symfony-components-confoo-2010-100310231007-phpapp02 93/148

The Symfony Components – Fabien Potencier

$route = new Route(

'/:year/:month/:day/:slug',array('to' => function ($params) { var_export

($params); }),

array('year' => '\d{4}'));$routes->addRoute('blog_post', $route);

8/8/2019 Symfony Components Confoo 2010 100310231007 Phpapp02

http://slidepdf.com/reader/full/symfony-components-confoo-2010-100310231007-phpapp02 94/148

The Symfony Components – Fabien Potencier

Routing

Matching URLs

use Symfony\Components\Routing\Matcher\UrlMatcher;

8/8/2019 Symfony Components Confoo 2010 100310231007 Phpapp02

http://slidepdf.com/reader/full/symfony-components-confoo-2010-100310231007-phpapp02 95/148

The Symfony Components – Fabien Potencier

$matcher = new UrlMatcher($routes);

if (false === $params = $matcher->match('/')){

throw new \Exception('No route matches.');}

$params['to']();

( )

8/8/2019 Symfony Components Confoo 2010 100310231007 Phpapp02

http://slidepdf.com/reader/full/symfony-components-confoo-2010-100310231007-phpapp02 96/148

The Symfony Components – Fabien Potencier

$params = $matcher->match('/2010/03/10/confoo'); 

if (false === $params){throw new \Exception('No route matches.');

}

$params['to']($params);

array ('to' =>

8/8/2019 Symfony Components Confoo 2010 100310231007 Phpapp02

http://slidepdf.com/reader/full/symfony-components-confoo-2010-100310231007-phpapp02 97/148

The Symfony Components – Fabien Potencier

to >

Closure::__set_state(array()),'year' => '2010','month' => '03',

'day' => '10','slug' => 'confoo','_route' => 'blog_post',

)

$params = $matcher->match('/yyyy/03/10/confoo'); if (false === $params)

8/8/2019 Symfony Components Confoo 2010 100310231007 Phpapp02

http://slidepdf.com/reader/full/symfony-components-confoo-2010-100310231007-phpapp02 98/148

The Symfony Components – Fabien Potencier

if (false $params)

{ throw new \Exception('No route matches.');}

$params['to']($params);

Uncaught exception 'Exception' with message 'Noroute matches.'

8/8/2019 Symfony Components Confoo 2010 100310231007 Phpapp02

http://slidepdf.com/reader/full/symfony-components-confoo-2010-100310231007-phpapp02 99/148

The Symfony Components – Fabien Potencier

Routing

Generating URLs

8/8/2019 Symfony Components Confoo 2010 100310231007 Phpapp02

http://slidepdf.com/reader/full/symfony-components-confoo-2010-100310231007-phpapp02 100/148

The Symfony Components – Fabien Potencier

use Symfony\Components\Routing\Generator\UrlGenerator;

$generator = new UrlGenerator($routes);

echo $generator->generate('home', array());

$params = array(

8/8/2019 Symfony Components Confoo 2010 100310231007 Phpapp02

http://slidepdf.com/reader/full/symfony-components-confoo-2010-100310231007-phpapp02 101/148

The Symfony Components – Fabien Potencier

p y(

'year' => 2010,'month' => 10,'day' => 10,'slug' => 'another-one'

);

echo $generator->generate('blog_post', $params);

$params = array('year' => 'yyyy','month' > 10

8/8/2019 Symfony Components Confoo 2010 100310231007 Phpapp02

http://slidepdf.com/reader/full/symfony-components-confoo-2010-100310231007-phpapp02 102/148

The Symfony Components – Fabien Potencier

'month' => 10,

'day' => 10,);

echo $generator->generate('blog_post', $params);

Uncaught exception 'InvalidArgumentException'with message 'The "blog_post" route has some

missing mandatory parameters (:slug).'

use Symfony\Components\Routing\Generator\UrlGenerator;

8/8/2019 Symfony Components Confoo 2010 100310231007 Phpapp02

http://slidepdf.com/reader/full/symfony-components-confoo-2010-100310231007-phpapp02 103/148

The Symfony Components – Fabien Potencier

$generator = new UrlGenerator($routes);

echo $generator->generate('home', array('foo' =>'bar'));

/?foo=bar

$generator = new UrlGenerator($routes, array('base url' => '/myapp',

8/8/2019 Symfony Components Confoo 2010 100310231007 Phpapp02

http://slidepdf.com/reader/full/symfony-components-confoo-2010-100310231007-phpapp02 104/148

The Symfony Components – Fabien Potencier

_ y pp ,

'host' => 'www.example.com','is_secure' => false,));

echo $generator->generate('home', array(), true);

http://www.example.com/myapp/

The context

makes the routing

d l d f th t f th ld

8/8/2019 Symfony Components Confoo 2010 100310231007 Phpapp02

http://slidepdf.com/reader/full/symfony-components-confoo-2010-100310231007-phpapp02 105/148

The Symfony Components – Fabien Potencier

decoupled from the rest of the world

 base_url

hostis_secure

method

8/8/2019 Symfony Components Confoo 2010 100310231007 Phpapp02

http://slidepdf.com/reader/full/symfony-components-confoo-2010-100310231007-phpapp02 106/148

The Symfony Components – Fabien Potencier

Routing

Describing your routes with XML or YAML

home:pattern: /defaults: { controller: home, action: index }

8/8/2019 Symfony Components Confoo 2010 100310231007 Phpapp02

http://slidepdf.com/reader/full/symfony-components-confoo-2010-100310231007-phpapp02 107/148

The Symfony Components – Fabien Potencier

blog_post:pattern: /:year/:month/:day/:slugdefaults:

controller: blogaction: showrequirements:year: \d{4}

8/8/2019 Symfony Components Confoo 2010 100310231007 Phpapp02

http://slidepdf.com/reader/full/symfony-components-confoo-2010-100310231007-phpapp02 108/148

The Symfony Components – Fabien Potencier

use Symfony\Components\Routing\Loader\YamlFileLoader;

$loader = new YamlFileLoader();

$routes = $loader->load('routes.yml');

<?xml version="1.0" encoding="UTF-8" ?>

<routes xmlns="http://www.symfony-project.org/schema/routing" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.symfony-project.org/schema/routing

htt // s f r j t r /s h /r ti /r ti 1 0 sd">

8/8/2019 Symfony Components Confoo 2010 100310231007 Phpapp02

http://slidepdf.com/reader/full/symfony-components-confoo-2010-100310231007-phpapp02 109/148

The Symfony Components – Fabien Potencier

http://www.symfony-project.org/schema/routing/routing-1.0.xsd">

<route id="blog_post" pattern="/:year/:month/:day/:slug"><default key="controller">blog</default><default key="action">show</default><requirement key="year">\d{4}</requirement>

</route>

<route id="home" pattern="/"><default key="controller">home</default><default key="action">index</default>

</route></routes>

8/8/2019 Symfony Components Confoo 2010 100310231007 Phpapp02

http://slidepdf.com/reader/full/symfony-components-confoo-2010-100310231007-phpapp02 110/148

The Symfony Components – Fabien Potencier

use Symfony\Components\Routing\Loader\XmlFileLoader;

$loader = new XmlFileLoader();

$routes = $loader->load('routes.xml');

<?xml version="1.0" encoding="UTF-8" ?>

<routes>

8/8/2019 Symfony Components Confoo 2010 100310231007 Phpapp02

http://slidepdf.com/reader/full/symfony-components-confoo-2010-100310231007-phpapp02 111/148

The Symfony Components – Fabien Potencier

<routes>

<route id="home" pattern="/"><default key="controller">home</default><default key="action">index</default>

</route>

<import resource="blog.yml" prefix="/blog" /><import resource="forum.xml" prefix="/forum" />

</routes>

home:

8/8/2019 Symfony Components Confoo 2010 100310231007 Phpapp02

http://slidepdf.com/reader/full/symfony-components-confoo-2010-100310231007-phpapp02 112/148

The Symfony Components – Fabien Potencier

pattern: /defaults: { controller: home, action: index }

import:- { resource: blog.yml, prefix: /blog }- { resource: forum.xml, prefix: /forum }

$yamlLoader = new YamlFileLoader();$xmlLoader = new XmlFileLoader();

$routes = new RouteCollection();$ t R t (

8/8/2019 Symfony Components Confoo 2010 100310231007 Phpapp02

http://slidepdf.com/reader/full/symfony-components-confoo-2010-100310231007-phpapp02 113/148

The Symfony Components – Fabien Potencier

$route = new Route('/',array('to' => function () { echo "Home!"; })

);$routes->addRoute('home', $route);

$routes->addCollection($yamlLoader->load('blog.yml'), '/blog');

$routes->addCollection($xmlLoader->load('forum.xml'), '/forum');

8/8/2019 Symfony Components Confoo 2010 100310231007 Phpapp02

http://slidepdf.com/reader/full/symfony-components-confoo-2010-100310231007-phpapp02 114/148

The Symfony Components – Fabien Potencier

/blog/2010/03/10/confoo

prefix pattern

8/8/2019 Symfony Components Confoo 2010 100310231007 Phpapp02

http://slidepdf.com/reader/full/symfony-components-confoo-2010-100310231007-phpapp02 115/148

The Symfony Components – Fabien Potencier

Routing

Make it simple & fast

8/8/2019 Symfony Components Confoo 2010 100310231007 Phpapp02

http://slidepdf.com/reader/full/symfony-components-confoo-2010-100310231007-phpapp02 116/148

The Symfony Components – Fabien Potencier

use Symfony\Components\Routing\Router;

$router = new Router($loader, $options, $context);

$loader = function ()

{$routes = new RouteCollection();// ...

return $routes;

8/8/2019 Symfony Components Confoo 2010 100310231007 Phpapp02

http://slidepdf.com/reader/full/symfony-components-confoo-2010-100310231007-phpapp02 117/148

The Symfony Components – Fabien Potencier

return $routes;

};

$context = array('base_url' => '/myapp','host' => 'www.example.com','is_secure' => false,

);

$options = array('cache_dir' => '/tmp/routing','debug' => true,

);

$router = new Router($loader, $options, $context);

8/8/2019 Symfony Components Confoo 2010 100310231007 Phpapp02

http://slidepdf.com/reader/full/symfony-components-confoo-2010-100310231007-phpapp02 118/148

The Symfony Components – Fabien Potencier

if (false === $params = $router->match('/')){throw new \Exception('No route matches.');

}

echo $router->generate('home', array());

class ProjectUrlMatcher extends Symfony\Components\Routing

\Matcher\UrlMatcher{// ...

8/8/2019 Symfony Components Confoo 2010 100310231007 Phpapp02

http://slidepdf.com/reader/full/symfony-components-confoo-2010-100310231007-phpapp02 119/148

The Symfony Components – Fabien Potencier

public function match($url){$url = $this->normalizeUrl($url);

if (preg_match('#^/$#x', $url, $matches))

return array_merge($this->mergeDefaults($matches, array( 'to' => 'foo',)), array('_route' => 'home'));

return false;}

}

class ProjectUrlGenerator extends Symfony\Components\Routing\Generator\UrlGenerator{// ...

public function generate($name, array $parameters, $absolute = false){

if (!method_exists($this, $method = 'get'.$name.'RouteInfo'))

8/8/2019 Symfony Components Confoo 2010 100310231007 Phpapp02

http://slidepdf.com/reader/full/symfony-components-confoo-2010-100310231007-phpapp02 120/148

The Symfony Components – Fabien Potencier

{ throw new \InvalidArgumentException(sprintf('Route "%s" does not exist.', $name));}

list($variables, $defaults, $requirements, $tokens) = $this->$method();

return $this->doGenerate($variables, $defaults, $requirements, $tokens, $parameters,

$name, $absolute);}

protected function gethomeRouteInfo(){

return array(array (), array_merge($this->defaults, array ( 'to' => 'foo',)), array(), array ( 0 => array ( 0 => 'text', 1 => '/', 2 => '', 3 => NULL, ),));

}}

use Symfony\Components\Routing\FileResource;

$loader = function ()

8/8/2019 Symfony Components Confoo 2010 100310231007 Phpapp02

http://slidepdf.com/reader/full/symfony-components-confoo-2010-100310231007-phpapp02 121/148

The Symfony Components – Fabien Potencier

$ ()

{$routes = new RouteCollection();// ...

$routes->addResource(new FileResource(__FILE__));

return $routes;};

8/8/2019 Symfony Components Confoo 2010 100310231007 Phpapp02

http://slidepdf.com/reader/full/symfony-components-confoo-2010-100310231007-phpapp02 122/148

The Symfony Components – Fabien Potencier

Routing

Make it really fast

use Symfony\Components\Routing\Matcher\Dumper

8/8/2019 Symfony Components Confoo 2010 100310231007 Phpapp02

http://slidepdf.com/reader/full/symfony-components-confoo-2010-100310231007-phpapp02 123/148

The Symfony Components – Fabien Potencier

use Symfony\Components\Routing\Matcher\Dumper\ApacheMatcherDumper;

$dumper = new ApacheMatcherDumper($routes);

echo $dumper->dump();

8/8/2019 Symfony Components Confoo 2010 100310231007 Phpapp02

http://slidepdf.com/reader/full/symfony-components-confoo-2010-100310231007-phpapp02 124/148

The Symfony Components – Fabien Potencier

RewriteCond %{PATH_INFO} ^/$RewriteRule .* index.php[QSA,L,E=_ROUTING__route:home,E=_ROUTING_to:foo

]

$options = array(

8/8/2019 Symfony Components Confoo 2010 100310231007 Phpapp02

http://slidepdf.com/reader/full/symfony-components-confoo-2010-100310231007-phpapp02 125/148

The Symfony Components – Fabien Potencier

'cache_dir' => '/tmp/routing','debug' => true,'matcher_class' => 'Symfony\Components

\Routing\Matcher\ApacheUrlMatcher',);

8/8/2019 Symfony Components Confoo 2010 100310231007 Phpapp02

http://slidepdf.com/reader/full/symfony-components-confoo-2010-100310231007-phpapp02 126/148

The Symfony Components – Fabien Potencier

Output Escaper

8/8/2019 Symfony Components Confoo 2010 100310231007 Phpapp02

http://slidepdf.com/reader/full/symfony-components-confoo-2010-100310231007-phpapp02 127/148

The Symfony Components – Fabien Potencier

Provides XSS protection

for your PHP templates

Wraps template variables

Works for

strings

8/8/2019 Symfony Components Confoo 2010 100310231007 Phpapp02

http://slidepdf.com/reader/full/symfony-components-confoo-2010-100310231007-phpapp02 128/148

The Symfony Components – Fabien Potencier

arrays

objects

properties

methods__call(), __get(), …

Iterators, Coutables, …

Works for deep method calls

8/8/2019 Symfony Components Confoo 2010 100310231007 Phpapp02

http://slidepdf.com/reader/full/symfony-components-confoo-2010-100310231007-phpapp02 129/148

The Symfony Components – Fabien Potencier

use Symfony\Components\OutputEscaper\Escaper;

$title = 'Foo <br />';

echo Escaper::escape('htmlspecialchars', $title); 

use Symfony\Components\OutputEscaper\Escaper;

$article = array('title' => 'Foo <br />',

8/8/2019 Symfony Components Confoo 2010 100310231007 Phpapp02

http://slidepdf.com/reader/full/symfony-components-confoo-2010-100310231007-phpapp02 130/148

The Symfony Components – Fabien Potencier

> < /> ,'author' => array('name' => 'Fabien <br/>',

));

$article = Escaper::escape('htmlspecialchars', $article);

echo $article['title']."\n";echo $article['author']['name']."\n"; 

class Article

{ protected $title;protected $author;

public $full_title; public property

8/8/2019 Symfony Components Confoo 2010 100310231007 Phpapp02

http://slidepdf.com/reader/full/symfony-components-confoo-2010-100310231007-phpapp02 131/148

The Symfony Components – Fabien Potencier

public function __construct($title, Author $author){$this->title = $title;$this->full_title = $title;$this->author = $author;

}

public function getTitle() { return $this->title; }public function getAuthor() { return $this->author; }public function __get($key) { return $this->$key; }public function __call($method, $arguments){

return $this->{'get'.$method}();}}

public method

public method returning

another object

magic __get()

magic __call()

class Author

8/8/2019 Symfony Components Confoo 2010 100310231007 Phpapp02

http://slidepdf.com/reader/full/symfony-components-confoo-2010-100310231007-phpapp02 132/148

The Symfony Components – Fabien Potencier

{protected $name;

public function __construct($name) { $this->name = $name; }

public function getName() { return $this->name; }} 

use Symfony\Components\OutputEscaper\Escaper;

$article = new Article('foo <br />',

8/8/2019 Symfony Components Confoo 2010 100310231007 Phpapp02

http://slidepdf.com/reader/full/symfony-components-confoo-2010-100310231007-phpapp02 133/148

The Symfony Components – Fabien Potencier

new Author('Fabien <br />'));

$article = Escaper::escape('htmlspecialchars', $article);

echo $article->getTitle()."\n";echo $article->getAuthor()->getName()."\n";echo $article->full_title."\n";echo $article->title."\n";echo $article->title()."\n"; 

explicitly ask

for raw data

8/8/2019 Symfony Components Confoo 2010 100310231007 Phpapp02

http://slidepdf.com/reader/full/symfony-components-confoo-2010-100310231007-phpapp02 134/148

The Symfony Components – Fabien Potencier

echo $article->getHtmlContent('raw');

echo $article->getTitle('js');

change the default

escaping strategy

8/8/2019 Symfony Components Confoo 2010 100310231007 Phpapp02

http://slidepdf.com/reader/full/symfony-components-confoo-2010-100310231007-phpapp02 135/148

The Symfony Components – Fabien Potencier

Request Handler

use Symfony\Components\RequestHandler\Request;

8/8/2019 Symfony Components Confoo 2010 100310231007 Phpapp02

http://slidepdf.com/reader/full/symfony-components-confoo-2010-100310231007-phpapp02 136/148

The Symfony Components – Fabien Potencier

$request = new Request();$request->getPathInfo();

$request->getPreferredLanguage(array('en', 'fr'));$request->isXmlHttpRequest();

use Symfony\Components\RequestHandler\Request;

( (

8/8/2019 Symfony Components Confoo 2010 100310231007 Phpapp02

http://slidepdf.com/reader/full/symfony-components-confoo-2010-100310231007-phpapp02 137/148

The Symfony Components – Fabien Potencier

$request = new Request(array('request' => $_POST,'query' => $_GET,

'path' => array(),'server' => $_SERVER,));

use Symfony\Components\RequestHandler\Response;

$ (' ll ld'

8/8/2019 Symfony Components Confoo 2010 100310231007 Phpapp02

http://slidepdf.com/reader/full/symfony-components-confoo-2010-100310231007-phpapp02 138/148

The Symfony Components – Fabien Potencier

$response = new Response('Hello World', 200,array('Content-Type' => 'text/plain'));$response->send();

$response->setHeader('Content-Type', 'text/plain');$response->setCookie('foo', 'bar');$response->setContent('Hello World');$response->setStatusCode(200);

8/8/2019 Symfony Components Confoo 2010 100310231007 Phpapp02

http://slidepdf.com/reader/full/symfony-components-confoo-2010-100310231007-phpapp02 139/148

The Symfony Components – Fabien Potencier

Request Handler

Framework to build Frameworks

use Symfony\Components\RequestHandler\Request;use Symfony\Components\RequestHandler\Response;

S f \C t \R tH dl \R tH dl

8/8/2019 Symfony Components Confoo 2010 100310231007 Phpapp02

http://slidepdf.com/reader/full/symfony-components-confoo-2010-100310231007-phpapp02 140/148

The Symfony Components – Fabien Potencier

use Symfony\Components\RequestHandler\RequestHandler;

$handler = new RequestHandler($dispatcher);

$request = new Request();$response = $handler->handle($request);$response->send();

use Symfony\Components\EventDispatcher\EventDispatcher;use Symfony\Components\EventDispatcher\Event;

$di t h E tDi t h ()

8/8/2019 Symfony Components Confoo 2010 100310231007 Phpapp02

http://slidepdf.com/reader/full/symfony-components-confoo-2010-100310231007-phpapp02 141/148

The Symfony Components – Fabien Potencier

$dispatcher = new EventDispatcher();$dispatcher->connect('core.load_controller', function (Event $event){

$event->setReturnValue(array(function ($request) { return new Response('Hello!'); },array($event['request'])

));

return true;});

8/8/2019 Symfony Components Confoo 2010 100310231007 Phpapp02

http://slidepdf.com/reader/full/symfony-components-confoo-2010-100310231007-phpapp02 142/148

The Symfony Components – Fabien Potencier

Request Handler

A small Framework

$framework = new Framework(array('/' => function ($request){

$ t t 'H ll '

8/8/2019 Symfony Components Confoo 2010 100310231007 Phpapp02

http://slidepdf.com/reader/full/symfony-components-confoo-2010-100310231007-phpapp02 143/148

The Symfony Components – Fabien Potencier

$content = 'Hello '.$request->getParameter('name');

return new Response($content);}));$framework->run();

class Framework{protected $map;

public function __construct($map){

$this >map = $map;

8/8/2019 Symfony Components Confoo 2010 100310231007 Phpapp02

http://slidepdf.com/reader/full/symfony-components-confoo-2010-100310231007-phpapp02 144/148

The Symfony Components – Fabien Potencier

$this->map = $map;}

public function run(){$dispatcher = new EventDispatcher();

$dispatcher->connect('core.load_controller', array($this, 'loadController'));

$handler = new RequestHandler($dispatcher);$response = $handler->handle(new Request());$response->send();

}}

public function loadController(Event $event){

$request = $event['request'];

$routes = new RouteCollection();foreach ($this->map as $pattern => $to){$route = new Route($pattern, array('to' => $to));$routes->addRoute(str_replace('/', '_', $pattern), $route);

}

$matcher new UrlMatcher($routes array(

8/8/2019 Symfony Components Confoo 2010 100310231007 Phpapp02

http://slidepdf.com/reader/full/symfony-components-confoo-2010-100310231007-phpapp02 145/148

The Symfony Components – Fabien Potencier

$matcher = new UrlMatcher($routes, array('base_url' => $request->getBaseUrl(),'method' => $request->getMethod(),'host' => $request->getHost(),'is_secure' => $request->isSecure(),

));

$parameters = $matcher->match($request->getPathInfo());if (false === $parameters){return false;

}

$request->setPathParameters($parameters);

$event->setReturnValue(array($parameters['to'], array($request)));

return true;}

$framework = new Framework(array('/' => function ($request){

$content 'Hello '

8/8/2019 Symfony Components Confoo 2010 100310231007 Phpapp02

http://slidepdf.com/reader/full/symfony-components-confoo-2010-100310231007-phpapp02 146/148

The Symfony Components – Fabien Potencier

$content =  Hello .$request->getParameter('name');

return new Response($content);}));$framework->run();

8/8/2019 Symfony Components Confoo 2010 100310231007 Phpapp02

http://slidepdf.com/reader/full/symfony-components-confoo-2010-100310231007-phpapp02 147/148

The Symfony Components – Fabien Potencier

Questions?

Sensio S.A.

92-98, boulevard Victor Hugo

92 115 Clichy Cedex

FRANCE

8/8/2019 Symfony Components Confoo 2010 100310231007 Phpapp02

http://slidepdf.com/reader/full/symfony-components-confoo-2010-100310231007-phpapp02 148/148

The Symfony Components – Fabien Potencier

Tél. : +33 1 40 99 80 80

ContactFabien Potencier

fabien.potencier at sensio.com

http://www.sensiolabs.com/

http://www.symfony-project.org/

http://fabien.potencier.org/