Slides components en

Post on 16-Jan-2015

1.003 views 0 download

Tags:

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

Email

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