Slides components en
-
Upload
javier-lopez -
Category
Technology
-
view
1.003 -
download
0
description
Transcript of Slides components en
Symfony’s secret weapon
Javier López | @loalf
Components
domingo 27 de noviembre de 11
The components
domingo 27 de noviembre de 11
The components are a set of standalone,
decoupled and cohesive PHP libraries that solve
common web development problems.
domingo 27 de noviembre de 11
21 Components
Browserkit EventDispatcher
RoutingClassLoader
Finder
Security
Config
Form
Serializer
Console
HttpFoundation
Templating
CssSelector
HttpKernel
Translation
Locale
DependencyInjection
Validator
DomCrawler
Process
Yaml
domingo 27 de noviembre de 11
21 Components
Browserkit EventDispatcher
RoutingClassLoader
Finder
Security
Config
Form
Serializer
Console
HttpFoundation
Templating
CssSelector
HttpKernel
Translation
Locale
DependencyInjection
Validator
DomCrawler
Process
Yaml
domingo 27 de noviembre de 11
Installing
domingo 27 de noviembre de 11
mkdir ComponentPlayground
cd ComponentPlayground
mkdir vendor
cd vendor
git clone https://github.com/symfony/symfony
domingo 27 de noviembre de 11
download
domingo 27 de noviembre de 11
<?php
require_once __DIR__.'/vendor/symfony/src/Symfony/Component/ClassLoader/UniversalClassLoader.php';
use Symfony\Component\ClassLoader\UniversalClassLoader;
$loader = new UniversalClassLoader();$loader->registerNamespaces(array( 'Symfony' => __DIR__.'/vendor/symfony/src',));
$loader->register();
autoload.php
domingo 27 de noviembre de 11
<?php
require_once 'autoload.php';
/*
* Sample code
*/
sample.php
> php sample.php
domingo 27 de noviembre de 11
Yaml
domingo 27 de noviembre de 11
Parsing and generating YAML files
domingo 27 de noviembre de 11
#example.yml
description: “Users of Symfony”users: javi: name: “Javi” surname: “López” rob: name: “Rob” surname: “Waring”
use Symfony\Component\Yaml\Yaml;
$data = Yaml::parse('example.yml');
print $data['description'];
foreach( $data['users'] as $user){ print $user['name'] .' '. $user['surname'];}
parsing YAML files
domingo 27 de noviembre de 11
description: “Symfony users”users: 0: name: “Javi” surname: “López” 1: name: “Rob” surname: “Waring”
use Symfony\Component\Yaml\Yaml;
$data['description'] = "Symfony Users”
$data['users'][] = array( 'name' => 'Javi', 'surname' => 'Lopez' );
$data['users'][] = array( 'name' => 'Rob', 'surname' => 'Waring' );
print Yaml::dump($data);
generating YAML files
domingo 27 de noviembre de 11
#example.yml
generated: <?php echo date(‘Y’); ?>description: “Users of Symfony”users: javi: name: “Javi” surname: “López” rob: name: “Rob” surname: “Waring”
use Symfony\Component\Yaml\Yaml;
Yaml::enablePhpParsing();
$data = Yaml::parse('example.yml');
print $data['generated'];
YAML & PHP
domingo 27 de noviembre de 11
Finder
domingo 27 de noviembre de 11
Finding files and directories the easy way
domingo 27 de noviembre de 11
use Symfony\Component\Finder\Finder;
$files = Finder::create()
->name("*.php")
->name("*.{php,yml}")
->name("/\.(php|yml)$/")
->name("/^\w{3,10}$/")
->name("foo.php")
->in(__DIR__);
finding by name
Referencia sobre Patrones Glob: http://cowburn.info/2010/04/30/glob-patterns/
domingo 27 de noviembre de 11
use Symfony\Component\Finder\Finder;
$files = Finder::create()
->size("> 10k")
->size("<= 4mi")
->size("2gi")
->in(__DIR__);
finding by size
k = 1000m = 1000^2g = 1000^3
ki = 1024mi = 1024^2gi = 1024^3
domingo 27 de noviembre de 11
use Symfony\Component\Finder\Finder;
$files = Finder::create()
->date("since yesterday")
->date("until 2 days ago")
->date("> now - 2 hours")
->date(">= 2005-10-15 ")
->in(__DIR__);
finding by date
Every parameter valid to strtotime()
domingo 27 de noviembre de 11
use Symfony\Component\Finder\Finder;
$files = Finder::create()
->depth(0)
->depth(>1)
->depth(<3)
->in(__DIR__);
fixing the depth
domingo 27 de noviembre de 11
use Symfony\Component\Finder\Finder;
$files = Finder::create()
->files()
->in(__DIR__);
just files
domingo 27 de noviembre de 11
use Symfony\Component\Finder\Finder;
$files = Finder::create()
->directories()
->in(__DIR__);
just directories
domingo 27 de noviembre de 11
use Symfony\Component\Finder\Finder;
$files = Finder::create()
->sortByName()
->sortByType()
->sort( function(\SplFileInfo $file1, \SplFileInfo $file2){ return $file1->getSize() > $file2->getSize(); } ) ->in(__DIR__);
sorting
domingo 27 de noviembre de 11
use Symfony\Component\Finder\Finder;
$files = Finder::create()
->files()
->depth(0)
->name("*.php")
->in(__DIR__);
php files in the project root directory
domingo 27 de noviembre de 11
$s3 = new \Zend_Service_Amazon_S3($key, $secret);
$s3->registerStreamWrapper("s3");
$files = Finder::create()
->name('*.{jpg,jpeg,png,gif}')
->size('< 100K')
->date('since 1 hour ago')
->in('s3://bucket-name');
images in Amazon S3
domingo 27 de noviembre de 11
Process
domingo 27 de noviembre de 11
Easening command system execution
domingo 27 de noviembre de 11
use Symfony\Component\Process\Process;
$process = new Process('ping -c 1 twitter.com');
$process->run();
if($process->isSuccessful()){
print "Twitter is online";
}else{
print "Twitter is offline";
}
Is Twitter online?
domingo 27 de noviembre de 11
ping -c 4 twitter.com
domingo 27 de noviembre de 11
$process = new Process('ping -c 4 twitter.com');
$process->run();
if($process->isSuccessful())
{
$output = $process->getOutput();
$pattern = '/time=(\d+\.\d+) ms/';
preg_match_all($pattern, $output, $matches);
$average = array_sum($matches[1])/count($matches[1]);
printf("Avergage time=%.3f ms", $average);
}else{
print "Twitter is offline";
}
showing the average time
domingo 27 de noviembre de 11
use Symfony\Component\Process\Process;
$process = new Process('ping -c 4 twitter.com');
$process->run(function($type, $buffer) {
if('out' === $type){
$pattern = '/time=(\d+\.\d+) ms/';
if(preg_match_all($pattern, $buffer, $matches)){;
print $matches[0][0]."\n";
}
}elseif( 'err' === $type ){
print "Twitter is offline";
}
});
showing just the time
domingo 27 de noviembre de 11
DomCrawler
domingo 27 de noviembre de 11
extracting information from the DOM
domingo 27 de noviembre de 11
use Symfony\Component\DomCrawler\Crawler;
$uri = 'http://search.twitter.com/search.atom?q=symfony2';
$crawler = new Crawler();
$content = file_get_contents($uri);
$crawler->addXmlContent($content);
foreach($crawler->filterXpath('//content') as $node)
{
print $node->nodeValue;
}
Twitter search
domingo 27 de noviembre de 11
use Symfony\Component\DomCrawler\Crawler;
$uri = 'http://symfony.com/blog';
$content = file_get_contents($uri);
$crawler = new Crawler($content, $uri);
$nodes = $crawler->filterXPath('//div[@class="box_article"]//a');
foreach($nodes->links() as $link)
{
print $link->getUri();
}
Symfony.com blog posts
domingo 27 de noviembre de 11
CssSelector
domingo 27 de noviembre de 11
CSS Selector => XPath expressions
domingo 27 de noviembre de 11
use Symfony\Component\CssSelector\CssSelector;
print CssSelector::toXPath('div.box_article a');
/*
* descendant-or-self::div[
* contains(
* concat(' ', normalize- space(@class), ' '),
* ' box_article '
* )
* ]/descendant::a
*/
from CSS to XPath
domingo 27 de noviembre de 11
use Symfony\Component\DomCrawler\Crawler;
$uri = 'http://symfony.com/blog';$content = file_get_contents($uri);
$crawler = new Crawler($content, $uri);
$nodes = $crawler->filter('div.box_article a');
Symfony.com blog posts
domingo 27 de noviembre de 11
Templating
domingo 27 de noviembre de 11
A simple and easy template engine
domingo 27 de noviembre de 11
4 words
domingo 27 de noviembre de 11
Loader: finds a template
domingo 27 de noviembre de 11
NameParser: converts templates name to templates objects
domingo 27 de noviembre de 11
Engine: renders templates
domingo 27 de noviembre de 11
Helpers: adds extra functionality
domingo 27 de noviembre de 11
// __DIR__/templates/index.php
<?php echo $name; ?>
A simple example
domingo 27 de noviembre de 11
use Symfony\Component\Templating\Loader\FilesystemLoader;
use Symfony\Component\Templating\PhpEngine;
use Symfony\Component\Templating\TemplateNameParser;
$loader = new FilesystemLoader(
array(__DIR__.'/templates/%name%.php')
);
$parser = new TemplateNameParser();
$engine = new PhpEngine($parser, $loader);
echo $engine->render('index', array('name' => 'Javi'));
A simple example
domingo 27 de noviembre de 11
// __DIR__/templates/layout.php
<div id="header">
<h1>Cabecera</h1>
</div>
<div id="content">
<?php echo $view['slots']->get('_content'); ?>
</div>
<div id="footer">
<p>Pie</p>
</div>
Inheritance
domingo 27 de noviembre de 11
// __DIR__/templates/index.php
<?php echo $view->extend('layout'); ?>
<p><?php echo $name; ?>
</p>
Inheritance
domingo 27 de noviembre de 11
use Symfony\Component\Templating\Helper\SlotsHelper;
$loader = new FilesystemLoader(
array(__DIR__.'/templates/%name%.php')
);
$parser = new TemplateNameParser();
$engine = new PhpEngine($parser, $loader, new SlotsHelper());
echo $engine->render('index', array('name' => 'Javi'));
Inheritance
domingo 27 de noviembre de 11
<div id="header">
<h1>Cabecera</h1>
</div>
<div id="content">
<p>Javi</p>
</div>
<div id="footer">
<p>Pie</p>
</div>
Inheritance
domingo 27 de noviembre de 11
and many more ...
... slots
... global variables
... escaping
... assets managment
... cache
domingo 27 de noviembre de 11
Validator
domingo 27 de noviembre de 11
asserting variable or object values
domingo 27 de noviembre de 11
use Symfony\Component\Validator\Constraints\NotNull;
use Symfony\Component\Validator\Constraints\NotNullValidator;
$validator = new NotNullValidator();
if(!$validator->isValid(null, new NotNull()))
{
print $validator->getMessageTemplate();
// "The value should not be null"
}
Validating a value is not null
domingo 27 de noviembre de 11
24 ValidatorsBlank Max
MinNotBlank
Null
Date
DateTime
True
False
NotNull
Time
Country
Language
Collection
Locale
Url
Image
IP
File
Choice
CallbackSizeType
domingo 27 de noviembre de 11
use Symfony\Component\Validator\Validator;
use Symfony\Component\Validator\ConstraintValidatorFactory;
use Symfony\Component\Validator\Mapping\BlackholeMetadataFactory;
use Symfony\Component\Validator\Constraints as Asserts;
$validator = new Validator(
new BlackholeMetadataFactory,
new ConstraintValidatorFactory
);
$errors = $validator->validateValue('', new Asserts\NotBlank());
if($errors->count())
{
print $errors;
}
Using the Validator service
ConstraintViolationList
domingo 27 de noviembre de 11
class Person
{
public $name;
public $age;
}
Validando un objeto (PHP)
$name must not be empty $age must be a number between 18 and 99
domingo 27 de noviembre de 11
use Symfony\Component\Validator\Validator;
use Symfony\Component\Validator\ConstraintValidatorFactory;
use Symfony\Component\Validator\Mapping\ClassMetadataFactory;
use Symfony\Component\Validator\Mapping\Loader\StaticMethodLoader;
$validator = new Validator(
new ClassMetadataFactory(new StaticMethodLoader() ),
new ConstraintValidatorFactory()
);
$person = new Person();
$errors = $validator->validate($person);
Validating an object (PHP)
domingo 27 de noviembre de 11
use Symfony\Component\Validator\Mapping\ClassMetadata;
use Symfony\Component\Validator\Constraint as Asserts;
class Person
{
public $name;
public $age;
static function loadValidatorMetadata(ClassMetadata $metadata)
{
$metadata
->addPropertyConstraint('name', new Asserts\NotBlank())
->addPropertyConstraint('age' , new Asserts\Min(18));
->addPropertyConstraint('age' , new Asserts\Max(99));
}
}
Validating an object (PHP)
domingo 27 de noviembre de 11
class Person
{
public $name;
public $age;
}
Validando un objeto (YAML)
$name must not be empty $age must be a number between 18 and 99
domingo 27 de noviembre de 11
# validate.yml
Person:
properties:
name:
- NotBlank : ~
age:
- Min: 18
- Max: 99
Validating an object (YAML)
domingo 27 de noviembre de 11
use Symfony\Component\Validator\Validator;
use Symfony\Component\Validator\ConstraintValidatorFactory;
use Symfony\Component\Validator\Mapping\ClassMetadataFactory;
use Symfony\Component\Validator\Mapping\Loader\YamlFileLoader;
$validator = new Validator(
new ClassMetadataFactory(
new YamlFileLoader(__DIR__.'/validate.yml')
),
new ConstraintValidatorFactory()
);
$person = new Person();
$errors = $validator->validate($person);
Validating an object (YAML)
domingo 27 de noviembre de 11
Console
domingo 27 de noviembre de 11
Creating repetive tasks
domingo 27 de noviembre de 11
// console.php
use Symfony\Component\Console\Application;
$console = new Application();
$console->run();
The easiest console ever
domingo 27 de noviembre de 11
php console.php
domingo 27 de noviembre de 11
php console.php help
domingo 27 de noviembre de 11
php console.php help list
domingo 27 de noviembre de 11
use Symfony\Component\Console\Application;
use Symfony\Component\Console\Input\InputArgument;
$console = new Application();
$console
->register('hello')
->setDefinition(array(
new InputArgument('name', InputArgument::REQUIRED, 'Name'),
))
->setDescription('It says hello to a person')
->setCode(function ($input, $output) {
$name = $input->getArgument('name');
$output->writeln(sprintf('Hello <info>%s</info>', $name));
})
;
$console->run();
Hello World ... for consoles
domingo 27 de noviembre de 11
There is a better way to do it, Command
domingo 27 de noviembre de 11
use Symfony\Component\Console\Command\Command;use Symfony\Component\Console\Input\InputArgument;
class HelloCommand extends Command{ public function configure() { $this->setName('hello'); $this->setDefinition(array( new InputArgument('name', InputArgument::REQUIRED, 'Name'), )) $this->setDescription('Say hello to a person') }
public function execute($input, $output) { $name = $input->getArgument('name'); $output->writeln(sprintf('Hello <info>%s</info>', $name)); }}
Creating a new command
domingo 27 de noviembre de 11
use Symfony\Component\Console\Application;
$console = new Application();
$console->add(new HelloCommand());
$console->run();
Creating a new command
domingo 27 de noviembre de 11
Thanks@loalf
Créditos: http://www.flickr.com/photos/normalityrelief/3075723695/
domingo 27 de noviembre de 11