SlideShare una empresa de Scribd logo
1 de 51
Descargar para leer sin conexión
Symfony
components in
     the wild	
   Jakub Zalas
Who am I?	


o  Remembers symfony 1.0
   (2007)	
o  Open Source contributor	
o  BDD advocate	
o  Works at Sensio Labs UK	
o  ZCE & Sensio Labs           o  Twitter: @jakub_zalas	
   Certi"ed Symfony            o  Blog: http://zalas.eu	
   Developer	
                 o  Github: @jakzal
What is Symfony?	

                                  First, Symfony2 is a reusable set 	
                            of standalone, decoupled, and cohesive 	
                                          PHP components 	
                  that solve common web development problems.	


                          Then, based on these components, 	
                      Symfony2 is also a full-stack web framework.	

http://www.sxc.hu/photo/1197009                          http://fabien.potencier.org/article/49/what-is-symfony2
Why does it matter?	




                           * 76% of statistics found on the Internet is made up

http://www.sxc.hu/photo/1223174
Reinventing the wheel	




http://flic.kr/p/Mu9m2
Maintenance hell	




http://www.sxc.hu/photo/1005333
Symfony components	

   HttpFoundation	
                                 Console	
              Validator	
        Form	

   Routing	
                 HttpKernel	
                                       OptionsResolver	
                                                           CssSelector	
       DependencyInjection	
                     BrowserKit	
     DomCrawler	
            Translation	
  EventDispatcher	
                                                                 Security	
              Locale	
                                            Templating	
        Filesystem	
                                                                              Con"g	
  Process	
                  Finder	
           ClassLoader	
                                Yaml	
                                                                       Serializer	
http://www.sxc.hu/photo/338038
HttpFoundation	




http://www.sxc.hu/photo/1212545
use SymfonyComponentHttpFoundationRequest;	
use SymfonyComponentHttpFoundationResponse;	
	
$request = Request::createFromGlobals();	

$name = $request->query->get('name', 'PHPNW');	
$message = "Hello $name!";	

$response = new Response($message, 200);	
$response->headers->set('X-REQUEST-NAME', $name);	
$response->headers->setCookie(new Cookie('phpnw', $name));	

$response->send();
use SymfonyComponentHttpFoundationRequest;	
use SymfonyComponentHttpFoundationResponse;	
	
$request = Request::createFromGlobals();	

$name = $request->query->get('name', 'PHPNW');	
$message = "Hello $name!";	
                                   	
                                   $request->request	
$response = new Response($message, 200);	
                                   $request->query	
$response->headers->set('X-REQUEST-NAME', $name);	
                                   $request->server	
$response->headers->setCookie(new Cookie('phpnw', $name));	
                                   $request->files	
$response->send();	
               $request->cookies	
                                   $request->headers	
                                   $request->attributes
$request = Request::createFromGlobals();	
$session = $request->getSession();	

if ($session->has('referrer')) {	
    $referrer = $session->get('referrer');	

      return new RedirectResponse($referrer);	
}	

if ($session->hasFlash('notice')) {	
    return new Response($session->getFlash('notice'));	
} else {	
    $session->setFlash('notice', 'Hello again!');	

      return new Response('Foo')	
}
$request = Request::createFromGlobals();	
$date = getPageUpdatedAtById($request->query->get('id'));	

$response = new Response();	
$response->setPublic();	
$response->setLastModified($date);	

if ($response->isNotModified($request)) {	
    return $response;	
}	

// else do heavy processing to render the page
How to check if a request is made over ssl?	

•  is there HTTPS in the server vars? is it 'on' or '1'?	
•  or is there SSL_HTTPS header? is it 'on' or '1'?	
•  or is there X_FORWARDED_PROTO header set to 'https'	

if ($request->isSecure()) {	
    // we're fine
}
Routing	




http://www.sxc.hu/photo/1070609
use SymfonyComponentRoutingRouteCollection;	
use SymfonyComponentRoutingRoute;	

$routes = new RouteCollection();	

$routes->add('hello', new Route('/hello/{name}', array(	
    'controller' => 'HelloController'	
)));	

$routes->add('homepage', new Route('/', array(	
    'controller' => 'HomepageController'	
)));
use SymfonyComponentRoutingMatcherUrlMatcher;	
use SymfonyComponentRoutingRequestContext;	

$matcher = new UrlMatcher($routes, new RequestContext());	

$parameters = $matcher->match('/');	

var_dump($parameters);	
// array(	
//     'controller' => 'HomepageController', 	
//     '_route' => 'homepage'	
// )
use SymfonyComponentRoutingMatcherUrlMatcher;	
use SymfonyComponentRoutingRequestContext;	

$matcher = new UrlMatcher($routes, new RequestContext());	

$parameters = $matcher->match('/hello/PHPNW');	

var_dump($parameters);	
// array(	
//     'controller' => 'HelloController', 	
//     'name' => 'PHPNW',	
//     '_route' => 'hello'	
// )
use SymfonyComponentRoutingMatcherUrlMatcher;	
use SymfonyComponentRoutingRequestContext;	
  $routes->add('hello', new Route('/hello/{name}', array(	
$matcher = new UrlMatcher($routes, new RequestContext());	
      'controller' => 'HelloController'	
  )));	
  	
$parameters = $matcher->match('/hello/PHPNW');	

var_dump($parameters);	
// array(	
//     'controller' => 'HelloController', 	
//     'name' => 'PHPNW',	
//     '_route' => 'hello'	
// )
$routes = new RouteCollection();	
$routes->add('hello', new Route(	
      '/hello/{name}',	
      array('controller' => 'HelloController'),	
      array('name' => '^[a-zA-Z]+$')	
));	

$matcher = new UrlMatcher($routes, new RequestContext());	

$parameters = $matcher->match('/hello/PHPNW');	

var_dump($parameters);	
// array(	
//     'controller' => 'HelloController', 	
//     'name' => 'PHPNW',	
//     '_route' => 'hello'	
// )
use SymfonyComponentRoutingException;	

$routes = new RouteCollection();	
$routes->add('hello', new Route(	
      '/hello/{name}',	
      array('controller' => 'HelloController'),	
      array('name' => '^[a-zA-Z]+$')	
));	

$matcher = new UrlMatcher($routes, new RequestContext());	

try {	
    $matcher->match('/hello/PHPNW12');	
} catch (ExceptionResourceNotFoundException $exception) {	
    die('Resource not found');	
}
use SymfonyComponentRoutingGeneratorUrlGenerator;	

$generator = new UrlGenerator(	
     $routes, new RequestContext()	
);	

// "/hello/PHPNW"	
$url = $generator->generate(	
     'hello', array('name' => 'PHPNW')	
);	

// "http://localhost/hello/PHPNW"	
$url = $generator->generate(	
     'hello', array('name' => 'PHPNW'), true	
);
EventDispatcher	




http://www.sxc.hu/photo/715294
use SymfonyComponentEventDispatcherEventDispatcher;	
use SymfonyComponentEventDispatcherEvent;	

$dispatcher = new EventDispatcher();	

$dispatcher->addListener(	
     'received_hello',	
     function (Event $event) {	
         printf("Hello from listener 1!n");	
     }	
);	
$dispatcher->addListener(	
     'received_hello', 	
     function (Event $event) {	
         printf("Hello from listener 2!n");	
     }	
);
printf("Hello!n");	
$dispatcher->dispatch('received_hello', new Event());	




               Hello!	
               Hello from listener 1!	
               Hello from listener 2!
$dispatcher = new EventDispatcher();	

$dispatcher->addListener(	
     'received_hello',	
     function (Event $event) {	
          printf("Hello from listener 1!n");	
     },	
     0	
);	

$dispatcher->addListener(	
     'received_hello', 	
     function (Event $event) {	
          printf("Hello from listener 2!n");	
     },	
     10	
);
printf("Hello!n");	
$dispatcher->dispatch('received_hello', new Event());	




               Hello!	
               Hello from listener 2!	
               Hello from listener 1!
$dispatcher = new EventDispatcher();	

$dispatcher->addListener(	
    'received_hello',	
    function (Event $event) {	
        printf("Hello from listener 1!n");	

             $event->stopPropagation();	
       }	
);	

$dispatcher->addListener(	
     'received_hello', 	
     function (Event $event) {	
         printf("Hello from listener 2!n");	
     }	
);
printf("Hello!n");	
$dispatcher->dispatch('received_hello', new Event());	




               Hello!	
               Hello from listener 1!
$app = new SilexApplication();	

$app->after(	
     function (Request $request, Response $response) {	
         // http://phpnw.dev/?hello=1	
         if ($request->query->get('hello') === '1') {	
             $content = str_replace(	
                  '</body>', 	
                  'Hello!!</body>',	
                  $response->getContent()	
             );	
             $response->setContent($content);	
         }	
     }	
);
// Silex/src/Silex/Application.php:304	

public function after($callback, $priority = 0)	
{	
    $this['dispatcher']->addListener(	
         SilexEvents::AFTER, 	
         function (FilterResponseEvent $event)	
           use ($callback) {	
               call_user_func(	
                    $callback, 	
                    $event->getRequest(),	
                    $event->getResponse()	
               );	
         }, 	
         $priority	
    );	
}
// Silex/src/Silex/Application.php:603	

$this['dispatcher']->dispatch(SilexEvents::AFTER, $event);
HttpKernel	




http://www.sxc.hu/photo/835732
$resolver = new ControllerResolver();	
$httpKernel = new HttpKernel($dispatcher, $resolver);	
$request = Request::create('/hello/PHPNW')	
$response = $httpKernel->handle($request);	

echo $response;	

     HTTP/1.0 200 OK	
     Cache-Control: no-cache	
     Date:          Sat, 06 Oct 2012 14:32:14 GMT	
     	
     Hello PHPNW
$matcher = new UrlMatcher($routes, new RequestContext());	

$dispatcher = new EventDispatcher();	
$dispatcher->addListener(	
     KernelEvents::REQUEST, 	
     function (GetResponseEvent $event) use ($matcher) {	
         $request = $event->getRequest();	
         $pathInfo = $request->getPathInfo();	
         // array contains '_controler', 'name', '_route'	
         $parameters = $matcher->match($pathInfo);	
         $request->attributes->add($parameters);	
     }	
);
use SymfonyComponentRoutingRouteCollection;	
use SymfonyComponentRoutingRoute;	

$routes = new RouteCollection();	

$routes->add('hello', new Route('/hello/{name}', array(	
    '_controller' => 'PhpnwController::hello'	
)));	

$routes->add('homepage', new Route('/', array(	
    '_controller' => 'PhpnwController::homepage'	
)));
use SymfonyComponentHttpFoundationRequest;	
use SymfonyComponentHttpFoundationResponse;	

class PhpnwController	
{	
    public function hello(Request $request, $name)	
    {	
        return new Response('Hello '.$name.PHP_EOL);	
    }	

      public function homepage(Request $request)	
      {	
          return new Response('Home sweet home'.PHP_EOL);	
      }	
}
$response = $httpKernel->handle(Request::create('/bye'));	



PHP Fatal error: Uncaught exception 'SymfonyComponent
RoutingExceptionResourceNotFoundException' in /home/
vagrant/Projects/WildComponents/vendor/symfony/routing/
Symfony/Component/Routing/Matcher/UrlMatcher.php:81
$dispatcher->addListener(	
     KernelEvents::EXCEPTION, 	
     function (GetResponseForExceptionEvent $event) {	
          $message = $event->getException()->getMessage();	
          $response = new Response($message, 404);	
          $event->setResponse($response);	
     }	
);	
       HTTP/1.0 404 Not Found	
       Cache-Control: no-cache	
       Date:           Sat, 06 Oct 2012 09:01:02 GMT	
       	
       Unable to find the controller for path "/bye".
       Maybe you forgot to add the matching route in
       your routing configuration?
Console	




http://www.sxc.hu/photo/910912
use SymfonyComponentConsoleCommandCommand;	
use SymfonyComponentConsoleInputInputInterface;	
use SymfonyComponentConsoleOutputOutputInterface;	

class HelloCommand extends Command	
{	
    public function configure()	
    {	
        // configure the command [...]	
    }	

        protected function execute(InputInterface $input,
      OutputInterface $output)	
        {	
            // put your code here [...]	
        }	
}
public function configure()	
{	
    $this->setDescription('Outputs welcome message[...]');	
    $this->setHelp('Outputs welcome message.');	
    $this->addArgument(	
         'name', 	
         InputArgument::OPTIONAL, 	
         'The name to output to the screen', 	
         'World'	
    );	
}
$application = new Application('Demo', '1.0.0');	
$application->add(new HelloCommand('hello'));	
$application->run();
protected function execute(InputInterface $input, 	
    OutputInterface $output)	
{	
          $name = $input->getArgument('name');	

            $output->writeln(sprintf('Hello %s!', $name));	
      }	
}
public function configure()	
{	
    // [...]	

      $this->addOption(	
           'more', 	
           'm', 	
           InputOption::VALUE_NONE, 	
           'Tell me more'	
      );	
}
protected function execute(InputInterface $input, 	
    OutputInterface $output)	
{	
          $name = $input->getArgument('name');	

           $output->writeln(sprintf('Hello %s!', $name));	

            if ($input->getOption('more')) {	
                $output->writeln('It is really nice to meet
      you!');	
            }	
        }	
}
How to start?	

   // composer.json	
   {	
             "require": {	
                       "symfony/http-foundation": "2.1.2"	
             }	
   }	

   curl -s https://getcomposer.org/installer | php	
   php composer.phar install	

http://www.sxc.hu/photo/1092493
Why Symfony?	


 •  Good code covered by tests	
 •  Flexible	
 •  Secure	
 •  Stable API (@api annotation)	
 •  Long term support	
 •  Outstanding community	
 •  Wide adoption
Thank you!	



                                          Rate my talk:	
                                       https://joind.in/6945	




                                              Interested in training? 	
               We're introducing Symfony Components trainings soon:
                 http://www.sensiolabs.co.uk/training/symfony2.html

Más contenido relacionado

La actualidad más candente

Speed up your developments with Symfony2
Speed up your developments with Symfony2Speed up your developments with Symfony2
Speed up your developments with Symfony2
Hugo Hamon
 
Beyond symfony 1.2 (Symfony Camp 2008)
Beyond symfony 1.2 (Symfony Camp 2008)Beyond symfony 1.2 (Symfony Camp 2008)
Beyond symfony 1.2 (Symfony Camp 2008)
Fabien Potencier
 
Dependency Injection IPC 201
Dependency Injection IPC 201Dependency Injection IPC 201
Dependency Injection IPC 201
Fabien Potencier
 
Introducing Assetic (NYPHP)
Introducing Assetic (NYPHP)Introducing Assetic (NYPHP)
Introducing Assetic (NYPHP)
Kris Wallsmith
 
Doctrine fixtures
Doctrine fixturesDoctrine fixtures
Doctrine fixtures
Bill Chang
 
Symfony 2 (PHP Quebec 2009)
Symfony 2 (PHP Quebec 2009)Symfony 2 (PHP Quebec 2009)
Symfony 2 (PHP Quebec 2009)
Fabien Potencier
 
Dealing with Continuous Data Processing, ConFoo 2012
Dealing with Continuous Data Processing, ConFoo 2012Dealing with Continuous Data Processing, ConFoo 2012
Dealing with Continuous Data Processing, ConFoo 2012
Michael Peacock
 

La actualidad más candente (20)

Doctrine MongoDB ODM (PDXPHP)
Doctrine MongoDB ODM (PDXPHP)Doctrine MongoDB ODM (PDXPHP)
Doctrine MongoDB ODM (PDXPHP)
 
Speed up your developments with Symfony2
Speed up your developments with Symfony2Speed up your developments with Symfony2
Speed up your developments with Symfony2
 
The Zen of Lithium
The Zen of LithiumThe Zen of Lithium
The Zen of Lithium
 
Design how your objects talk through mocking
Design how your objects talk through mockingDesign how your objects talk through mocking
Design how your objects talk through mocking
 
The Origin of Lithium
The Origin of LithiumThe Origin of Lithium
The Origin of Lithium
 
Beyond symfony 1.2 (Symfony Camp 2008)
Beyond symfony 1.2 (Symfony Camp 2008)Beyond symfony 1.2 (Symfony Camp 2008)
Beyond symfony 1.2 (Symfony Camp 2008)
 
Dependency Injection IPC 201
Dependency Injection IPC 201Dependency Injection IPC 201
Dependency Injection IPC 201
 
Symfony2, creare bundle e valore per il cliente
Symfony2, creare bundle e valore per il clienteSymfony2, creare bundle e valore per il cliente
Symfony2, creare bundle e valore per il cliente
 
Introducing Assetic (NYPHP)
Introducing Assetic (NYPHP)Introducing Assetic (NYPHP)
Introducing Assetic (NYPHP)
 
PHP 5.3 and Lithium: the most rad php framework
PHP 5.3 and Lithium: the most rad php frameworkPHP 5.3 and Lithium: the most rad php framework
PHP 5.3 and Lithium: the most rad php framework
 
Symfony2 - WebExpo 2010
Symfony2 - WebExpo 2010Symfony2 - WebExpo 2010
Symfony2 - WebExpo 2010
 
Doctrine fixtures
Doctrine fixturesDoctrine fixtures
Doctrine fixtures
 
Electrify your code with PHP Generators
Electrify your code with PHP GeneratorsElectrify your code with PHP Generators
Electrify your code with PHP Generators
 
Building Lithium Apps
Building Lithium AppsBuilding Lithium Apps
Building Lithium Apps
 
Rich domain model with symfony 2.5 and doctrine 2.5
Rich domain model with symfony 2.5 and doctrine 2.5Rich domain model with symfony 2.5 and doctrine 2.5
Rich domain model with symfony 2.5 and doctrine 2.5
 
Love and Loss: A Symfony Security Play
Love and Loss: A Symfony Security PlayLove and Loss: A Symfony Security Play
Love and Loss: A Symfony Security Play
 
Symfony 2 (PHP Quebec 2009)
Symfony 2 (PHP Quebec 2009)Symfony 2 (PHP Quebec 2009)
Symfony 2 (PHP Quebec 2009)
 
How I started to love design patterns
How I started to love design patternsHow I started to love design patterns
How I started to love design patterns
 
Lithium: The Framework for People Who Hate Frameworks, Tokyo Edition
Lithium: The Framework for People Who Hate Frameworks, Tokyo EditionLithium: The Framework for People Who Hate Frameworks, Tokyo Edition
Lithium: The Framework for People Who Hate Frameworks, Tokyo Edition
 
Dealing with Continuous Data Processing, ConFoo 2012
Dealing with Continuous Data Processing, ConFoo 2012Dealing with Continuous Data Processing, ConFoo 2012
Dealing with Continuous Data Processing, ConFoo 2012
 

Similar a Symfony components in the wild, PHPNW12

Phpne august-2012-symfony-components-friends
Phpne august-2012-symfony-components-friendsPhpne august-2012-symfony-components-friends
Phpne august-2012-symfony-components-friends
Michael Peacock
 
Symfony As A Platform (Symfony Camp 2007)
Symfony As A Platform (Symfony Camp 2007)Symfony As A Platform (Symfony Camp 2007)
Symfony As A Platform (Symfony Camp 2007)
Fabien Potencier
 
symfony on action - WebTech 207
symfony on action - WebTech 207symfony on action - WebTech 207
symfony on action - WebTech 207
patter
 
The symfony platform: Create your very own framework (PHP Quebec 2008)
The symfony platform: Create your very own framework (PHP Quebec 2008)The symfony platform: Create your very own framework (PHP Quebec 2008)
The symfony platform: Create your very own framework (PHP Quebec 2008)
Fabien Potencier
 
Symfony2 Components - The Event Dispatcher
Symfony2 Components - The Event DispatcherSymfony2 Components - The Event Dispatcher
Symfony2 Components - The Event Dispatcher
Sarah El-Atm
 
Dirty Secrets of the PHP SOAP Extension
Dirty Secrets of the PHP SOAP ExtensionDirty Secrets of the PHP SOAP Extension
Dirty Secrets of the PHP SOAP Extension
Adam Trachtenberg
 

Similar a Symfony components in the wild, PHPNW12 (20)

Phpne august-2012-symfony-components-friends
Phpne august-2012-symfony-components-friendsPhpne august-2012-symfony-components-friends
Phpne august-2012-symfony-components-friends
 
Forget about Index.php and build you applications around HTTP - PHPers Cracow
Forget about Index.php and build you applications around HTTP - PHPers CracowForget about Index.php and build you applications around HTTP - PHPers Cracow
Forget about Index.php and build you applications around HTTP - PHPers Cracow
 
Filesystem abstractions and msg queue sergeev - symfony camp 2018
Filesystem abstractions and msg queue   sergeev - symfony camp 2018Filesystem abstractions and msg queue   sergeev - symfony camp 2018
Filesystem abstractions and msg queue sergeev - symfony camp 2018
 
Forget about index.php and build you applications around HTTP!
Forget about index.php and build you applications around HTTP!Forget about index.php and build you applications around HTTP!
Forget about index.php and build you applications around HTTP!
 
Symfony As A Platform (Symfony Camp 2007)
Symfony As A Platform (Symfony Camp 2007)Symfony As A Platform (Symfony Camp 2007)
Symfony As A Platform (Symfony Camp 2007)
 
Symfony internals [english]
Symfony internals [english]Symfony internals [english]
Symfony internals [english]
 
How Kris Writes Symfony Apps
How Kris Writes Symfony AppsHow Kris Writes Symfony Apps
How Kris Writes Symfony Apps
 
関西PHP勉強会 php5.4つまみぐい
関西PHP勉強会 php5.4つまみぐい関西PHP勉強会 php5.4つまみぐい
関西PHP勉強会 php5.4つまみぐい
 
symfony on action - WebTech 207
symfony on action - WebTech 207symfony on action - WebTech 207
symfony on action - WebTech 207
 
How kris-writes-symfony-apps-london
How kris-writes-symfony-apps-londonHow kris-writes-symfony-apps-london
How kris-writes-symfony-apps-london
 
Symfony2 - WebExpo 2010
Symfony2 - WebExpo 2010Symfony2 - WebExpo 2010
Symfony2 - WebExpo 2010
 
Symfony2 - OSIDays 2010
Symfony2 - OSIDays 2010Symfony2 - OSIDays 2010
Symfony2 - OSIDays 2010
 
PHP pod mikroskopom
PHP pod mikroskopomPHP pod mikroskopom
PHP pod mikroskopom
 
The symfony platform: Create your very own framework (PHP Quebec 2008)
The symfony platform: Create your very own framework (PHP Quebec 2008)The symfony platform: Create your very own framework (PHP Quebec 2008)
The symfony platform: Create your very own framework (PHP Quebec 2008)
 
Doctrine For Beginners
Doctrine For BeginnersDoctrine For Beginners
Doctrine For Beginners
 
Refactoring using Codeception
Refactoring using CodeceptionRefactoring using Codeception
Refactoring using Codeception
 
Symfony2 Components - The Event Dispatcher
Symfony2 Components - The Event DispatcherSymfony2 Components - The Event Dispatcher
Symfony2 Components - The Event Dispatcher
 
Decoupling with Design Patterns and Symfony2 DIC
Decoupling with Design Patterns and Symfony2 DICDecoupling with Design Patterns and Symfony2 DIC
Decoupling with Design Patterns and Symfony2 DIC
 
PHPUnit elevato alla Symfony2
PHPUnit elevato alla Symfony2PHPUnit elevato alla Symfony2
PHPUnit elevato alla Symfony2
 
Dirty Secrets of the PHP SOAP Extension
Dirty Secrets of the PHP SOAP ExtensionDirty Secrets of the PHP SOAP Extension
Dirty Secrets of the PHP SOAP Extension
 

Último

Artificial Intelligence: Facts and Myths
Artificial Intelligence: Facts and MythsArtificial Intelligence: Facts and Myths
Artificial Intelligence: Facts and Myths
Joaquim Jorge
 
Histor y of HAM Radio presentation slide
Histor y of HAM Radio presentation slideHistor y of HAM Radio presentation slide
Histor y of HAM Radio presentation slide
vu2urc
 

Último (20)

Real Time Object Detection Using Open CV
Real Time Object Detection Using Open CVReal Time Object Detection Using Open CV
Real Time Object Detection Using Open CV
 
Finology Group – Insurtech Innovation Award 2024
Finology Group – Insurtech Innovation Award 2024Finology Group – Insurtech Innovation Award 2024
Finology Group – Insurtech Innovation Award 2024
 
Boost PC performance: How more available memory can improve productivity
Boost PC performance: How more available memory can improve productivityBoost PC performance: How more available memory can improve productivity
Boost PC performance: How more available memory can improve productivity
 
A Domino Admins Adventures (Engage 2024)
A Domino Admins Adventures (Engage 2024)A Domino Admins Adventures (Engage 2024)
A Domino Admins Adventures (Engage 2024)
 
Boost Fertility New Invention Ups Success Rates.pdf
Boost Fertility New Invention Ups Success Rates.pdfBoost Fertility New Invention Ups Success Rates.pdf
Boost Fertility New Invention Ups Success Rates.pdf
 
Strategies for Landing an Oracle DBA Job as a Fresher
Strategies for Landing an Oracle DBA Job as a FresherStrategies for Landing an Oracle DBA Job as a Fresher
Strategies for Landing an Oracle DBA Job as a Fresher
 
Artificial Intelligence: Facts and Myths
Artificial Intelligence: Facts and MythsArtificial Intelligence: Facts and Myths
Artificial Intelligence: Facts and Myths
 
Histor y of HAM Radio presentation slide
Histor y of HAM Radio presentation slideHistor y of HAM Radio presentation slide
Histor y of HAM Radio presentation slide
 
TrustArc Webinar - Stay Ahead of US State Data Privacy Law Developments
TrustArc Webinar - Stay Ahead of US State Data Privacy Law DevelopmentsTrustArc Webinar - Stay Ahead of US State Data Privacy Law Developments
TrustArc Webinar - Stay Ahead of US State Data Privacy Law Developments
 
Partners Life - Insurer Innovation Award 2024
Partners Life - Insurer Innovation Award 2024Partners Life - Insurer Innovation Award 2024
Partners Life - Insurer Innovation Award 2024
 
Understanding Discord NSFW Servers A Guide for Responsible Users.pdf
Understanding Discord NSFW Servers A Guide for Responsible Users.pdfUnderstanding Discord NSFW Servers A Guide for Responsible Users.pdf
Understanding Discord NSFW Servers A Guide for Responsible Users.pdf
 
A Year of the Servo Reboot: Where Are We Now?
A Year of the Servo Reboot: Where Are We Now?A Year of the Servo Reboot: Where Are We Now?
A Year of the Servo Reboot: Where Are We Now?
 
ProductAnonymous-April2024-WinProductDiscovery-MelissaKlemke
ProductAnonymous-April2024-WinProductDiscovery-MelissaKlemkeProductAnonymous-April2024-WinProductDiscovery-MelissaKlemke
ProductAnonymous-April2024-WinProductDiscovery-MelissaKlemke
 
GenAI Risks & Security Meetup 01052024.pdf
GenAI Risks & Security Meetup 01052024.pdfGenAI Risks & Security Meetup 01052024.pdf
GenAI Risks & Security Meetup 01052024.pdf
 
AWS Community Day CPH - Three problems of Terraform
AWS Community Day CPH - Three problems of TerraformAWS Community Day CPH - Three problems of Terraform
AWS Community Day CPH - Three problems of Terraform
 
Developing An App To Navigate The Roads of Brazil
Developing An App To Navigate The Roads of BrazilDeveloping An App To Navigate The Roads of Brazil
Developing An App To Navigate The Roads of Brazil
 
Axa Assurance Maroc - Insurer Innovation Award 2024
Axa Assurance Maroc - Insurer Innovation Award 2024Axa Assurance Maroc - Insurer Innovation Award 2024
Axa Assurance Maroc - Insurer Innovation Award 2024
 
How to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected WorkerHow to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected Worker
 
Data Cloud, More than a CDP by Matt Robison
Data Cloud, More than a CDP by Matt RobisonData Cloud, More than a CDP by Matt Robison
Data Cloud, More than a CDP by Matt Robison
 
Exploring the Future Potential of AI-Enabled Smartphone Processors
Exploring the Future Potential of AI-Enabled Smartphone ProcessorsExploring the Future Potential of AI-Enabled Smartphone Processors
Exploring the Future Potential of AI-Enabled Smartphone Processors
 

Symfony components in the wild, PHPNW12