Componentes, el arma secreta de Symfony2
-
Upload
javier-lopez -
Category
Technology
-
view
2.735 -
download
2
Transcript of Componentes, el arma secreta de Symfony2
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
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