componentes, el arma secreta de symfony2

Post on 23-Jun-2015

2.732 Views

Category:

Technology

2 Downloads

Preview:

Click to see full reader

TRANSCRIPT

Javier López | @loalf#deSymfony

domingo 17 de junio de 12

Javier López | @loalf#deSymfony

domingo 17 de junio de 12

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

Los componentes

domingo 17 de junio de 12

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

domingo 17 de junio de 12

Son un conjunto de librerías autónomas,

desacopladas y complementarias que resuelven

problemas comunes del desarrollo web

domingo 17 de junio de 12

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

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

Instalación

domingo 17 de junio de 12

mkdir ComponentsPlayground

cd ComponentsPlayground

mkdir vendor

cd vendor

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

domingo 17 de junio de 12

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

<?php

require_once 'autoload.php';

/*

* Código del ejemplo

*/

ejemplo.php

> php ejemplo.php

domingo 17 de junio de 12

Yaml

domingo 17 de junio de 12

Parsea y genera archivos yml

domingo 17 de junio de 12

#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

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

#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

Finder

domingo 17 de junio de 12

Herramienta para encontrar archivos y directorios

domingo 17 de junio de 12

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

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

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

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

use Symfony\Component\Finder\Finder;

$files = Finder::create()

->files()

->in(__DIR__);

buscando sólo archivos

domingo 17 de junio de 12

use Symfony\Component\Finder\Finder;

$files = Finder::create()

->directories()

->in(__DIR__);

buscando sólo directorios

domingo 17 de junio de 12

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

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

Process

domingo 17 de junio de 12

Facilita la ejecución de comandos del sistema

domingo 17 de junio de 12

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

ping -c 4 twitter.com

domingo 17 de junio de 12

$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

Validator

domingo 17 de junio de 12

Ayuda a validar tanto variables como objetos

domingo 17 de junio de 12

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

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

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

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

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

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

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

# validate.yml

Person:

properties:

name:

- NotBlank : ~

age:

- Min: 18

- Max: 99

Validando un objeto (YAML)

domingo 17 de junio de 12

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

Serializer

domingo 17 de junio de 12

Cuando todo es un array

domingo 17 de junio de 12

Formato (JSON, XML)

Array

Objeto

normalizedenormalize

encodedecode

serializedeserialize

domingo 17 de junio de 12

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

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

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

Console

domingo 17 de junio de 12

Facilita la creación de tareas repetitivas

domingo 17 de junio de 12

// console.php

use Symfony\Component\Console\Application;

$console = new Application();

$console->run();

La consola más sencilla

domingo 17 de junio de 12

php console.php

domingo 17 de junio de 12

php console.php help

domingo 17 de junio de 12

php console.php help list

domingo 17 de junio de 12

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

Hay una manera mejor de hacerlo, Command

domingo 17 de junio de 12

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

use Symfony\Component\Console\Application;

$console = new Application();

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

$console->run();

Creando un nuevo comando

domingo 17 de junio de 12

Antes de irme

domingo 17 de junio de 12

Divide y vencerás

domingo 17 de junio de 12

Los tests son una excelente documentación

domingo 17 de junio de 12

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

domingo 17 de junio de 12

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

top related