Upload
jesus-solis
View
228
Download
0
Embed Size (px)
Citation preview
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/