2. Symfony Components
● About 20 stand-alone packages with one specific purpose
● Mostly independent from each other
● Usable in almost any PHP project
● Unit tested and well documented
http://symfony.com/components
3. ● YAML is a human-readable data
serialization format like XML or
JSON
YAML Component
user:
name: Homer Simpson
# unsure about age
age: 40
kids: ["Bart", "Lisa", "Maggie"]
quotes:
- |
Operator! Give me the
number for 911!
- |
Internet? Is that thing
still around?"
http://symfony.com/doc/current/components/console/introduction.html
$yaml =
file_get_contents('users.yml');
$parser = new Parser();
$data = $parser->parse($yaml);
$data['user']['wife'] = 'Marge';
$dumper = new Dumper();
$yaml = $dumper->dump($data, 2);
file_put_contents(
'users.yml', $data
);
4. Console Component
● Write console programs in PHP
● Clean architecture
● Parses arguments and options
● Easily extensible
● Helpers for
– progress bars
– tabular data
– interactive questions
– colored output
me@home> php console.php demo:hello John
Hello John
me@home> php console.php demo:hello
What's your name? John
Hello John
me@home> php sandwich.php make
What? Make it yourself!
me@home> php sandwich.php make --force
Ok.
[=======>---------] 42%
5. Console Component (II)
class GreetCommand extends Command {
protected function configure() {
$this
->setName('demo:greet')
->setDescription('Greet someone')
->addArgument(
'name',
InputArgument::OPTIONAL,
'Who do you want to greet?'
)
->addOption(
'yell',
null,
InputOption::VALUE_NONE,
'If set, the task will yell in uppercase letters'
)
;
}
// ...
11. GET / HTTP/1.1
Host: example.com
Accept: text/html
HTTP/1.1 200 OK
Content-Type: text/html
<!DOCTYPE html>
<p>Hello World</p>
Browser
12. GET / HTTP/1.1
HTTP/1.1 200 OK
Application
index.php
Symfony2 Kernel
Routing
Request URI
Controller::action
Request
Object
Response
Object
13. GET / HTTP/1.1
HTTP/1.1 200 OK
Application
index.php
Symfony2 Kernel
Routing
Request URI
Controller::action
Request
Object
Response
Object
Firewall
Caching
Event Handling
14. Controller
class MainController extends Controller {
public function helloAction($name) {
return $this->render(
'AcmeHelloBundle:Main:hello.html.twig',
array('name' => $name)
);
}
}
hello:
path: /hello/{name}
defaults:
_controller: AcmeHelloBundle:Main:hello
http://example.com/hello/world
<!DOCTYPE html>
<h1>Hello {{ name }}!</h1>
<p>Also see our
<a href="{{ path('route_name') }}">
other pages
</a>
</p>
<ul>
{% for i in 0..10 if i %2 == 0 %}
<li>{{ i }} is an even number</li>
{% endfor %}
</ul>
15. Service Container
class AntispamService {
/** doctrine entity manager */
protected $em;
protected $max;
public function __construct($em, $max) {
$this->em = $em;
$this->max = $max
}
public function isCommentSpam($string) {
$words = explode(' ', $string);
$dql = 'SELECT w FROM AcmeHelloBundle:Word WHERE w.word IN (?)';
$query = $this->em->createQuery($dql);
$query->setParameter(0, $words);
$blackWords = $query->execute();
return count($blackWords) > $this->max;
}
}
16. Service Container (II)
services:
acme_hello.antispam:
class: AcmeHelloBundleAntispamService
arguments:
- @doctrine.orm.entity_manager
- %max_blacklist_words%
public function indexAction($comment) {
$service = $this->get('acme_hello.antispam');
if($service->isCommentSpam()) {
$response = new Response();
$response->setStatusCode('403');
$response->setContent('Get off my lawn');
return $response;
}
// ... do something ...
}
17. Further Reading
● symfony.com
– Official homepage with
documentation, etc.
● fabien.potencier.org
– The fancy parts
● silex.sensiolabs.org
– Microframework (the missing link
between Components and
Framework)
● knpbundles.com
– Database with additional bundles
– StofDoctrineExtensionsBundle
– LiipImagineBundle
– FOQElasticaBundle
– DoctrineFixturesBundle