An Introduction to
Christian Zenker @xopn mail@xopn.de
Symfony Components
● About 20 stand-alone packages with one specific purpose
● Mostly independent from each other
● Usable...
● YAML is a human-readable data
serialization format like XML or
JSON
YAML Component
user:
name: Homer Simpson
# unsure ab...
Console Component
● Write console programs in PHP
● Clean architecture
● Parses arguments and options
● Easily extensible
...
Console Component (II)
class GreetCommand extends Command {
protected function configure() {
$this
->setName('demo:greet')...
Console Component (III)
// ...
protected function execute(InputInterface $input, OutputInterface $output) {
$name = $input...
Finder Component
http://symfony.com/doc/current/components/finder.html
http://symfony.com/doc/current/components/filesyste...
CssSelector Component
● Converts CSS selectors into Xpath ● Query XML and HTML pages
● Use for simple functional tests
Gou...
Symfony Framework
● an HTTP framework
● MVC framework? Sure, why not.
● Based on Symfony Components
and well-established t...
ClassLoader
Config
Console
DependencyInjection
EventDispatcher
Finder
Form
HttpFoundation
HttpKernel
Intl
Routing
Security...
GET / HTTP/1.1
Host: example.com
Accept: text/html
HTTP/1.1 200 OK
Content-Type: text/html
<!DOCTYPE html>
<p>Hello World<...
GET / HTTP/1.1
HTTP/1.1 200 OK
Application
index.php
Symfony2 Kernel
Routing
Request URI
Controller::action
Request
Object...
GET / HTTP/1.1
HTTP/1.1 200 OK
Application
index.php
Symfony2 Kernel
Routing
Request URI
Controller::action
Request
Object...
Controller
class MainController extends Controller {
public function helloAction($name) {
return $this->render(
'AcmeHello...
Service Container
class AntispamService {
/** doctrine entity manager */
protected $em;
protected $max;
public function __...
Service Container (II)
services:
acme_hello.antispam:
class: AcmeHelloBundleAntispamService
arguments:
- @doctrine.orm.ent...
Further Reading
● symfony.com
– Official homepage with
documentation, etc.
● fabien.potencier.org
– The fancy parts
● sile...
?Questions?
!Thank you for your
attention
Christian Zenker
AOE GmbH
http://xopn.de
mail@xopn.de
Twitter @xopn
Upcoming SlideShare
Loading in...5
×

An Introduction to Symfony

1,453

Published on

An Introduction to Symfony Components and the Symfony2 Framework.

Published in: Technology
0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total Views
1,453
On Slideshare
0
From Embeds
0
Number of Embeds
2
Actions
Shares
0
Downloads
10
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

An Introduction to Symfony

  1. 1. An Introduction to Christian Zenker @xopn mail@xopn.de
  2. 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. 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. 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. 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' ) ; } // ...
  6. 6. Console Component (III) // ... protected function execute(InputInterface $input, OutputInterface $output) { $name = $input->getArgument('name'); if ($name) { $text = 'Hello '.$name; } else { $text = 'Hello'; } if ($input->getOption('yell')) { $text = strtoupper($text); } $output->writeln($text); } } http://symfony.com/doc/current/components/console/introduction.html
  7. 7. Finder Component http://symfony.com/doc/current/components/finder.html http://symfony.com/doc/current/components/filesystem.html ● Simple wrapper for PHP functions ● Exceptions on error ● Batch processing$finder = new Finder(); $iterator = $finder ->files() ->name('*.php') ->depth(0) ->size('>= 1K') ->in(__DIR__); foreach ($iterator as $file) { /** @var SplFileInfo $file */ $file->getRealpath(); } ● Search filesystem or Amazon S3 ● Uses `find` or PHP functions $filesystem = new Filesystem(); $filesystem->mkdir($dirs, 0777); $filesystem->touch($files, time() - 86400); $filesystem->remove($dir); $filesystem->chown($files, $user); $filesystem->symlink($originDir, $targetDir); $filesystem->mirror($originDir,$targetDir); Filesystem Component
  8. 8. CssSelector Component ● Converts CSS selectors into Xpath ● Query XML and HTML pages ● Use for simple functional tests Goutte echo CssSelector::toXPath('div.item > h4 > a'); descendant-or-self::div[contains( concat(' ',normalize-space(@class), ' '), ' item ')]/h4/a https://github.com/fabpot/Goutte http://symfony.com/doc/current/components/css_selector.html $client = new Client(); $crawler = $client->request( 'GET', 'http://example.com' ); $link = $crawler->selectLink('Users')->link(); $crawler = $client->click($link); $users = $crawler->filter('#users > li'); echo count($users) . ' online'; ● CSS is better readable ● Xpath is more powerful
  9. 9. Symfony Framework ● an HTTP framework ● MVC framework? Sure, why not. ● Based on Symfony Components and well-established third-party libraries ● Backwards compatibility starting with 2.3 ● Console powered ● Environment aware (production, development, testing) ● Configuration via YAML, XML, JSON, annotations ● Fast and low memory footprint
  10. 10. ClassLoader Config Console DependencyInjection EventDispatcher Finder Form HttpFoundation HttpKernel Intl Routing Security Validator ... SF Components SwiftMailer Doctrine Monolog Assetic Twig FrameworkBundle SwiftmailerBundle GeneratorBundle DoctrineBundle WebProfiler Bundle AsseticBundle Security Bundle ... ...
  11. 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. 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. 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. 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. 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. 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. 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
  18. 18. ?Questions?
  19. 19. !Thank you for your attention Christian Zenker AOE GmbH http://xopn.de mail@xopn.de Twitter @xopn
  1. A particular slide catching your eye?

    Clipping is a handy way to collect important slides you want to go back to later.

×