An Introduction to Symfony
Upcoming SlideShare
Loading in...5
×
 

Like this? Share it with your network

Share

An Introduction to Symfony

on

  • 1,547 views

An Introduction to Symfony Components and the Symfony2 Framework.

An Introduction to Symfony Components and the Symfony2 Framework.

Statistics

Views

Total Views
1,547
Views on SlideShare
1,533
Embed Views
14

Actions

Likes
0
Downloads
8
Comments
0

1 Embed 14

https://twitter.com 14

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

An Introduction to Symfony Presentation Transcript

  • 1. An Introduction to Christian Zenker @xopn mail@xopn.de
  • 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' ) ; } // ...
  • 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. 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. 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. 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. 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. 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
  • 18. ?Questions?
  • 19. !Thank you for your attention Christian Zenker AOE GmbH http://xopn.de mail@xopn.de Twitter @xopn