Top Banner
The Symfony Components – Fabien Potencier
148

Symfony Components Confoo 2010 100310231007 Phpapp02

Apr 10, 2018

Download

Documents

Jesus Solis
Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
Page 1: Symfony Components Confoo 2010 100310231007 Phpapp02

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

Page 2: Symfony Components Confoo 2010 100310231007 Phpapp02

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/

Page 3: Symfony Components Confoo 2010 100310231007 Phpapp02

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

Page 4: Symfony Components Confoo 2010 100310231007 Phpapp02

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

Page 5: Symfony Components Confoo 2010 100310231007 Phpapp02

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

Page 6: Symfony Components Confoo 2010 100310231007 Phpapp02

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

Page 7: Symfony Components Confoo 2010 100310231007 Phpapp02

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

Page 8: Symfony Components Confoo 2010 100310231007 Phpapp02

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

Page 9: Symfony Components Confoo 2010 100310231007 Phpapp02

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

Page 10: Symfony Components Confoo 2010 100310231007 Phpapp02

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

Page 11: Symfony Components Confoo 2010 100310231007 Phpapp02

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/

Page 12: Symfony Components Confoo 2010 100310231007 Phpapp02

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

Page 13: Symfony Components Confoo 2010 100310231007 Phpapp02

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

Page 14: Symfony Components Confoo 2010 100310231007 Phpapp02

8/8/2019 Symfony Components Confoo 2010 100310231007 Phpapp02

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

Page 15: Symfony Components Confoo 2010 100310231007 Phpapp02

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

Page 16: Symfony Components Confoo 2010 100310231007 Phpapp02

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

Page 17: Symfony Components Confoo 2010 100310231007 Phpapp02

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

Page 18: Symfony Components Confoo 2010 100310231007 Phpapp02

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

Page 19: Symfony Components Confoo 2010 100310231007 Phpapp02

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

Page 20: Symfony Components Confoo 2010 100310231007 Phpapp02

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;

Page 21: Symfony Components Confoo 2010 100310231007 Phpapp02

8/8/2019 Symfony Components Confoo 2010 100310231007 Phpapp02

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

Page 22: Symfony Components Confoo 2010 100310231007 Phpapp02

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

Page 23: Symfony Components Confoo 2010 100310231007 Phpapp02

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 '

Page 24: Symfony Components Confoo 2010 100310231007 Phpapp02

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 

Page 25: Symfony Components Confoo 2010 100310231007 Phpapp02

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

Page 26: Symfony Components Confoo 2010 100310231007 Phpapp02

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

Page 27: Symfony Components Confoo 2010 100310231007 Phpapp02

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

Page 28: Symfony Components Confoo 2010 100310231007 Phpapp02

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

Page 29: Symfony Components Confoo 2010 100310231007 Phpapp02

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

Page 30: Symfony Components Confoo 2010 100310231007 Phpapp02

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

Page 31: Symfony Components Confoo 2010 100310231007 Phpapp02

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?

Page 32: Symfony Components Confoo 2010 100310231007 Phpapp02

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?

Page 33: Symfony Components Confoo 2010 100310231007 Phpapp02

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

Page 34: Symfony Components Confoo 2010 100310231007 Phpapp02

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

Page 35: Symfony Components Confoo 2010 100310231007 Phpapp02

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

// ... 

Page 36: Symfony Components Confoo 2010 100310231007 Phpapp02

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 …

Page 37: Symfony Components Confoo 2010 100310231007 Phpapp02

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;

Page 38: Symfony Components Confoo 2010 100310231007 Phpapp02

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

Page 39: Symfony Components Confoo 2010 100310231007 Phpapp02

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…

Page 40: Symfony Components Confoo 2010 100310231007 Phpapp02

8/8/2019 Symfony Components Confoo 2010 100310231007 Phpapp02

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

Page 41: Symfony Components Confoo 2010 100310231007 Phpapp02

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”

Page 42: Symfony Components Confoo 2010 100310231007 Phpapp02

8/8/2019 Symfony Components Confoo 2010 100310231007 Phpapp02

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

Page 43: Symfony Components Confoo 2010 100310231007 Phpapp02

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

Page 44: Symfony Components Confoo 2010 100310231007 Phpapp02

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;

Page 45: Symfony Components Confoo 2010 100310231007 Phpapp02

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']);

Page 46: Symfony Components Confoo 2010 100310231007 Phpapp02

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();

Page 47: Symfony Components Confoo 2010 100310231007 Phpapp02

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);

Page 48: Symfony Components Confoo 2010 100310231007 Phpapp02

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;

Page 49: Symfony Components Confoo 2010 100310231007 Phpapp02

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

}}

Page 50: Symfony Components Confoo 2010 100310231007 Phpapp02

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

Page 51: Symfony Components Confoo 2010 100310231007 Phpapp02

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());

Page 52: Symfony Components Confoo 2010 100310231007 Phpapp02

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>");

Page 53: Symfony Components Confoo 2010 100310231007 Phpapp02

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

Page 54: Symfony Components Confoo 2010 100310231007 Phpapp02

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

Page 55: Symfony Components Confoo 2010 100310231007 Phpapp02

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

Page 56: Symfony Components Confoo 2010 100310231007 Phpapp02

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

Page 57: Symfony Components Confoo 2010 100310231007 Phpapp02

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()

Page 58: Symfony Components Confoo 2010 100310231007 Phpapp02

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 );}

Page 59: Symfony Components Confoo 2010 100310231007 Phpapp02

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

Page 60: Symfony Components Confoo 2010 100310231007 Phpapp02

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

Page 61: Symfony Components Confoo 2010 100310231007 Phpapp02

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

Page 62: Symfony Components Confoo 2010 100310231007 Phpapp02

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

Page 63: Symfony Components Confoo 2010 100310231007 Phpapp02

8/8/2019 Symfony Components Confoo 2010 100310231007 Phpapp02

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

Page 64: Symfony Components Confoo 2010 100310231007 Phpapp02

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

Page 65: Symfony Components Confoo 2010 100310231007 Phpapp02

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>");}

Page 66: Symfony Components Confoo 2010 100310231007 Phpapp02

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

Page 67: Symfony Components Confoo 2010 100310231007 Phpapp02

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

Page 68: Symfony Components Confoo 2010 100310231007 Phpapp02

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

Page 69: Symfony Components Confoo 2010 100310231007 Phpapp02

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;}

Page 70: Symfony Components Confoo 2010 100310231007 Phpapp02

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)

Page 71: Symfony Components Confoo 2010 100310231007 Phpapp02

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);}

Page 72: Symfony Components Confoo 2010 100310231007 Phpapp02

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()

Page 73: Symfony Components Confoo 2010 100310231007 Phpapp02

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

Page 74: Symfony Components Confoo 2010 100310231007 Phpapp02

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(

Page 75: Symfony Components Confoo 2010 100310231007 Phpapp02

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'))

));

Page 76: Symfony Components Confoo 2010 100310231007 Phpapp02

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

Page 77: Symfony Components Confoo 2010 100310231007 Phpapp02

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

Page 78: Symfony Components Confoo 2010 100310231007 Phpapp02

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);

Page 79: Symfony Components Confoo 2010 100310231007 Phpapp02

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());

Page 80: Symfony Components Confoo 2010 100310231007 Phpapp02

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);

Page 81: Symfony Components Confoo 2010 100310231007 Phpapp02

8/8/2019 Symfony Components Confoo 2010 100310231007 Phpapp02

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

Page 82: Symfony Components Confoo 2010 100310231007 Phpapp02

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();

Page 83: Symfony Components Confoo 2010 100310231007 Phpapp02

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

Page 84: Symfony Components Confoo 2010 100310231007 Phpapp02

8/8/2019 Symfony Components Confoo 2010 100310231007 Phpapp02

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

Page 85: Symfony Components Confoo 2010 100310231007 Phpapp02

8/8/2019 Symfony Components Confoo 2010 100310231007 Phpapp02

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

Page 86: Symfony Components Confoo 2010 100310231007 Phpapp02

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

Page 87: Symfony Components Confoo 2010 100310231007 Phpapp02

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

Page 88: Symfony Components Confoo 2010 100310231007 Phpapp02

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

Page 89: Symfony Components Confoo 2010 100310231007 Phpapp02

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

Page 90: Symfony Components Confoo 2010 100310231007 Phpapp02

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

Page 91: Symfony Components Confoo 2010 100310231007 Phpapp02

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;

Page 92: Symfony Components Confoo 2010 100310231007 Phpapp02

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);

(

Page 93: Symfony Components Confoo 2010 100310231007 Phpapp02

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);

Page 94: Symfony Components Confoo 2010 100310231007 Phpapp02

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;

Page 95: Symfony Components Confoo 2010 100310231007 Phpapp02

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']();

( )

Page 96: Symfony Components Confoo 2010 100310231007 Phpapp02

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' =>

Page 97: Symfony Components Confoo 2010 100310231007 Phpapp02

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)

Page 98: Symfony Components Confoo 2010 100310231007 Phpapp02

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.'

Page 99: Symfony Components Confoo 2010 100310231007 Phpapp02

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

Page 100: Symfony Components Confoo 2010 100310231007 Phpapp02

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(

Page 101: Symfony Components Confoo 2010 100310231007 Phpapp02

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

Page 102: Symfony Components Confoo 2010 100310231007 Phpapp02

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;

Page 103: Symfony Components Confoo 2010 100310231007 Phpapp02

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',

Page 104: Symfony Components Confoo 2010 100310231007 Phpapp02

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

Page 105: Symfony Components Confoo 2010 100310231007 Phpapp02

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

Page 106: Symfony Components Confoo 2010 100310231007 Phpapp02

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 }

Page 107: Symfony Components Confoo 2010 100310231007 Phpapp02

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}

Page 108: Symfony Components Confoo 2010 100310231007 Phpapp02

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">

Page 109: Symfony Components Confoo 2010 100310231007 Phpapp02

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>

Page 110: Symfony Components Confoo 2010 100310231007 Phpapp02

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>

Page 111: Symfony Components Confoo 2010 100310231007 Phpapp02

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:

Page 112: Symfony Components Confoo 2010 100310231007 Phpapp02

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 (

Page 113: Symfony Components Confoo 2010 100310231007 Phpapp02

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');

Page 114: Symfony Components Confoo 2010 100310231007 Phpapp02

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

Page 115: Symfony Components Confoo 2010 100310231007 Phpapp02

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

Page 116: Symfony Components Confoo 2010 100310231007 Phpapp02

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;

Page 117: Symfony Components Confoo 2010 100310231007 Phpapp02

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);

Page 118: Symfony Components Confoo 2010 100310231007 Phpapp02

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{// ...

Page 119: Symfony Components Confoo 2010 100310231007 Phpapp02

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'))

Page 120: Symfony Components Confoo 2010 100310231007 Phpapp02

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 ()

Page 121: Symfony Components Confoo 2010 100310231007 Phpapp02

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;};

Page 122: Symfony Components Confoo 2010 100310231007 Phpapp02

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

Page 123: Symfony Components Confoo 2010 100310231007 Phpapp02

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();

Page 124: Symfony Components Confoo 2010 100310231007 Phpapp02

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(

Page 125: Symfony Components Confoo 2010 100310231007 Phpapp02

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',);

Page 126: Symfony Components Confoo 2010 100310231007 Phpapp02

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

Page 127: Symfony Components Confoo 2010 100310231007 Phpapp02

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

Page 128: Symfony Components Confoo 2010 100310231007 Phpapp02

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

Page 129: Symfony Components Confoo 2010 100310231007 Phpapp02

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 />',

Page 130: Symfony Components Confoo 2010 100310231007 Phpapp02

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

Page 131: Symfony Components Confoo 2010 100310231007 Phpapp02

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

Page 132: Symfony Components Confoo 2010 100310231007 Phpapp02

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 />',

Page 133: Symfony Components Confoo 2010 100310231007 Phpapp02

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

Page 134: Symfony Components Confoo 2010 100310231007 Phpapp02

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

Page 135: Symfony Components Confoo 2010 100310231007 Phpapp02

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;

Page 136: Symfony Components Confoo 2010 100310231007 Phpapp02

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;

( (

Page 137: Symfony Components Confoo 2010 100310231007 Phpapp02

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'

Page 138: Symfony Components Confoo 2010 100310231007 Phpapp02

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);

Page 139: Symfony Components Confoo 2010 100310231007 Phpapp02

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

Page 140: Symfony Components Confoo 2010 100310231007 Phpapp02

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 ()

Page 141: Symfony Components Confoo 2010 100310231007 Phpapp02

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;});

Page 142: Symfony Components Confoo 2010 100310231007 Phpapp02

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 '

Page 143: Symfony Components Confoo 2010 100310231007 Phpapp02

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;

Page 144: Symfony Components Confoo 2010 100310231007 Phpapp02

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(

Page 145: Symfony Components Confoo 2010 100310231007 Phpapp02

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 '

Page 146: Symfony Components Confoo 2010 100310231007 Phpapp02

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();

Page 147: Symfony Components Confoo 2010 100310231007 Phpapp02

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

Page 148: Symfony Components Confoo 2010 100310231007 Phpapp02

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/