Slides components en

76
Symfony’s secret weapon Javier López | @loalf Components domingo 27 de noviembre de 11

description

 

Transcript of Slides components en

Page 1: Slides components en

Symfony’s secret weapon

Javier López | @loalf

Components

domingo 27 de noviembre de 11

Page 2: Slides components en

The components

domingo 27 de noviembre de 11

Page 3: Slides components en

The components are a set of standalone,

decoupled and cohesive PHP libraries that solve

common web development problems.

domingo 27 de noviembre de 11

Page 4: Slides components en

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

Page 5: Slides components en

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

Page 6: Slides components en

Installing

domingo 27 de noviembre de 11

Page 7: Slides components en

mkdir ComponentPlayground

cd ComponentPlayground

mkdir vendor

cd vendor

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

domingo 27 de noviembre de 11

Page 8: Slides components en

download

domingo 27 de noviembre de 11

Page 9: Slides components en

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

Page 10: Slides components en

<?php

require_once 'autoload.php';

/*

* Sample code

*/

sample.php

> php sample.php

domingo 27 de noviembre de 11

Page 11: Slides components en

Yaml

domingo 27 de noviembre de 11

Page 12: Slides components en

Parsing and generating YAML files

domingo 27 de noviembre de 11

Page 13: Slides components en

#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

Page 14: Slides components en

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

Page 15: Slides components en

#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

Page 16: Slides components en

Finder

domingo 27 de noviembre de 11

Page 17: Slides components en

Finding files and directories the easy way

domingo 27 de noviembre de 11

Page 18: Slides components en

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

Page 19: Slides components en

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

Page 20: Slides components en

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

Page 21: Slides components en

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

Page 22: Slides components en

use Symfony\Component\Finder\Finder;

$files = Finder::create()

->files()

->in(__DIR__);

just files

domingo 27 de noviembre de 11

Page 23: Slides components en

use Symfony\Component\Finder\Finder;

$files = Finder::create()

->directories()

->in(__DIR__);

just directories

domingo 27 de noviembre de 11

Page 24: Slides components en

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

Page 25: Slides components en

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

Page 26: Slides components en

$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

Page 27: Slides components en

Process

domingo 27 de noviembre de 11

Page 28: Slides components en

Easening command system execution

domingo 27 de noviembre de 11

Page 29: Slides components en

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

Page 30: Slides components en

ping -c 4 twitter.com

domingo 27 de noviembre de 11

Page 31: Slides components en

$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

Page 32: Slides components en

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

Page 33: Slides components en

DomCrawler

domingo 27 de noviembre de 11

Page 34: Slides components en

extracting information from the DOM

domingo 27 de noviembre de 11

Page 35: Slides components en

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

Page 36: Slides components en

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

Page 37: Slides components en

CssSelector

domingo 27 de noviembre de 11

Page 38: Slides components en

CSS Selector => XPath expressions

domingo 27 de noviembre de 11

Page 39: Slides components en

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

Page 40: Slides components en

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

Page 41: Slides components en

Templating

domingo 27 de noviembre de 11

Page 42: Slides components en

A simple and easy template engine

domingo 27 de noviembre de 11

Page 43: Slides components en

4 words

domingo 27 de noviembre de 11

Page 44: Slides components en

Loader: finds a template

domingo 27 de noviembre de 11

Page 45: Slides components en

NameParser: converts templates name to templates objects

domingo 27 de noviembre de 11

Page 46: Slides components en

Engine: renders templates

domingo 27 de noviembre de 11

Page 47: Slides components en

Helpers: adds extra functionality

domingo 27 de noviembre de 11

Page 48: Slides components en

// __DIR__/templates/index.php

<?php echo $name; ?>

A simple example

domingo 27 de noviembre de 11

Page 49: Slides components en

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

Page 50: Slides components en

// __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

Page 51: Slides components en

// __DIR__/templates/index.php

<?php echo $view->extend('layout'); ?>

<p><?php echo $name; ?>

</p>

Inheritance

domingo 27 de noviembre de 11

Page 52: Slides components en

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

Page 53: Slides components en

<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

Page 54: Slides components en

and many more ...

... slots

... global variables

... escaping

... assets managment

... cache

domingo 27 de noviembre de 11

Page 55: Slides components en

Validator

domingo 27 de noviembre de 11

Page 56: Slides components en

asserting variable or object values

domingo 27 de noviembre de 11

Page 57: Slides components en

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

Page 58: Slides components en

24 ValidatorsBlank Max

MinNotBlank

Null

Date

DateTime

True

False

NotNull

Time

Country

Email

Language

Collection

Locale

Url

Image

IP

File

Choice

CallbackSizeType

domingo 27 de noviembre de 11

Page 59: Slides components en

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

Page 60: Slides components en

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

Page 61: Slides components en

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

Page 62: Slides components en

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

Page 63: Slides components en

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

Page 64: Slides components en

# validate.yml

Person:

properties:

name:

- NotBlank : ~

age:

- Min: 18

- Max: 99

Validating an object (YAML)

domingo 27 de noviembre de 11

Page 65: Slides components en

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

Page 66: Slides components en

Console

domingo 27 de noviembre de 11

Page 67: Slides components en

Creating repetive tasks

domingo 27 de noviembre de 11

Page 68: Slides components en

// console.php

use Symfony\Component\Console\Application;

$console = new Application();

$console->run();

The easiest console ever

domingo 27 de noviembre de 11

Page 69: Slides components en

php console.php

domingo 27 de noviembre de 11

Page 70: Slides components en

php console.php help

domingo 27 de noviembre de 11

Page 71: Slides components en

php console.php help list

domingo 27 de noviembre de 11

Page 72: Slides components en

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

Page 73: Slides components en

There is a better way to do it, Command

domingo 27 de noviembre de 11

Page 74: Slides components en

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

Page 75: Slides components en

use Symfony\Component\Console\Application;

$console = new Application();

$console->add(new HelloCommand());

$console->run();

Creating a new command

domingo 27 de noviembre de 11

Page 76: Slides components en

Thanks@loalf

Créditos: http://www.flickr.com/photos/normalityrelief/3075723695/

domingo 27 de noviembre de 11