Guia Basica para bachillerato de Circuitos Basicos
Componentes, el arma secreta de Symfony2
1. #deSymfony Javier López | @loalf
domingo 17 de junio de 12
2. #deSymfony Javier López | @loalf
domingo 17 de junio de 12
3. 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
10. mkdir ComponentsPlayground
cd ComponentsPlayground
mkdir vendor
cd vendor
git clone https://github.com/symfony/symfony
domingo 17 de junio de 12
11. 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
12. ejemplo.php
<?php
require_once 'autoload.php';
/*
* Código del ejemplo
*/
> php ejemplo.php
domingo 17 de junio de 12
20. 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
21. 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^3
domingo 17 de junio de 12
22. 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
23. fijando el nivel de profundidad
use SymfonyComponentFinderFinder;
$files = Finder::create()
->depth(0)
->depth(>1)
->depth(<3)
->in(__DIR__);
domingo 17 de junio de 12
24. buscando sólo archivos
use SymfonyComponentFinderFinder;
$files = Finder::create()
->files()
->in(__DIR__);
domingo 17 de junio de 12
25. buscando sólo directorios
use SymfonyComponentFinderFinder;
$files = Finder::create()
->directories()
->in(__DIR__);
domingo 17 de junio de 12
26. 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
27. 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
30. ¿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
31. ping -c 4 twitter.com
domingo 17 de junio de 12
32. 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
34. Ayuda a validar tanto variables como objetos
domingo 17 de junio de 12
35. 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
36. 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 Callback
domingo 17 de junio de 12
37. 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;
}
ConstraintViolationList
domingo 17 de junio de 12
38. 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ños
domingo 17 de junio de 12
39. 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
40. 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
41. 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ños
domingo 17 de junio de 12
42. Validando un objeto (YAML)
# validate.yml
Person:
properties:
name:
- NotBlank : ~
age:
- Min: 18
- Max: 99
domingo 17 de junio de 12
43. 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
46. Objeto
denormalize normalize
deserialize serialize
Array
encode
decode
Formato (JSON, XML)
domingo 17 de junio de 12
47. 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
48. 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
49. 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
52. La consola más sencilla
// console.php
use SymfonyComponentConsoleApplication;
$console = new Application();
$console->run();
domingo 17 de junio de 12
56. 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
57. Hay una manera mejor de hacerlo, Command
domingo 17 de junio de 12
58. 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
59. Creando un nuevo comando
use SymfonyComponentConsoleApplication;
$console = new Application();
$console->add(new HelloCommand());
$console->run();
domingo 17 de junio de 12
62. Los tests son una excelente documentación
domingo 17 de junio de 12
63. Check it out!
http://github.com:loalf/Sf2ComponentsPlayground.git
domingo 17 de junio de 12
64. 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