componentes, el arma secreta de symfony2

64
Javier López | @loalf #deSymfony domingo 17 de junio de 12

Upload: javier-lopez

Post on 23-Jun-2015

2.731 views

Category:

Technology


2 download

TRANSCRIPT

Page 1: Componentes, el arma secreta de Symfony2

Javier López | @loalf#deSymfony

domingo 17 de junio de 12

Page 2: Componentes, el arma secreta de Symfony2

Javier López | @loalf#deSymfony

domingo 17 de junio de 12

Page 3: Componentes, el arma secreta de Symfony2

Javier López

Nací en Córdoba, España.

Vivo en Londres, Reino Unido.

Trabajo en IPC Media (http://ipcmedia.com).

Escribo (a veces) en mi blog (http://loalf.wordpress.com).

Twitteo como @loalf

... ¿quiéres saber más? http://www.linkedin.com/in/loalf

domingo 17 de junio de 12

Page 4: Componentes, el arma secreta de Symfony2

Los componentes

domingo 17 de junio de 12

Page 5: Componentes, el arma secreta de Symfony2

http://fabien.potencier.org/article/49/what-is-symfony2

domingo 17 de junio de 12

Page 6: Componentes, el arma secreta de Symfony2

Son un conjunto de librerías autónomas,

desacopladas y complementarias que resuelven

problemas comunes del desarrollo web

domingo 17 de junio de 12

Page 7: Componentes, el arma secreta de Symfony2

22 Componentes

Browserkit

EventDispatcher

RoutingClassLoader

Finder

Security

Config

Form

Serializer

Console

HttpFoundation

Templating

CssSelector

HttpKernelTranslation

Locale

DependencyInjection

Validator

DomCrawler

ProcessYaml

Filesystem

domingo 17 de junio de 12

Page 8: Componentes, el arma secreta de Symfony2

22 Componentes

Browserkit

EventDispatcher

RoutingClassLoader

Finder

Security

Config

Form

Serializer

Console

HttpFoundation

Templating

CssSelector

HttpKernelTranslation

Locale

DependencyInjection

Validator

DomCrawler

ProcessYaml

Filesystem

domingo 17 de junio de 12

Page 9: Componentes, el arma secreta de Symfony2

Instalación

domingo 17 de junio de 12

Page 10: Componentes, el arma secreta de Symfony2

mkdir ComponentsPlayground

cd ComponentsPlayground

mkdir vendor

cd vendor

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

domingo 17 de junio de 12

Page 11: Componentes, el arma secreta de Symfony2

<?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 17 de junio de 12

Page 12: Componentes, el arma secreta de Symfony2

<?php

require_once 'autoload.php';

/*

* Código del ejemplo

*/

ejemplo.php

> php ejemplo.php

domingo 17 de junio de 12

Page 13: Componentes, el arma secreta de Symfony2

Yaml

domingo 17 de junio de 12

Page 14: Componentes, el arma secreta de Symfony2

Parsea y genera archivos yml

domingo 17 de junio de 12

Page 15: Componentes, el arma secreta de Symfony2

#example.yml

descripcion: “Usuarios de symfony”usuarios: - nombre: “Javi” apellidos: “López” - nombre: “Raúl” apellidos: “Fraile”

use Symfony\Component\Yaml\Yaml;

$data = Yaml::parse('example.yml');

print $data['descripcion'];

foreach( $data['usuarios'] as $usuario){ print $usuario['nombre'].' '. $usuario['apellidos'];}

parseando archivos YAML

domingo 17 de junio de 12

Page 16: Componentes, el arma secreta de Symfony2

descripcion: “Usuarios de symfony”usuarios: 0: nombre: “Javi” apellidos: “López” 1: nombre: “Raúl” apellidos: “Fraile”

use Symfony\Component\Yaml\Yaml;

$data['descripcion'] = "Usuarios de symfony";

$data['usuarios'][] = array( 'nombre' => 'Javi', 'apellidos' => 'Lopez' );

$data['usuarios'][] = array( 'nombre' => 'Raul', 'apellidos' => 'Fraile' );

print Yaml::dump($data);

generando archivos YAML

domingo 17 de junio de 12

Page 17: Componentes, el arma secreta de Symfony2

#example.yml

generado: <?php echo date(‘d-m-Y’); ?>descripcion: “Usuarios de symfony”usuarios: javi: nombre: “Javi” apellidos: “López” raul: nombre: “Raúl” apellidos: “Fraile”

use Symfony\Component\Yaml\Yaml;

Yaml::enablePhpParsing();

$data = Yaml::parse('example.yml');

print $data['generado'];

YAML & PHP

domingo 17 de junio de 12

Page 18: Componentes, el arma secreta de Symfony2

Finder

domingo 17 de junio de 12

Page 19: Componentes, el arma secreta de Symfony2

Herramienta para encontrar archivos y directorios

domingo 17 de junio de 12

Page 20: Componentes, el arma secreta de Symfony2

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

buscando archivos por nombre

Referencia sobre Patrones Glob: http://cowburn.info/2010/04/30/glob-patterns/

domingo 17 de junio de 12

Page 21: Componentes, el arma secreta de Symfony2

use Symfony\Component\Finder\Finder;

$files = Finder::create()

->size("> 10k")

->size("<= 4mi")

->size("2gi")

->in(__DIR__);

buscando archivos por tamaño

k = 1000m = 1000^2g = 1000^3

ki = 1024mi = 1024^2gi = 1024^3

domingo 17 de junio de 12

Page 22: Componentes, el arma secreta de Symfony2

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

buscando archivos por fecha

Parámetro es cualquier argumento válido para strtotime()

domingo 17 de junio de 12

Page 23: Componentes, el arma secreta de Symfony2

use Symfony\Component\Finder\Finder;

$files = Finder::create()

->depth(0)

->depth(>1)

->depth(<3)

->in(__DIR__);

fijando el nivel de profundidad

domingo 17 de junio de 12

Page 24: Componentes, el arma secreta de Symfony2

use Symfony\Component\Finder\Finder;

$files = Finder::create()

->files()

->in(__DIR__);

buscando sólo archivos

domingo 17 de junio de 12

Page 25: Componentes, el arma secreta de Symfony2

use Symfony\Component\Finder\Finder;

$files = Finder::create()

->directories()

->in(__DIR__);

buscando sólo directorios

domingo 17 de junio de 12

Page 26: Componentes, el arma secreta de Symfony2

use Symfony\Component\Finder\Finder;

$files = Finder::create()

->sortByName()

->sortByType()

->sort( function(\SplFileInfo $file1, \SplFileInfo $file2){ return $file1->getSize() > $file2->getSize(); } ) ->in(__DIR__);

obteniendo un resultado ordenado

domingo 17 de junio de 12

Page 27: Componentes, el arma secreta de Symfony2

use Symfony\Component\Finder\Finder;

$files = Finder::create()

->files()

->depth(0)

->name("*.php")

->in(__DIR__);

archivos php en la carpeta raíz del proyecto

domingo 17 de junio de 12

Page 28: Componentes, el arma secreta de Symfony2

Process

domingo 17 de junio de 12

Page 29: Componentes, el arma secreta de Symfony2

Facilita la ejecución de comandos del sistema

domingo 17 de junio de 12

Page 30: Componentes, el arma secreta de Symfony2

use Symfony\Component\Process\Process;

$process = new Process('ping -c 1 twitter.com');

$process->run();

if($process->isSuccessful()){

print "Twitter esta online";

}else{

print "Twitter esta offline";

}

¿está Twitter online?

domingo 17 de junio de 12

Page 31: Componentes, el arma secreta de Symfony2

ping -c 4 twitter.com

domingo 17 de junio de 12

Page 32: Componentes, el arma secreta de Symfony2

$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 está offline";

}

calculando tiempos medios de respuesta

domingo 17 de junio de 12

Page 33: Componentes, el arma secreta de Symfony2

Validator

domingo 17 de junio de 12

Page 34: Componentes, el arma secreta de Symfony2

Ayuda a validar tanto variables como objetos

domingo 17 de junio de 12

Page 35: Componentes, el arma secreta de Symfony2

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"

}

Validando que un valor sea no nulo

domingo 17 de junio de 12

Page 36: Componentes, el arma secreta de Symfony2

24 ValidadoresBlank Max

MinNotBlank

Null

Date

DateTime

True

False

NotNull

Time

Country

Email

Language

Collection

Locale

Url

Image

IP

File

Choice

CallbackSizeType

domingo 17 de junio de 12

Page 37: Componentes, el arma secreta de Symfony2

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;

}

Usando la clase Validator

ConstraintViolationList

domingo 17 de junio de 12

Page 38: Componentes, el arma secreta de Symfony2

class Person

{

public $name;

public $age;

}

Validando un objeto (PHP)

$name no puede ser una cadena vacía $age deberán ser un número comprendido entre 18 y 99 años

domingo 17 de junio de 12

Page 39: Componentes, el arma secreta de Symfony2

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

Validando un objeto (PHP)

domingo 17 de junio de 12

Page 40: Componentes, el arma secreta de Symfony2

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

}

}

Validando un objeto (PHP)

domingo 17 de junio de 12

Page 41: Componentes, el arma secreta de Symfony2

class Person

{

public $name;

public $age;

}

Validando un objeto (YAML)

$name no puede ser una cadena vacía $age deberán ser un número comprendido entre 18 y 99 años

domingo 17 de junio de 12

Page 42: Componentes, el arma secreta de Symfony2

# validate.yml

Person:

properties:

name:

- NotBlank : ~

age:

- Min: 18

- Max: 99

Validando un objeto (YAML)

domingo 17 de junio de 12

Page 43: Componentes, el arma secreta de Symfony2

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

Validando un objeto (YAML)

domingo 17 de junio de 12

Page 44: Componentes, el arma secreta de Symfony2

Serializer

domingo 17 de junio de 12

Page 45: Componentes, el arma secreta de Symfony2

Cuando todo es un array

domingo 17 de junio de 12

Page 46: Componentes, el arma secreta de Symfony2

Formato (JSON, XML)

Array

Objeto

normalizedenormalize

encodedecode

serializedeserialize

domingo 17 de junio de 12

Page 47: Componentes, el arma secreta de Symfony2

class Person{  private $age;  private $name;

public function getName()  {    return $this->name;  }  public function getAge()  {    return $this->age;  }  public function setName($name)  {    $this->name = $name;  }  public function setAge($age)  {    $this->age = $age;  }}

Serializando un objeto

domingo 17 de junio de 12

Page 48: Componentes, el arma secreta de Symfony2

use Symfony\Component\Serializer\Serializer;use Symfony\Component\Serializer\Encoder\XmlEncoder;use Symfony\Component\Serializer\Encoder\JsonEncoder;use Symfony\Component\Serializer\Normalizer\GetSetMethodNormalizer;

$person = new Person(19, 'Javi');

$encoders = array(new XmlEncoder(), new JsonEncoder() );

$normalizers = array(new GetSetMethodNormalizer());

$serializer = new Serializer($normalizers, $encoders);

$serializer->serialize($person, 'json');// {"name":"Javi","age":19}

Serializando un objeto

domingo 17 de junio de 12

Page 49: Componentes, el arma secreta de Symfony2

data = <<<EOF<person>  <name>Javi</name>  <age>19</age></person>EOF;

$person = $serializer->deserialize($data,'Person','xml');

Deserializando un objeto

domingo 17 de junio de 12

Page 50: Componentes, el arma secreta de Symfony2

Console

domingo 17 de junio de 12

Page 51: Componentes, el arma secreta de Symfony2

Facilita la creación de tareas repetitivas

domingo 17 de junio de 12

Page 52: Componentes, el arma secreta de Symfony2

// console.php

use Symfony\Component\Console\Application;

$console = new Application();

$console->run();

La consola más sencilla

domingo 17 de junio de 12

Page 53: Componentes, el arma secreta de Symfony2

php console.php

domingo 17 de junio de 12

Page 54: Componentes, el arma secreta de Symfony2

php console.php help

domingo 17 de junio de 12

Page 55: Componentes, el arma secreta de Symfony2

php console.php help list

domingo 17 de junio de 12

Page 56: Componentes, el arma secreta de Symfony2

use Symfony\Component\Console\Application;

use Symfony\Component\Console\Input\InputArgument;

$console = new Application();

$console

->register('hello')

->setDefinition(array(

new InputArgument('name', InputArgument::REQUIRED, 'Nombre'),

))

->setDescription('Saluda a una persona')

->setCode(function ($input, $output) {

$name = $input->getArgument('name');

$output->writeln(sprintf('Hola <info>%s</info>', $name));

})

;

$console->run();

Hola mundo ... para consolas

domingo 17 de junio de 12

Page 57: Componentes, el arma secreta de Symfony2

Hay una manera mejor de hacerlo, Command

domingo 17 de junio de 12

Page 58: Componentes, el arma secreta de Symfony2

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, 'Nombre'), )) $this->setDescription('Saluda a una persona') }

public function execute($input, $output) { $name = $input->getArgument('name'); $output->writeln(sprintf('Hola <info>%s</info>', $name)); }}

Creando un nuevo comando

domingo 17 de junio de 12

Page 59: Componentes, el arma secreta de Symfony2

use Symfony\Component\Console\Application;

$console = new Application();

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

$console->run();

Creando un nuevo comando

domingo 17 de junio de 12

Page 60: Componentes, el arma secreta de Symfony2

Antes de irme

domingo 17 de junio de 12

Page 61: Componentes, el arma secreta de Symfony2

Divide y vencerás

domingo 17 de junio de 12

Page 62: Componentes, el arma secreta de Symfony2

Los tests son una excelente documentación

domingo 17 de junio de 12

Page 63: Componentes, el arma secreta de Symfony2

Check it out!http://github.com:loalf/Sf2ComponentsPlayground.git

domingo 17 de junio de 12

Page 64: Componentes, el arma secreta de Symfony2

Gracias@loalf

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

IPC Media está reclutando, búscame si estás pensando en mudarte a Londres

domingo 17 de junio de 12