Fabien Potencier presented information about Symfony 2. He discussed that Symfony 2 is an evolution of Symfony 1 that aims to be more flexible and fast. Some key components of Symfony 2 include the dependency injection container, templating framework, and improved controller handling. The presentation highlighted the request handler as the backbone of Symfony 2's improved controller implementation. Events like application.request and application.response allow listeners to modify the request and response.
UK Symfony Meetup, November 2012
Original presentation: https://docs.google.com/presentation/pub?id=1PLcqTby6yqSbfWlMIDHknH852DU6DO6OAgQJOtSEdsg&start=false&loop=false&delayms=3000
Symfony components in the wild, PHPNW12Jakub Zalas
Symfony is a set of reusable and decoupled PHP components designed to solve common web development problems. While as a framework it might not be the best for some of your projects, you can always build on top of its solid foundation of well written, tested and flexible components.
Original presentation: https://docs.google.com/presentation/pub?id=136blt1DWJ95yuEdpmjz9dIqgg38VwEXBQlY7bu0Op8w&start=false&loop=false&delayms=3000
Symfony 2.0 is a major step forward for the symfony project. This new version introduces new concepts and new components, and make the framework even more decoupled and flexible than before. As an added bonus, the framework is also more lightweight and much faster. This session will give you a feeling of the power of Symfony 2.0 by introducing the main new components of the framework.
UK Symfony Meetup, November 2012
Original presentation: https://docs.google.com/presentation/pub?id=1PLcqTby6yqSbfWlMIDHknH852DU6DO6OAgQJOtSEdsg&start=false&loop=false&delayms=3000
Symfony components in the wild, PHPNW12Jakub Zalas
Symfony is a set of reusable and decoupled PHP components designed to solve common web development problems. While as a framework it might not be the best for some of your projects, you can always build on top of its solid foundation of well written, tested and flexible components.
Original presentation: https://docs.google.com/presentation/pub?id=136blt1DWJ95yuEdpmjz9dIqgg38VwEXBQlY7bu0Op8w&start=false&loop=false&delayms=3000
Symfony 2.0 is a major step forward for the symfony project. This new version introduces new concepts and new components, and make the framework even more decoupled and flexible than before. As an added bonus, the framework is also more lightweight and much faster. This session will give you a feeling of the power of Symfony 2.0 by introducing the main new components of the framework.
Rich Model And Layered Architecture in SF2 ApplicationKirill Chebunin
Presentation for Symfony Camp UA 2012.
* What are Rich Model, Service Layer & Layered Architecture
* Layered architecture in Sf2 Application
* Integration with 3rd party bundles
Design Patterns avec PHP 5.3, Symfony et PimpleHugo Hamon
Cette conférence présente deux grands motifs de conception : l'observateur et l'injection de dépendance. Ce sujet allie à la fois théorie et pratique. Le composant autonome EventDispatcher de Symfony ainsi que le conteneur d'injection de dépendance Pimple sont mis à l'honneur avec des exemples pratiques d'usage. Ces cas pratiques combinent du code de l'ORM Propel ainsi que le composant autonome Zend\Search\Lucene du Zend Framework 2
PHP 8.1 brings Enums, one of the most requested features in PHP.
Enums, or Enumerations, allow creating strict and type-safe structures for fixed values. An Enum structure can hold a number of values that can also be backed with integer or string values.
In this comprehensive session, we will discover what Enums are, why they are useful, how to apply them on our applications including Drupal, and things to watch out for when using Enums.
Audience
This session is for those who are familiar with modern PHP practices such as Object Oriented Programming, and principles such as Liskov Substitution principle. A quick introduction will be given to catch up to speed, but familiarity with such concepts can help a lot.
What you will learn
What are Enums.
Why Enums are useful.
How to use Enums
Migrating from magic constants/values to Enums.
Backed Enums and storing/fetching Enum values with a database.
Using Enums in a Drupal context.
Caveats when using Enums.
Author
Ayesh Karunaratne is the author of PHP.Watch (https://php.watch), where he provides in-depth articles and documents on PHP and latest changes to the language.
PHP 8.0: https://php.watch/versions/8.0
PHP 8.1: https://php.watch/versions/8.1
Enums: https://php.watch/versions/8.1/enums
New Symfony Tips & Tricks (SymfonyCon Paris 2015)Javier Eguiluz
This talk included tens of tips and tricks, new features and rarely used options for Symfony and its ecosystem. Besides the full-stack Symfony framework, other related technologies were mentioned, like Doctrine, Composer, Twig, PHPUnit and Monolog.
What should you test with your unit tests? Some people will say that unit behaviour is best tested through it's outcomes. But what if communication between units itself is more important than the results of it? This session will introduce you to two different ways of unit-testing and show you a way to assert your object behaviours through their communications.
How do you create applications with an incredible level of extendability without losing readability in the process? What if there's a way to separate concerns not only on the code, but on the service definition level? This talk will explore structural and behavioural patterns and ways to enrich them through tricks of powerful dependency injection containers such as Symfony2 DIC component.
PHP 8.0 comes with many long-awaited features: A just-in-time compiler, attributes, union types, and named arguments are just a small part of the list. As a major version, it also includes some backward-incompatible changes, which are centered around stricter error handling and enhanced type safety. Let's have an overview of the important changes in PHP 8.0 and how they might affect you!
Il arrive parfois que nous, développeurs, pensions qu’il n’est pas nécessaire de connaître ce qu’ils appellent les « design patterns » ou « patrons de conception ». Nous pensons parfois que nous n’avons pas besoin de cette théorie. Après des années d’expériences avec la faible maintenabilité de mon propre code et de celui de mes clients, j’ai exploré de nombreuses façons de découpler nos applications afin de créer des applications « enterprise ready » qui peuvent vivre pendant de nombreuses années. Via des exemples concrets, je vais vous présenter quelques design patterns qui peuvent vous aider à travailler sur une codebase propre, structurée et bien découplée.
Mirror, mirror on the wall: Building a new PHP reflection library (DPC 2016)James Titcumb
Have you ever used PHP's built in reflection, only to find you can't do quite what you wanted? What about finding types for parameters or properties? What about reflecting on classes that aren't loaded, so that you can modify them directly?
Better Reflection is an awesome new library that uses magical time-warp techniques* (*actual magic or time-warp not guaranteed) to improve on PHP's built-in reflection by providing additional functionality. In this talk we'll cover what reflection is all about, explore the cool features of Better Reflection already implemented, the difficulties we faced actually writing the thing, and how you can use Better Reflection in your projects to maximise your reflection-fu.
Rich Model And Layered Architecture in SF2 ApplicationKirill Chebunin
Presentation for Symfony Camp UA 2012.
* What are Rich Model, Service Layer & Layered Architecture
* Layered architecture in Sf2 Application
* Integration with 3rd party bundles
Design Patterns avec PHP 5.3, Symfony et PimpleHugo Hamon
Cette conférence présente deux grands motifs de conception : l'observateur et l'injection de dépendance. Ce sujet allie à la fois théorie et pratique. Le composant autonome EventDispatcher de Symfony ainsi que le conteneur d'injection de dépendance Pimple sont mis à l'honneur avec des exemples pratiques d'usage. Ces cas pratiques combinent du code de l'ORM Propel ainsi que le composant autonome Zend\Search\Lucene du Zend Framework 2
PHP 8.1 brings Enums, one of the most requested features in PHP.
Enums, or Enumerations, allow creating strict and type-safe structures for fixed values. An Enum structure can hold a number of values that can also be backed with integer or string values.
In this comprehensive session, we will discover what Enums are, why they are useful, how to apply them on our applications including Drupal, and things to watch out for when using Enums.
Audience
This session is for those who are familiar with modern PHP practices such as Object Oriented Programming, and principles such as Liskov Substitution principle. A quick introduction will be given to catch up to speed, but familiarity with such concepts can help a lot.
What you will learn
What are Enums.
Why Enums are useful.
How to use Enums
Migrating from magic constants/values to Enums.
Backed Enums and storing/fetching Enum values with a database.
Using Enums in a Drupal context.
Caveats when using Enums.
Author
Ayesh Karunaratne is the author of PHP.Watch (https://php.watch), where he provides in-depth articles and documents on PHP and latest changes to the language.
PHP 8.0: https://php.watch/versions/8.0
PHP 8.1: https://php.watch/versions/8.1
Enums: https://php.watch/versions/8.1/enums
New Symfony Tips & Tricks (SymfonyCon Paris 2015)Javier Eguiluz
This talk included tens of tips and tricks, new features and rarely used options for Symfony and its ecosystem. Besides the full-stack Symfony framework, other related technologies were mentioned, like Doctrine, Composer, Twig, PHPUnit and Monolog.
What should you test with your unit tests? Some people will say that unit behaviour is best tested through it's outcomes. But what if communication between units itself is more important than the results of it? This session will introduce you to two different ways of unit-testing and show you a way to assert your object behaviours through their communications.
How do you create applications with an incredible level of extendability without losing readability in the process? What if there's a way to separate concerns not only on the code, but on the service definition level? This talk will explore structural and behavioural patterns and ways to enrich them through tricks of powerful dependency injection containers such as Symfony2 DIC component.
PHP 8.0 comes with many long-awaited features: A just-in-time compiler, attributes, union types, and named arguments are just a small part of the list. As a major version, it also includes some backward-incompatible changes, which are centered around stricter error handling and enhanced type safety. Let's have an overview of the important changes in PHP 8.0 and how they might affect you!
Il arrive parfois que nous, développeurs, pensions qu’il n’est pas nécessaire de connaître ce qu’ils appellent les « design patterns » ou « patrons de conception ». Nous pensons parfois que nous n’avons pas besoin de cette théorie. Après des années d’expériences avec la faible maintenabilité de mon propre code et de celui de mes clients, j’ai exploré de nombreuses façons de découpler nos applications afin de créer des applications « enterprise ready » qui peuvent vivre pendant de nombreuses années. Via des exemples concrets, je vais vous présenter quelques design patterns qui peuvent vous aider à travailler sur une codebase propre, structurée et bien découplée.
Mirror, mirror on the wall: Building a new PHP reflection library (DPC 2016)James Titcumb
Have you ever used PHP's built in reflection, only to find you can't do quite what you wanted? What about finding types for parameters or properties? What about reflecting on classes that aren't loaded, so that you can modify them directly?
Better Reflection is an awesome new library that uses magical time-warp techniques* (*actual magic or time-warp not guaranteed) to improve on PHP's built-in reflection by providing additional functionality. In this talk we'll cover what reflection is all about, explore the cool features of Better Reflection already implemented, the difficulties we faced actually writing the thing, and how you can use Better Reflection in your projects to maximise your reflection-fu.
Entrepreneurship support - an entrepreneur's perspectiveSalim Virani
Based on a talk I gave to the Capital Enterprise stakeholders and members in relation to the Bootstrapping Bootcamp program we're developing and sharing.
You can learn more about the program at http://register.leanca.mp/bootstrapping-bootcamp or contact me at http://SaintSal.com/contact
To learn more about the new tools and methods entrepreneurs are using to find market traction faster, go to http://leanca.mp
Symfony is the greatest PHP Framework in the world. Until the framework met ReactPHP. Then, it became even better.
In this talk we will discover what a Promise is and what is designed for.
We will check how we can work with any Promise implementation in the regular Symfony distribution, either from the server perspective and inside our domain.
Finally, we will see how Symfony can easily turn Promises friendly by using ReactPHP, allowing us to work with them in our whole application, improving extremely our service performance.
All steps will be decorated with benchmarks, examples and deep analysis tips.
Using HttpKernelInterface for Painless IntegrationCiaranMcNulty
In this short session we will look at one of the Symfony2 components adopted since Drupal 8; the HttpKernelInterface.
Attendees will gain familiarity with this component, the related Request and Response objects, and the overall top level structure of a Drupal 8 project's integration.
We will also see how the Stack PHP project allows us to easily integrate a Drupal 8 site with another codebase that uses the HttpKernelInterface (including Symfony2, Silex, Laravel or even another Drupal 8 project).
We will also explore some of the other functionality that can be added by Stack, all enabled by this powerful abstraction.
A case study of the changes and transition from ZF1 to ZF2 in the Zend Server UI project in Webinar form: http://www.zend.com/en/webinar/Framework/70170000000bwxn-ZSVR6UI-ZF2-20130129.flv
Creating your own framework on top of Symfony2 ComponentsDeepak Chandani
Symfony is a set of reusable standalone PHP components that can be used to solve many web dev problems. We will pick some of the important components (bricks) & will create our own framework on top of those bricks.
Burn down the silos! Helping dev and ops gel on high availability websitesLindsay Holmwood
HA websites are where the rubber meets the road - at 200km/h. Traditional separation of dev and ops just doesn't cut it.
Everything is related to everything. Code relies on performant and resilient infrastructure, but highly performant infrastructure will only get a poorly written application so far. Worse still, root cause analysis in HA sites will more often than not identify problems that don't clearly belong to either devs or ops.
The two options are collaborate or die.
This talk will introduce 3 core principles for improving collaboration between operations and development teams: consistency, repeatability, and visibility. These principles will be investigated with real world case studies and associated technologies audience members can start using now. In particular, there will be a focus on:
- fast provisioning of test environments with configuration management
- reliable and repeatable automated deployments
- application and infrastructure visibility with statistics collection, logging, and visualisation
Through the magic of virtualization technology (Vagrant) and Puppet, a companion Enterprise grade provisioning technology, we explore how to make the complex configuration game a walk in the park. Bring new team members up to speed in minutes, eliminate variances in configurations, and make integration issues a thing of the past.
Welcome to the new age of team development!
Practical tips for dealing with projects involving legacy code. Covers investigating past projects, static analysis of existing code, and methods for changing legacy code.
Presented at PHP Benelux '10
Symfony2: What's all the buzz about?
Follow along as we download, install and get a hands-on experience using Symfony2. This presentation shows you how to get started with Symfony and introduces you to the large group of new PHP libraries coming from the Symfony2 community. You'll see examples of how to create pages, use template inheritance, and create a simple JSON API.
Transcript: Selling digital books in 2024: Insights from industry leaders - T...BookNet Canada
The publishing industry has been selling digital audiobooks and ebooks for over a decade and has found its groove. What’s changed? What has stayed the same? Where do we go from here? Join a group of leading sales peers from across the industry for a conversation about the lessons learned since the popularization of digital books, best practices, digital book supply chain management, and more.
Link to video recording: https://bnctechforum.ca/sessions/selling-digital-books-in-2024-insights-from-industry-leaders/
Presented by BookNet Canada on May 28, 2024, with support from the Department of Canadian Heritage.
Alt. GDG Cloud Southlake #33: Boule & Rebala: Effective AppSec in SDLC using ...James Anderson
Effective Application Security in Software Delivery lifecycle using Deployment Firewall and DBOM
The modern software delivery process (or the CI/CD process) includes many tools, distributed teams, open-source code, and cloud platforms. Constant focus on speed to release software to market, along with the traditional slow and manual security checks has caused gaps in continuous security as an important piece in the software supply chain. Today organizations feel more susceptible to external and internal cyber threats due to the vast attack surface in their applications supply chain and the lack of end-to-end governance and risk management.
The software team must secure its software delivery process to avoid vulnerability and security breaches. This needs to be achieved with existing tool chains and without extensive rework of the delivery processes. This talk will present strategies and techniques for providing visibility into the true risk of the existing vulnerabilities, preventing the introduction of security issues in the software, resolving vulnerabilities in production environments quickly, and capturing the deployment bill of materials (DBOM).
Speakers:
Bob Boule
Robert Boule is a technology enthusiast with PASSION for technology and making things work along with a knack for helping others understand how things work. He comes with around 20 years of solution engineering experience in application security, software continuous delivery, and SaaS platforms. He is known for his dynamic presentations in CI/CD and application security integrated in software delivery lifecycle.
Gopinath Rebala
Gopinath Rebala is the CTO of OpsMx, where he has overall responsibility for the machine learning and data processing architectures for Secure Software Delivery. Gopi also has a strong connection with our customers, leading design and architecture for strategic implementations. Gopi is a frequent speaker and well-known leader in continuous delivery and integrating security into software delivery.
Sudheer Mechineni, Head of Application Frameworks, Standard Chartered Bank
Discover how Standard Chartered Bank harnessed the power of Neo4j to transform complex data access challenges into a dynamic, scalable graph database solution. This keynote will cover their journey from initial adoption to deploying a fully automated, enterprise-grade causal cluster, highlighting key strategies for modelling organisational changes and ensuring robust disaster recovery. Learn how these innovations have not only enhanced Standard Chartered Bank’s data infrastructure but also positioned them as pioneers in the banking sector’s adoption of graph technology.
Communications Mining Series - Zero to Hero - Session 1DianaGray10
This session provides introduction to UiPath Communication Mining, importance and platform overview. You will acquire a good understand of the phases in Communication Mining as we go over the platform with you. Topics covered:
• Communication Mining Overview
• Why is it important?
• How can it help today’s business and the benefits
• Phases in Communication Mining
• Demo on Platform overview
• Q/A
Pushing the limits of ePRTC: 100ns holdover for 100 daysAdtran
At WSTS 2024, Alon Stern explored the topic of parametric holdover and explained how recent research findings can be implemented in real-world PNT networks to achieve 100 nanoseconds of accuracy for up to 100 days.
Observability Concepts EVERY Developer Should Know -- DeveloperWeek Europe.pdfPaige Cruz
Monitoring and observability aren’t traditionally found in software curriculums and many of us cobble this knowledge together from whatever vendor or ecosystem we were first introduced to and whatever is a part of your current company’s observability stack.
While the dev and ops silo continues to crumble….many organizations still relegate monitoring & observability as the purview of ops, infra and SRE teams. This is a mistake - achieving a highly observable system requires collaboration up and down the stack.
I, a former op, would like to extend an invitation to all application developers to join the observability party will share these foundational concepts to build on:
In his public lecture, Christian Timmerer provides insights into the fascinating history of video streaming, starting from its humble beginnings before YouTube to the groundbreaking technologies that now dominate platforms like Netflix and ORF ON. Timmerer also presents provocative contributions of his own that have significantly influenced the industry. He concludes by looking at future challenges and invites the audience to join in a discussion.
GraphSummit Singapore | The Future of Agility: Supercharging Digital Transfor...Neo4j
Leonard Jayamohan, Partner & Generative AI Lead, Deloitte
This keynote will reveal how Deloitte leverages Neo4j’s graph power for groundbreaking digital twin solutions, achieving a staggering 100x performance boost. Discover the essential role knowledge graphs play in successful generative AI implementations. Plus, get an exclusive look at an innovative Neo4j + Generative AI solution Deloitte is developing in-house.
Generative AI Deep Dive: Advancing from Proof of Concept to ProductionAggregage
Join Maher Hanafi, VP of Engineering at Betterworks, in this new session where he'll share a practical framework to transform Gen AI prototypes into impactful products! He'll delve into the complexities of data collection and management, model selection and optimization, and ensuring security, scalability, and responsible use.
Removing Uninteresting Bytes in Software FuzzingAftab Hussain
Imagine a world where software fuzzing, the process of mutating bytes in test seeds to uncover hidden and erroneous program behaviors, becomes faster and more effective. A lot depends on the initial seeds, which can significantly dictate the trajectory of a fuzzing campaign, particularly in terms of how long it takes to uncover interesting behaviour in your code. We introduce DIAR, a technique designed to speedup fuzzing campaigns by pinpointing and eliminating those uninteresting bytes in the seeds. Picture this: instead of wasting valuable resources on meaningless mutations in large, bloated seeds, DIAR removes the unnecessary bytes, streamlining the entire process.
In this work, we equipped AFL, a popular fuzzer, with DIAR and examined two critical Linux libraries -- Libxml's xmllint, a tool for parsing xml documents, and Binutil's readelf, an essential debugging and security analysis command-line tool used to display detailed information about ELF (Executable and Linkable Format). Our preliminary results show that AFL+DIAR does not only discover new paths more quickly but also achieves higher coverage overall. This work thus showcases how starting with lean and optimized seeds can lead to faster, more comprehensive fuzzing campaigns -- and DIAR helps you find such seeds.
- These are slides of the talk given at IEEE International Conference on Software Testing Verification and Validation Workshop, ICSTW 2022.
The Art of the Pitch: WordPress Relationships and SalesLaura Byrne
Clients don’t know what they don’t know. What web solutions are right for them? How does WordPress come into the picture? How do you make sure you understand scope and timeline? What do you do if sometime changes?
All these questions and more will be explored as we talk about matching clients’ needs with what your agency offers without pulling teeth or pulling your hair out. Practical tips, and strategies for successful relationship building that leads to closing the deal.
Climate Impact of Software Testing at Nordic Testing DaysKari Kakkonen
My slides at Nordic Testing Days 6.6.2024
Climate impact / sustainability of software testing discussed on the talk. ICT and testing must carry their part of global responsibility to help with the climat warming. We can minimize the carbon footprint but we can also have a carbon handprint, a positive impact on the climate. Quality characteristics can be added with sustainability, and then measured continuously. Test environments can be used less, and in smaller scale and on demand. Test techniques can be used in optimizing or minimizing number of tests. Test automation can be used to speed up testing.
2. Who am I?
• Founder of Sensio
– Web Agency
– Since 1998
– 70 people
– Open-Source Specialists
– Big corporate customers
• Creator and lead developer of symfony
3. How many of you have used symfony?
1.0? 1.1? 1.2?
4. symfony 1.0
• Started as a glue between existing Open-Source libraries:
– Mojavi (heavily modified), Propel, Prado i18n, …
• Borrowed concepts from other languages and frameworks:
– Routing, CLI, functional tests, YAML, Rails helpers…
• Added new concepts to the mix
– Web Debug Toolbar, admin generator, configuration cascade, …
5. symfony 1.2
• Decoupled but cohesive components: the symfony platform
– Forms, Routing, Cache, YAML, ORMs, …
• Controller still based on Mojavi
– View, Filter Chain, …
• Could have been named 2.0 ;)
13. Symfony 2
• Not yet available as a full-stack MVC framework
• Some components have already been merged into Symfony 1
– Event Dispatcher
– Form Framework
• Other new components will soon be released as standalone
components:
– Controller Handling
– Templating Framework
– Dependency Injection Container
26. Symfony 2 core is so light and flexible
that you can easily customize it
to have outstanding performance
for a Hello World application
27. Symfony 2 core is so light and flexible
that its raw performance
is outstanding
28. require_once dirname(__FILE__).'/sf20/autoload2/sfCore2Autoload.class.php';
sfCore2Autoload::register();
$app = new HelloApplication();
$app->run()->send();
class HelloApplication
{
public function __construct()
{
$this->dispatcher = new sfEventDispatcher();
$this->dispatcher->connect('application.load_controller', array($this, 'loadController'));
}
public function run()
Hello World
{
$request = new sfWebRequest($this->dispatcher);
Symfony 2.0
$handler = new sfRequestHandler($this->dispatcher);
with
$response = $handler->handle($request);
return $response;
}
public function loadController(sfEvent $event)
{
$event->setReturnValue(array(array($this, 'hello'), array($this->dispatcher, $event['request'])));
return true;
}
public function hello($dispatcher, $request)
{
$response = new sfWebResponse($dispatcher);
$response->setContent('Hello World');
return $response;
}
}
29. 7922&
7822& !"#$%&!'!&
Hello World
()$*+&
7022&
Benchmark
7722&
7222&
>22&
=22&
<22&
;22&
:22&
,-./+%-&012&
922&
x 3 x 7
822&
022&
3+"#4&
722& 56& ,-./+%-&710&
2&
based on numbers from http://paul-m-jones.com/?p=315
31. Twitto: The PHP framework that fits in a tweet
• The fastest framework around?
• Uses some PHP 5.3 new features
• It also fits in a slide…
require __DIR__.'/c.php';
if (!is_callable($c = @$_GET['c'] ?:
function() { echo 'Woah!'; }))
throw new Exception('Error');
$c(); twitt o.org
33. 7 times faster ?!
You won’t have such a difference for real applications
as most of the time, the limiting factor
is not the framework itself
34. 7 times faster ?!
• But raw speed matters because
– It demonstrates that the core « kernel » is very light
– It allows you to use several Symfony frameworks within a single
application with the same behavior but different optimizations:
• One full-stack framework optimized for ease of use (think symfony 1)
• One light framework optimized for speed (think Rails Metal ;))
38. The Request Handler
• The backbone of Symfony 2 controller implementation
• Class to build web frameworks, not only MVC ones
• Based on a simple assumption:
– The input is a request object
– The output is a response object
• The request object can be anything you want
• The response object must implement a send() method
Web Request Web Response
Request Handler
39. The Request Handler
$handler = new sfRequestHandler($dispatcher);
$request = new sfWebRequest($dispatcher);
$response = $handler->handle($request);
$response->send();
40. The Request Handler
• The sfRequestHandler does several things:
– Notify events
– Execute a callable (the controller)
– Ensure that the Request is converted to a Response object
• The framework is responsible for choosing the controller
• The controller is responsible for the conversion of the Request to a
Response
41. class sfRequestHandler
{
protected $dispatcher = null;
public function __construct(sfEventDispatcher $dispatcher)
{
$this->dispatcher = $dispatcher;
}
sfRequestHandler
public function handle($request)
{
try
{
return $this->handleRaw($request);
s less than 100
}
catch (Exception $e)
i
{
$event = $this->dispatcher->notifyUntil(new sfEvent($this, 'application.exception', array('request' => $request, 'exception' => $e)));
if ($event->isProcessed())
{
lines of PHP
return $this->filterResponse($event->getReturnValue(), 'An "application.exception" listener returned a non response object.');
}
throw $e;
}
}
code!
public function handleRaw($request)
{
$event = $this->dispatcher->notifyUntil(new sfEvent($this, 'application.request', array('request' => $request)));
if ($event->isProcessed())
{
return $this->filterResponse($event->getReturnValue(), 'An "application.request" listener returned a non response object.');
}
$event = $this->dispatcher->notifyUntil(new sfEvent($this, 'application.load_controller', array('request' => $request)));
if (!$event->isProcessed())
{
throw new Exception('Unable to load the controller.');
}
list($controller, $arguments) = $event->getReturnValue();
if (!is_callable($controller))
{
throw new Exception(sprintf('The controller must be a callable (%s).', var_export($controller, true)));
}
$event = $this->dispatcher->notifyUntil(new sfEvent($this, 'application.controller', array('request' => $request, 'controller' => &$controller, 'arguments' => &$arguments)));
if ($event->isProcessed())
{
try
{
return $this->filterResponse($event->getReturnValue(), 'An "application.controller" listener returned a non response object.');
}
catch (Exception $e)
{
$retval = $event->getReturnValue();
}
}
else
{
$retval = call_user_func_array($controller, $arguments);
}
$event = $this->dispatcher->filter(new sfEvent($this, 'application.view'), $retval);
return $this->filterResponse($event->getReturnValue(), sprintf('The controller must return a response (instead of %s).', is_object($event->getReturnValue()) ? 'an object of class '.get_class($event->getReturnValue()) : (string) $event->getReturnValue()));
}
protected function filterResponse($response, $message)
{
if (!is_object($response) || !method_exists($response, 'send'))
{
throw new RuntimeException($message);
}
$event = $this->dispatcher->filter(new sfEvent($this, 'application.response'), $response);
$response = $event->getReturnValue();
if (!is_object($response) || !method_exists($response, 'send'))
{
throw new RuntimeException('An "application.response" listener returned a non response object.');
}
return $response;
}
}
43. application.response
As the very last event notified, a listener can modify the
Response object just before it is returned to the user
44. application.request
• The very first event notified
• It can act as a short-circuit event
• If one listener returns a Response object, it stops the processing
45. application.load_controller
• Only event for which at least one listener must be connected to
• A listener must return
– A PHP callable (the controller)
– The arguments to pass to the callable
48. Request Handler
• Several listeners can be attached to a single event
• Listeners are called in turn
sfEventDispatcher
load_controller
controller
response
request
view
exception
request sfRequestHandler response
49. require_once dirname(__FILE__).'/sf20/autoload2/sfCore2Autoload.class.php';
sfCore2Autoload::register();
$app = new HelloApplication();
$app->run()->send();
class HelloApplication
{
public function __construct()
{
$this->dispatcher = new sfEventDispatcher();
$this->dispatcher->connect('application.load_controller', array($this, 'loadController'));
}
public function run()
Hello World
{
$request = new sfWebRequest($this->dispatcher);
Symfony 2.0
$handler = new sfRequestHandler($this->dispatcher);
with
$response = $handler->handle($request);
return $response;
}
public function loadController(sfEvent $event)
{
$event->setReturnValue(array(array($this, 'hello'), array($this->dispatcher, $event['request'])));
return true;
}
public function hello($dispatcher, $request)
{
$response = new sfWebResponse($dispatcher);
$response->setContent('Hello World');
return $response;
}
}
51. $app = new HelloApplication();
$app->run()->send();
52. public function __construct()
{
$this->dispatcher = new sfEventDispatcher();
$this->dispatcher->connect(
'application.load_controller',
array($this, 'loadController')
);
}
sfEventDispatcher
load_controller
controller
response
request
view
exception
request sfRequestHandler response
53. public function loadController(sfEvent $event)
{
$event->setReturnValue(array(
array($this, 'hello'),
array($this->dispatcher, $event['request'])
));
return true;
}
54. public function hello($dispatcher, $request)
{
$response = new sfWebResponse($dispatcher);
$response->setContent('Hello World');
return $response;
}
55. public function run()
{
$request = new sfWebRequest($this->dispatcher);
$handler = new sfRequestHandler($this->dispatcher);
$response = $handler->handle($request);
return $response;
}
56. Case study: dailymotion.com
• The problem: the Dailymotion developers add new features on a nearly
everyday basis
• The challenge: Migrate by introducing small doses of Symfony
goodness
• The process
– Wrap everything with sfRequestHandler by implementing an
application.load_controller listener that calls the old code, based on the
request
– Migrate the mod_rewrite rules to the symfony routing
– Add unit and functional tests
60. Template Loaders
• No assumption about where and how templates are to be found
– Filesystem
– Database
– Memory
– …
• Template names are « logical » names:
$loader = new sfTemplateLoaderFilesystem($dispatcher,
'/path/to/templates/%s.php');
61. Template Renderers
• No assumption about the format of the templates
• Template names are prefixed with the renderer name:
– index == php:index
– user:index
$t = new sfTemplateEngine($dispatcher, $loader, array(
'user' => new ProjectTemplateRenderer($dispatcher),
'php' => new sfTemplateRendererPhp($dispatcher),
));
67. CMS Templating
• Imagine a CMS with the following features:
– The CMS comes bundled with default templates
– The developer can override default templates for a specific project
– The webmaster can override some templates
• The CMS and developer templates are stored on the filesystem and are
written with pure PHP code
• The webmaster templates are stored in a database and are written in a
simple templating language: Hello {{ name }}
68. CMS Templating
• The CMS has several built-in sections and pages
– Each page is decorated by a layout, depending on the section
– Each section layout is decorated by a base layout
cms/templates/ project/templates/
base.php base.php
articles/ articles/
layout.php layout.php
article.php article.php
content.php
82. « Dependency Injection is where
components are given their dependencies
through their constructors, methods, or
directly into fields. »
http://www.picocontainer.org/injection.html
83. The Symfony 2 dependency injection container
replaces several symfony 1 concepts
into one integrated system:
– sfContext
– sfConfiguration
– sfConfig
– factories.yml
– settings.yml / logging.yml / i18n.yml
84. DI Hello World example
class Message
{
public function __construct(OutputInterface $output, array $options)
{
$this->output = $output;
$this->options = array_merge(array('with_newline' => false), $options);
}
public function say($msg)
{
$this->output->render($msg.($this->options['with_newline'] ? "n" : ''));
}
}
85. DI Hello World example
interface OutputInterface
{
public function render($msg);
}
class Output implements OutputInterface
{
public function render($msg)
{
echo $msg;
}
}
class FancyOutput implements OutputInterface
{
public function render($msg)
{
echo sprintf("033[33m%s033[0m", $msg);
}
}
86. DI Hello World example
$output = new FancyOutput();
$message = new Message($output, array('with_newline' => true));
$message->say('Hello World');
87. A DI container facilitates
objects description and object relationships,
configures and instantiates objects
88. DI Container Hello World example
$container = new sfServiceContainer();
$outputDef = new sfServiceDefinition('FancyOutput');
$container->setServiceDefinition('output', $outputDef);
$msgDef = new sfServiceDefinition(
'Message',
array(new sfServiceReference('output'), array('with_newline' => true))
);
$container->setServiceDefinition('message', $msgDef);
$container->message->say('Hello World!');
89. $message = $container->message;
Get the configuration for the message service
The Message constructor must be given an output service
Get the output object from the container
Create a Message object by passing the constructor arguments
90. $message = $container->message;
is roughly equivalent to
$output = new FancyOutput();
$message = new Message($output, array('with_newline' => true));!