3. The components are a set of standalone,
decoupled and cohesive PHP libraries that solve
common web development problems.
domingo 27 de noviembre de 11
4. 21 Components
Browserkit EventDispatcher Security
ClassLoader Routing HttpFoundation
Finder DependencyInjection Config
Console CssSelector Locale
Form DomCrawler HttpKernel
Serializer Process Templating
Yaml Validator Translation
domingo 27 de noviembre de 11
5. 21 Components
Browserkit EventDispatcher Security
ClassLoader Routing HttpFoundation
Finder DependencyInjection Config
Console CssSelector Locale
Form DomCrawler HttpKernel
Serializer Process Templating
Yaml Validator Translation
domingo 27 de noviembre de 11
9. 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 27 de noviembre de 11
10. sample.php
<?php
require_once 'autoload.php';
/*
* Sample code
*/
> php sample.php
domingo 27 de noviembre de 11
17. Finding files and directories the easy way
domingo 27 de noviembre de 11
18. finding by name
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 27 de noviembre de 11
19. finding by size
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 27 de noviembre de 11
20. finding by date
use SymfonyComponentFinderFinder;
$files = Finder::create()
->date("since yesterday")
->date("until 2 days ago")
->date("> now - 2 hours")
->date(">= 2005-10-15 ")
->in(__DIR__);
Every parameter valid to strtotime()
domingo 27 de noviembre de 11
21. fixing the depth
use SymfonyComponentFinderFinder;
$files = Finder::create()
->depth(0)
->depth(>1)
->depth(<3)
->in(__DIR__);
domingo 27 de noviembre de 11
22. just files
use SymfonyComponentFinderFinder;
$files = Finder::create()
->files()
->in(__DIR__);
domingo 27 de noviembre de 11
23. just directories
use SymfonyComponentFinderFinder;
$files = Finder::create()
->directories()
->in(__DIR__);
domingo 27 de noviembre de 11
24. sorting
use SymfonyComponentFinderFinder;
$files = Finder::create()
->sortByName()
->sortByType()
->sort(
function(SplFileInfo $file1, SplFileInfo $file2){
return $file1->getSize() > $file2->getSize();
}
)
->in(__DIR__);
domingo 27 de noviembre de 11
25. php files in the project root directory
use SymfonyComponentFinderFinder;
$files = Finder::create()
->files()
->depth(0)
->name("*.php")
->in(__DIR__);
domingo 27 de noviembre de 11
26. images in Amazon S3
$s3 = new Zend_Service_Amazon_S3($key, $secret);
$s3->registerStreamWrapper("s3");
$files = Finder::create()
->name('*.{jpg,jpeg,png,gif}')
->size('< 100K')
->date('since 1 hour ago')
->in('s3://bucket-name');
domingo 27 de noviembre de 11
29. Is Twitter online?
use SymfonyComponentProcessProcess;
$process = new Process('ping -c 1 twitter.com');
$process->run();
if($process->isSuccessful()){
print "Twitter is online";
}else{
print "Twitter is offline";
}
domingo 27 de noviembre de 11
30. ping -c 4 twitter.com
domingo 27 de noviembre de 11
31. showing the average time
$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 is offline";
}
domingo 27 de noviembre de 11
32. showing just the time
use SymfonyComponentProcessProcess;
$process = new Process('ping -c 4 twitter.com');
$process->run(function($type, $buffer) {
if('out' === $type){
$pattern = '/time=(d+.d+) ms/';
if(preg_match_all($pattern, $buffer, $matches)){;
print $matches[0][0]."n";
}
}elseif( 'err' === $type ){
print "Twitter is offline";
}
});
domingo 27 de noviembre de 11
35. Twitter search
use SymfonyComponentDomCrawlerCrawler;
$uri = 'http://search.twitter.com/search.atom?q=symfony2';
$crawler = new Crawler();
$content = file_get_contents($uri);
$crawler->addXmlContent($content);
foreach($crawler->filterXpath('//content') as $node)
{
print $node->nodeValue;
}
domingo 27 de noviembre de 11
36. Symfony.com blog posts
use SymfonyComponentDomCrawlerCrawler;
$uri = 'http://symfony.com/blog';
$content = file_get_contents($uri);
$crawler = new Crawler($content, $uri);
$nodes = $crawler->filterXPath('//div[@class="box_article"]//a');
foreach($nodes->links() as $link)
{
print $link->getUri();
}
domingo 27 de noviembre de 11
38. CSS Selector => XPath expressions
domingo 27 de noviembre de 11
39. from CSS to XPath
use SymfonyComponentCssSelectorCssSelector;
print CssSelector::toXPath('div.box_article a');
/*
* descendant-or-self::div[
* contains(
* concat(' ', normalize- space(@class), ' '),
* ' box_article '
* )
* ]/descendant::a
*/
domingo 27 de noviembre de 11
40. Symfony.com blog posts
use SymfonyComponentDomCrawlerCrawler;
$uri = 'http://symfony.com/blog';
$content = file_get_contents($uri);
$crawler = new Crawler($content, $uri);
$nodes = $crawler->filter('div.box_article a');
domingo 27 de noviembre de 11
48. A simple example
// __DIR__/templates/index.php
<?php echo $name; ?>
domingo 27 de noviembre de 11
49. A simple example
use SymfonyComponentTemplatingLoaderFilesystemLoader;
use SymfonyComponentTemplatingPhpEngine;
use SymfonyComponentTemplatingTemplateNameParser;
$loader = new FilesystemLoader(
array(__DIR__.'/templates/%name%.php')
);
$parser = new TemplateNameParser();
$engine = new PhpEngine($parser, $loader);
echo $engine->render('index', array('name' => 'Javi'));
domingo 27 de noviembre de 11
50. Inheritance
// __DIR__/templates/layout.php
<div id="header">
<h1>Cabecera</h1>
</div>
<div id="content">
<?php echo $view['slots']->get('_content'); ?>
</div>
<div id="footer">
<p>Pie</p>
</div>
domingo 27 de noviembre de 11
51. Inheritance
// __DIR__/templates/index.php
<?php echo $view->extend('layout'); ?>
<p>
<?php echo $name; ?>
</p>
domingo 27 de noviembre de 11
52. Inheritance
use SymfonyComponentTemplatingHelperSlotsHelper;
$loader = new FilesystemLoader(
array(__DIR__.'/templates/%name%.php')
);
$parser = new TemplateNameParser();
$engine = new PhpEngine($parser, $loader, new SlotsHelper());
echo $engine->render('index', array('name' => 'Javi'));
domingo 27 de noviembre de 11
53. Inheritance
<div id="header">
<h1>Cabecera</h1>
</div>
<div id="content">
<p>Javi</p>
</div>
<div id="footer">
<p>Pie</p>
</div>
domingo 27 de noviembre de 11
54. and many more ...
... slots
... global variables
... escaping
... assets managment
... cache
domingo 27 de noviembre de 11
57. Validating a value is not null
use SymfonyComponentValidatorConstraintsNotNull;
use SymfonyComponentValidatorConstraintsNotNullValidator;
$validator = new NotNullValidator();
if(!$validator->isValid(null, new NotNull()))
{
print $validator->getMessageTemplate();
// "The value should not be null"
}
domingo 27 de noviembre de 11
58. 24 Validators
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 27 de noviembre de 11
59. Using the Validator service
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 27 de noviembre de 11
60. Validando un objeto (PHP)
class Person
{
public $name;
public $age;
}
$name must not be empty
$age must be a number between 18 and 99
domingo 27 de noviembre de 11
61. Validating an object (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 27 de noviembre de 11
62. Validating an object (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 27 de noviembre de 11
63. Validando un objeto (YAML)
class Person
{
public $name;
public $age;
}
$name must not be empty
$age must be a number between 18 and 99
domingo 27 de noviembre de 11
64. Validating an object (YAML)
# validate.yml
Person:
properties:
name:
- NotBlank : ~
age:
- Min: 18
- Max: 99
domingo 27 de noviembre de 11
65. Validating an object (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 27 de noviembre de 11
68. The easiest console ever
// console.php
use SymfonyComponentConsoleApplication;
$console = new Application();
$console->run();
domingo 27 de noviembre de 11
72. Hello World ... for consoles
use SymfonyComponentConsoleApplication;
use SymfonyComponentConsoleInputInputArgument;
$console = new Application();
$console
->register('hello')
->setDefinition(array(
new InputArgument('name', InputArgument::REQUIRED, 'Name'),
))
->setDescription('It says hello to a person')
->setCode(function ($input, $output) {
$name = $input->getArgument('name');
$output->writeln(sprintf('Hello <info>%s</info>', $name));
})
;
$console->run();
domingo 27 de noviembre de 11
73. There is a better way to do it, Command
domingo 27 de noviembre de 11
74. Creating a new command
use SymfonyComponentConsoleCommandCommand;
use SymfonyComponentConsoleInputInputArgument;
class HelloCommand extends Command
{
public function configure()
{
$this->setName('hello');
$this->setDefinition(array(
new InputArgument('name', InputArgument::REQUIRED, 'Name'),
))
$this->setDescription('Say hello to a person')
}
public function execute($input, $output)
{
$name = $input->getArgument('name');
$output->writeln(sprintf('Hello <info>%s</info>', $name));
}
}
domingo 27 de noviembre de 11
75. Creating a new command
use SymfonyComponentConsoleApplication;
$console = new Application();
$console->add(new HelloCommand());
$console->run();
domingo 27 de noviembre de 11
76. Thanks
@loalf
Créditos: http://www.flickr.com/photos/normalityrelief/3075723695/
domingo 27 de noviembre de 11