• Share
  • Email
  • Embed
  • Like
  • Save
  • Private Content
Componentes, el arma secreta de Symfony2
 

Componentes, el arma secreta de Symfony2

on

  • 2,759 views

 

Statistics

Views

Total Views
2,759
Views on SlideShare
1,534
Embed Views
1,225

Actions

Likes
0
Downloads
62
Comments
0

14 Embeds 1,225

http://www.symfony.es 640
http://desymfony.com 439
http://www.desymfony.com 60
http://desymfony.es 27
https://twitter.com 15
http://librosweb.es 13
http://symfony.es 13
http://www.desymfony.es 8
http://desymfony.eu 4
http://www.desymfony.eu 2
http://desymfony.es. 1
http://desymfony.local 1
http://translate.googleusercontent.com 1
https://www.google.com.mx 1
More...

Accessibility

Categories

Upload Details

Uploaded via as Adobe PDF

Usage Rights

© All Rights Reserved

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Processing…
Post Comment
Edit your comment

    Componentes, el arma secreta de Symfony2 Componentes, el arma secreta de Symfony2 Presentation Transcript

    • #deSymfony Javier López | @loalfdomingo 17 de junio de 12
    • #deSymfony Javier López | @loalfdomingo 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/loalfdomingo 17 de junio de 12
    • Los componentesdomingo 17 de junio de 12
    • http://fabien.potencier.org/article/49/what-is-symfony2domingo 17 de junio de 12
    • Son un conjunto de librerías autónomas, desacopladas y complementarias que resuelven problemas comunes del desarrollo webdomingo 17 de junio de 12
    • 22 Componentes EventDispatcher Validator Browserkit ClassLoader Routing HttpFoundation Filesystem Finder DependencyInjection Config Security Console CssSelector Locale Translation Form DomCrawler HttpKernel Yaml Serializer Process Templatingdomingo 17 de junio de 12
    • 22 Componentes EventDispatcher Validator Browserkit ClassLoader Routing HttpFoundation Filesystem Finder DependencyInjection Config Security Console CssSelector Locale Translation Form DomCrawler HttpKernel Yaml Serializer Process Templatingdomingo 17 de junio de 12
    • Instalacióndomingo 17 de junio de 12
    • mkdir ComponentsPlayground cd ComponentsPlayground mkdir vendor cd vendor git clone https://github.com/symfony/symfonydomingo 17 de junio de 12
    • autoload.php <?php require_once __DIR__./vendor/symfony/src/Symfony/Component/ ClassLoader/UniversalClassLoader.php; use SymfonyComponentClassLoaderUniversalClassLoader; $loader = new UniversalClassLoader(); $loader->registerNamespaces(array( Symfony => __DIR__./vendor/symfony/src, )); $loader->register();domingo 17 de junio de 12
    • ejemplo.php <?php require_once autoload.php; /* * Código del ejemplo */ > php ejemplo.phpdomingo 17 de junio de 12
    • Yamldomingo 17 de junio de 12
    • Parsea y genera archivos ymldomingo 17 de junio de 12
    • parseando archivos YAML #example.yml use SymfonyComponentYamlYaml; descripcion: “Usuarios de symfony” $data = Yaml::parse(example.yml); usuarios: - print $data[descripcion]; nombre: “Javi” apellidos: “López” foreach( $data[usuarios] as $usuario) - { nombre: “Raúl” print $usuario[nombre]. . apellidos: “Fraile” $usuario[apellidos]; }domingo 17 de junio de 12
    • generando archivos YAML use SymfonyComponentYamlYaml; $data[descripcion] = "Usuarios de symfony"; descripcion: “Usuarios de symfony” $data[usuarios][] = array( usuarios: nombre => Javi, 0: apellidos => Lopez nombre: “Javi” ); apellidos: “López” 1: $data[usuarios][] = array( nombre: “Raúl” nombre => Raul, apellidos: “Fraile” apellidos => Fraile ); print Yaml::dump($data);domingo 17 de junio de 12
    • YAML & PHP #example.yml generado: <?php echo date(‘d-m-Y’); ?> use SymfonyComponentYamlYaml; descripcion: “Usuarios de symfony” usuarios: Yaml::enablePhpParsing(); javi: nombre: “Javi” $data = Yaml::parse(example.yml); apellidos: “López” raul: print $data[generado]; nombre: “Raúl” apellidos: “Fraile”domingo 17 de junio de 12
    • Finderdomingo 17 de junio de 12
    • Herramienta para encontrar archivos y directoriosdomingo 17 de junio de 12
    • buscando archivos por nombre use SymfonyComponentFinderFinder; $files = Finder::create() ->name("*.php") ->name("*.{php,yml}") ->name("/.(php|yml)$/") ->name("/^w{3,10}$/") ->name("foo.php") ->in(__DIR__); Referencia sobre Patrones Glob: http://cowburn.info/2010/04/30/glob-patterns/domingo 17 de junio de 12
    • buscando archivos por tamaño use SymfonyComponentFinderFinder; $files = Finder::create() ->size("> 10k") ->size("<= 4mi") ->size("2gi") ->in(__DIR__); k = 1000 ki = 1024 m = 1000^2 mi = 1024^2 g = 1000^3 gi = 1024^3domingo 17 de junio de 12
    • buscando archivos por fecha use SymfonyComponentFinderFinder; $files = Finder::create() ->date("since yesterday") ->date("until 2 days ago") ->date("> now - 2 hours") ->date(">= 2005-10-15 ") ->in(__DIR__); Parámetro es cualquier argumento válido para strtotime()domingo 17 de junio de 12
    • fijando el nivel de profundidad use SymfonyComponentFinderFinder; $files = Finder::create() ->depth(0) ->depth(>1) ->depth(<3) ->in(__DIR__);domingo 17 de junio de 12
    • buscando sólo archivos use SymfonyComponentFinderFinder; $files = Finder::create() ->files() ->in(__DIR__);domingo 17 de junio de 12
    • buscando sólo directorios use SymfonyComponentFinderFinder; $files = Finder::create() ->directories() ->in(__DIR__);domingo 17 de junio de 12
    • obteniendo un resultado ordenado use SymfonyComponentFinderFinder; $files = Finder::create() ->sortByName() ->sortByType() ->sort( function(SplFileInfo $file1, SplFileInfo $file2){ return $file1->getSize() > $file2->getSize(); } ) ->in(__DIR__);domingo 17 de junio de 12
    • archivos php en la carpeta raíz del proyecto use SymfonyComponentFinderFinder; $files = Finder::create() ->files() ->depth(0) ->name("*.php") ->in(__DIR__);domingo 17 de junio de 12
    • Processdomingo 17 de junio de 12
    • Facilita la ejecución de comandos del sistemadomingo 17 de junio de 12
    • ¿está Twitter online? use SymfonyComponentProcessProcess; $process = new Process(ping -c 1 twitter.com); $process->run(); if($process->isSuccessful()){ print "Twitter esta online"; }else{ print "Twitter esta offline"; }domingo 17 de junio de 12
    • ping -c 4 twitter.comdomingo 17 de junio de 12
    • calculando tiempos medios de respuesta $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"; }domingo 17 de junio de 12
    • Validatordomingo 17 de junio de 12
    • Ayuda a validar tanto variables como objetosdomingo 17 de junio de 12
    • Validando que un valor sea no nulo use SymfonyComponentValidatorConstraintsNotNull; use SymfonyComponentValidatorConstraintsNotNullValidator; $validator = new NotNullValidator(); if(!$validator->isValid(null, new NotNull())) { print $validator->getMessageTemplate(); // "The value should not be null" }domingo 17 de junio de 12
    • 24 Validadores Blank Max Date NotBlank Min Time Null Url DateTime NotNull Email Locale True IP Language False File Country Choice Image Collection Type Size Callbackdomingo 17 de junio de 12
    • Usando la clase Validator use SymfonyComponentValidatorValidator; use SymfonyComponentValidatorConstraintValidatorFactory; use SymfonyComponentValidatorMappingBlackholeMetadataFactory; use SymfonyComponentValidatorConstraints as Asserts; $validator = new Validator( new BlackholeMetadataFactory, new ConstraintValidatorFactory ); $errors = $validator->validateValue(, new AssertsNotBlank()); if($errors->count()) { print $errors; } ConstraintViolationListdomingo 17 de junio de 12
    • Validando un objeto (PHP) class Person { public $name; public $age; } $name no puede ser una cadena vacía $age deberán ser un número comprendido entre 18 y 99 añosdomingo 17 de junio de 12
    • Validando un objeto (PHP) use SymfonyComponentValidatorValidator; use SymfonyComponentValidatorConstraintValidatorFactory; use SymfonyComponentValidatorMappingClassMetadataFactory; use SymfonyComponentValidatorMappingLoaderStaticMethodLoader; $validator = new Validator( new ClassMetadataFactory(new StaticMethodLoader() ), new ConstraintValidatorFactory() ); $person = new Person(); $errors = $validator->validate($person);domingo 17 de junio de 12
    • Validando un objeto (PHP) use SymfonyComponentValidatorMappingClassMetadata; use SymfonyComponentValidatorConstraint as Asserts; class Person { public $name; public $age; static function loadValidatorMetadata(ClassMetadata $metadata) { $metadata ->addPropertyConstraint(name, new AssertsNotBlank()) ->addPropertyConstraint(age , new AssertsMin(18)); ->addPropertyConstraint(age , new AssertsMax(99)); } }domingo 17 de junio de 12
    • Validando un objeto (YAML) class Person { public $name; public $age; } $name no puede ser una cadena vacía $age deberán ser un número comprendido entre 18 y 99 añosdomingo 17 de junio de 12
    • Validando un objeto (YAML) # validate.yml Person: properties: name: - NotBlank : ~ age: - Min: 18 - Max: 99domingo 17 de junio de 12
    • Validando un objeto (YAML) use SymfonyComponentValidatorValidator; use SymfonyComponentValidatorConstraintValidatorFactory; use SymfonyComponentValidatorMappingClassMetadataFactory; use SymfonyComponentValidatorMappingLoaderYamlFileLoader; $validator = new Validator( new ClassMetadataFactory( new YamlFileLoader(__DIR__./validate.yml) ), new ConstraintValidatorFactory() ); $person = new Person(); $errors = $validator->validate($person);domingo 17 de junio de 12
    • Serializerdomingo 17 de junio de 12
    • Cuando todo es un arraydomingo 17 de junio de 12
    • Objeto denormalize normalize deserialize serialize Array encode decode Formato (JSON, XML)domingo 17 de junio de 12
    • Serializando un objeto 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;   } }domingo 17 de junio de 12
    • Serializando un objeto use SymfonyComponentSerializerSerializer; use SymfonyComponentSerializerEncoderXmlEncoder; use SymfonyComponentSerializerEncoderJsonEncoder; use SymfonyComponentSerializerNormalizerGetSetMethodNormalizer; $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}domingo 17 de junio de 12
    • Deserializando un objeto data = <<<EOF <person>   <name>Javi</name>   <age>19</age> </person> EOF; $person = $serializer->deserialize($data,Person,xml);domingo 17 de junio de 12
    • Consoledomingo 17 de junio de 12
    • Facilita la creación de tareas repetitivasdomingo 17 de junio de 12
    • La consola más sencilla // console.php use SymfonyComponentConsoleApplication; $console = new Application(); $console->run();domingo 17 de junio de 12
    • php console.phpdomingo 17 de junio de 12
    • php console.php helpdomingo 17 de junio de 12
    • php console.php help listdomingo 17 de junio de 12
    • Hola mundo ... para consolas use SymfonyComponentConsoleApplication; use SymfonyComponentConsoleInputInputArgument; $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();domingo 17 de junio de 12
    • Hay una manera mejor de hacerlo, Commanddomingo 17 de junio de 12
    • Creando un nuevo comando use SymfonyComponentConsoleCommandCommand; use SymfonyComponentConsoleInputInputArgument; 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)); } }domingo 17 de junio de 12
    • Creando un nuevo comando use SymfonyComponentConsoleApplication; $console = new Application(); $console->add(new HelloCommand()); $console->run();domingo 17 de junio de 12
    • Antes de irmedomingo 17 de junio de 12
    • Divide y vencerásdomingo 17 de junio de 12
    • Los tests son una excelente documentacióndomingo 17 de junio de 12
    • Check it out! http://github.com:loalf/Sf2ComponentsPlayground.gitdomingo 17 de junio de 12
    • Gracias @loalf IPC Media está reclutando, búscame si estás pensando en mudarte a Londres Créditos: http://www.flickr.com/photos/normalityrelief/3075723695/domingo 17 de junio de 12