SlideShare a Scribd company logo
1 of 55
Achieving wise architecture
             with Symfony2


             Wojciech Sznapka
                       ALEJE.IT
Cześć!
Wojciech Sznapka
                              Technical Manager @ XSolve   
                         Zend Certified Engineer since 2010   
                            Symfony Framework since 2008   
                                             PHP since 2004   
                              Web development since 2001   




 Besides: ice hockey, windsurfing, skiing, crime stories
How can 
architecture
   be bad?
Classes with 
     hundreds 
lines of code?
Model mixed with 
 View located in 
      Controler ?
Changes and 
  maintanance 
costing fortune ?
Crashing due to 
enormous load ?
Unable to migrate 
        to cloud ?
Yes, that's bad!
Make it
        wisely
with Symfony2
Most popular 
  framework in
PHP ecosystem
2078 Forks
6245 Favs
1910 Bundles
Built on top of
 best patterns
So... is
      Symfony2
a silver bullet?
Symfony2 is only
   good tool ...
… but even good tools
  can be used poorly
So let's keep in mind
  three good rules...
Rule #1:
 SOLID
S ingle responsibility principle
O pen/closed principle
L iskov substitution principle
I nterface segregation principle
D ependency inversion principle
Each service should have
              exactly one
                 purpose
Other responsibilities
                should be
    aggregated in  services
injected as dependencies
<?php

namespace WowoNewsletterBundleNewsletterModel;

class MailingManager implements MailingManagerInterface
{
    protected $templateManager;

    public function __construct(TemplateManagerInterface $templateManager)
    {
        $this->templateManager = $templateManager;
    }

    public function createMailing($data, Mailing $mailing)
    {
        $body = $this->templateManager->applyTemplate($mailing->getBody(), $mailing->getTitle());
        $mailing->setBody($body);
            $mailing->setSubject($data['subject']);

        return $mailing;
    }
}
Services should be
  closed for modification
But opened for extension
Abstract classes
           helps with
Open/Closed principle
<?php

abstract class Animal
{
    public function makeHappySound()
    {
        return sprintf("Happilly %sn", $this->speak());
    }

    abstract public function speak();
}

class Dog extends Animal
{
    function speak()
    {
        return "Woof, woof!";
    }
}

class Cat extends Animal
{
    function speak()
    {
        return "Meow...";
    }
}

foreach (array(new Dog, new Cat) as $creature) {
    printf($creature->makeHappySound());
}
It should be possible to 
replace class with other 
         implementation 
<?xml version="1.0" ?>

<container xmlns="http://symfony.com/schema/dic/services"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://symfony.com/schema/dic/services
http://symfony.com/schema/dic/services/services-1.0.xsd">

    <parameters>
        <parameter
key="mailing_manager.class">WowoNewsletterBundleNewsletterModelMailingManager</parameter>
    </parameters>

    <services>
        <service id="wowo_newsletter.mailing_manager" class="%mailing_manager.class%">
            <argument type="service" id="wowo_newsletter.entity_manager" />
            <argument>%wowo_newsletter.model.contact.class%</argument>
            <call method="setTemplateManager">
                <argument type="service" id="wowo_newsletter.template_manager"/>
            </call>
        </service>
    </services>
</container>



#config_dev.yml

parameters:
    mailing_manager.class: WowoNewsletterBundleMocksMailingManagerFancyMock
Interfaces should be 
        fine grained 
Many specific interfaces
   Are better than one
       general­purpose
<?php


interface PlaceholderProcessorInterface
{
    public function process($object, $body);
}

interface TemplateManagerInterface
{
    public function setAvailableTemplates(array $templates);
    public function getAvailableTemplates();
    public function applyTemplate($body, $title);
}

interface MediaManagerInterface
{
    public function embed($body, Swift_Message $message);
    public function getRegex($name);
}

interface BuilderInterface
{
    public function buildMessage($mailingId, $contactId, $contactClass);
}

interface SenderInterface
{
    public function send($mailingId, $contactId, $contactClass);
}
Application should be 
      decoupled into 
    dependant upon 
 abstractions modules
<?xml version="1.0" ?>

<container xmlns="http://symfony.com/schema/dic/services"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://symfony.com/schema/dic/services
http://symfony.com/schema/dic/services/services-1.0.xsd">

    <services>
        <service id="twig.extension.acme.demo"
class="AcmeDemoBundleTwigExtensionDemoExtension" public="false">
            <tag name="twig.extension" />
            <argument type="service" id="twig.loader" />
        </service>

        <service id="acme.demo.listener" class="AcmeDemoBundleEventListenerControllerListener">
            <tag name="kernel.event_listener" event="kernel.controller"
method="onKernelController" />
            <argument type="service" id="twig.extension.acme.demo" />
        </service>
    </services>
</container>
Rule #2:
Maintainability
Live application needs
           to be tested
Behat and/or unit tests
Live application needs
               logging
<?php

class MailingPersistService implements PersistService, LoggerAware
{
    // [...]

    protected $logger;

    public function setLogger(Logger $logger)
    {
        $this->logger = $logger;
    }

    public function Mailing(EntityMailing $mailing)
    {
        $user = $this->security->getUser();
        try {
            $this->entityManager->persist($mailing);
            $this->logger->info(sprintf('Mailing #%d %s has been saved by %s',
                $mailing->getId(), $mailing, $user),
                array('mailing' => $mailing, 'user' => $user));
        } catch (Exception $e) {
            $this->logger->err(sprintf('Problem while saving mailing by user %s: %s',
                $user, $e->getMessage()),
                array('exception' => $e, 'user' => $user));
        }
    }
Live application needs
            monitoring
Nagios or New Relic
Rule #3:
Scalability
Forget about local disk!
Keep sessions in 
         global storage
like database or NoSQL
Store user files
     global storage
like S3 or MongoFS
Write logs to
          central logger
like syslogd or logstash
Scale your DB with
master/slave connections
           using Doctrine
Wise
architecture
  ingridients
Design based on
 SOLID principles
Problems solved with
     existing bundles
made by community
Code covered with
   automatic tests
Logging and monitoring
Ready to
scale horizontally
Dziękuję!
Wojciech Sznapka
         wojciech@sznapka.pl
         blog.sznapka.pl
         @sznapka
         @wowo

More Related Content

What's hot

New Symfony Tips & Tricks (SymfonyCon Paris 2015)
New Symfony Tips & Tricks (SymfonyCon Paris 2015)New Symfony Tips & Tricks (SymfonyCon Paris 2015)
New Symfony Tips & Tricks (SymfonyCon Paris 2015)Javier Eguiluz
 
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 mockingKonstantin Kudryashov
 
How Kris Writes Symfony Apps
How Kris Writes Symfony AppsHow Kris Writes Symfony Apps
How Kris Writes Symfony AppsKris Wallsmith
 
Speed up your developments with Symfony2
Speed up your developments with Symfony2Speed up your developments with Symfony2
Speed up your developments with Symfony2Hugo Hamon
 
Advanced Interfaces and Repositories in Laravel
Advanced Interfaces and Repositories in LaravelAdvanced Interfaces and Repositories in Laravel
Advanced Interfaces and Repositories in LaravelJonathan Behr
 
Symfony Guard Authentication: Fun with API Token, Social Login, JWT and more
Symfony Guard Authentication: Fun with API Token, Social Login, JWT and moreSymfony Guard Authentication: Fun with API Token, Social Login, JWT and more
Symfony Guard Authentication: Fun with API Token, Social Login, JWT and moreRyan Weaver
 
Hooks and Events in Drupal 8
Hooks and Events in Drupal 8Hooks and Events in Drupal 8
Hooks and Events in Drupal 8Nida Ismail Shah
 
Phpne august-2012-symfony-components-friends
Phpne august-2012-symfony-components-friendsPhpne august-2012-symfony-components-friends
Phpne august-2012-symfony-components-friendsMichael Peacock
 
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.5Leonardo Proietti
 
Dependency Injection with PHP 5.3
Dependency Injection with PHP 5.3Dependency Injection with PHP 5.3
Dependency Injection with PHP 5.3Fabien Potencier
 
Scaling Symfony2 apps with RabbitMQ - Symfony UK Meetup
Scaling Symfony2 apps with RabbitMQ - Symfony UK MeetupScaling Symfony2 apps with RabbitMQ - Symfony UK Meetup
Scaling Symfony2 apps with RabbitMQ - Symfony UK MeetupKacper Gunia
 
Dependency Injection Smells
Dependency Injection SmellsDependency Injection Smells
Dependency Injection SmellsMatthias Noback
 
The Zen of Lithium
The Zen of LithiumThe Zen of Lithium
The Zen of LithiumNate Abele
 
Symfony Messenger (Symfony Live San Francisco)
Symfony Messenger (Symfony Live San Francisco)Symfony Messenger (Symfony Live San Francisco)
Symfony Messenger (Symfony Live San Francisco)Samuel ROZE
 
The state of hooking into Drupal - DrupalCon Dublin
The state of hooking into Drupal - DrupalCon DublinThe state of hooking into Drupal - DrupalCon Dublin
The state of hooking into Drupal - DrupalCon DublinNida Ismail Shah
 

What's hot (20)

New Symfony Tips & Tricks (SymfonyCon Paris 2015)
New Symfony Tips & Tricks (SymfonyCon Paris 2015)New Symfony Tips & Tricks (SymfonyCon Paris 2015)
New Symfony Tips & Tricks (SymfonyCon Paris 2015)
 
Symfony 2
Symfony 2Symfony 2
Symfony 2
 
Symfony tips and tricks
Symfony tips and tricksSymfony tips and tricks
Symfony tips and tricks
 
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
 
How Kris Writes Symfony Apps
How Kris Writes Symfony AppsHow Kris Writes Symfony Apps
How Kris Writes Symfony Apps
 
Speed up your developments with Symfony2
Speed up your developments with Symfony2Speed up your developments with Symfony2
Speed up your developments with Symfony2
 
Advanced Interfaces and Repositories in Laravel
Advanced Interfaces and Repositories in LaravelAdvanced Interfaces and Repositories in Laravel
Advanced Interfaces and Repositories in Laravel
 
Symfony Guard Authentication: Fun with API Token, Social Login, JWT and more
Symfony Guard Authentication: Fun with API Token, Social Login, JWT and moreSymfony Guard Authentication: Fun with API Token, Social Login, JWT and more
Symfony Guard Authentication: Fun with API Token, Social Login, JWT and more
 
Hooks and Events in Drupal 8
Hooks and Events in Drupal 8Hooks and Events in Drupal 8
Hooks and Events in Drupal 8
 
Phpne august-2012-symfony-components-friends
Phpne august-2012-symfony-components-friendsPhpne august-2012-symfony-components-friends
Phpne august-2012-symfony-components-friends
 
CodeIgniter 3.0
CodeIgniter 3.0CodeIgniter 3.0
CodeIgniter 3.0
 
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
 
Phinx talk
Phinx talkPhinx talk
Phinx talk
 
Dependency Injection with PHP 5.3
Dependency Injection with PHP 5.3Dependency Injection with PHP 5.3
Dependency Injection with PHP 5.3
 
Scaling Symfony2 apps with RabbitMQ - Symfony UK Meetup
Scaling Symfony2 apps with RabbitMQ - Symfony UK MeetupScaling Symfony2 apps with RabbitMQ - Symfony UK Meetup
Scaling Symfony2 apps with RabbitMQ - Symfony UK Meetup
 
Dependency Injection Smells
Dependency Injection SmellsDependency Injection Smells
Dependency Injection Smells
 
Getting Started-with-Laravel
Getting Started-with-LaravelGetting Started-with-Laravel
Getting Started-with-Laravel
 
The Zen of Lithium
The Zen of LithiumThe Zen of Lithium
The Zen of Lithium
 
Symfony Messenger (Symfony Live San Francisco)
Symfony Messenger (Symfony Live San Francisco)Symfony Messenger (Symfony Live San Francisco)
Symfony Messenger (Symfony Live San Francisco)
 
The state of hooking into Drupal - DrupalCon Dublin
The state of hooking into Drupal - DrupalCon DublinThe state of hooking into Drupal - DrupalCon Dublin
The state of hooking into Drupal - DrupalCon Dublin
 

Viewers also liked

Prezentacja firmy Lufthansa Systems Poland podczas II edycji Future3
Prezentacja firmy Lufthansa Systems Poland podczas II edycji Future3Prezentacja firmy Lufthansa Systems Poland podczas II edycji Future3
Prezentacja firmy Lufthansa Systems Poland podczas II edycji Future33camp
 
Chmura nieuchronnym elementem Twojego IT w (nie)dalekiej przyszłości. Śmierte...
Chmura nieuchronnym elementem Twojego IT w (nie)dalekiej przyszłości. Śmierte...Chmura nieuchronnym elementem Twojego IT w (nie)dalekiej przyszłości. Śmierte...
Chmura nieuchronnym elementem Twojego IT w (nie)dalekiej przyszłości. Śmierte...3camp
 
Gra no damage no fun
Gra no damage no funGra no damage no fun
Gra no damage no fun3camp
 
Netresearch
NetresearchNetresearch
Netresearch3camp
 
Prezentacja Gdańskiego Parku Naukowo-Technologicznego
Prezentacja Gdańskiego Parku Naukowo-Technologicznego Prezentacja Gdańskiego Parku Naukowo-Technologicznego
Prezentacja Gdańskiego Parku Naukowo-Technologicznego 3camp
 
Marketing polityczny
Marketing politycznyMarketing polityczny
Marketing polityczny3camp
 
Jak reanimować kampanie email marketingowe dzięki segmentacji?
Jak reanimować kampanie email marketingowe dzięki segmentacji?Jak reanimować kampanie email marketingowe dzięki segmentacji?
Jak reanimować kampanie email marketingowe dzięki segmentacji?3camp
 
Fuzzing
FuzzingFuzzing
Fuzzing3camp
 
Prezentacja firmy Acxiom podczas II edycji Future3
Prezentacja firmy Acxiom podczas II edycji Future3Prezentacja firmy Acxiom podczas II edycji Future3
Prezentacja firmy Acxiom podczas II edycji Future33camp
 
… I ŚWIAT SIĘ ZNOWU KRĘCI!
… I ŚWIAT SIĘ ZNOWU KRĘCI!… I ŚWIAT SIĘ ZNOWU KRĘCI!
… I ŚWIAT SIĘ ZNOWU KRĘCI!3camp
 
Panda Update
Panda UpdatePanda Update
Panda Update3camp
 
Virtual Recruiter – zwycięzca Startup Weekend Trójmiasto. Od pomysłu do biznesu
Virtual Recruiter – zwycięzca Startup Weekend Trójmiasto. Od pomysłu do biznesuVirtual Recruiter – zwycięzca Startup Weekend Trójmiasto. Od pomysłu do biznesu
Virtual Recruiter – zwycięzca Startup Weekend Trójmiasto. Od pomysłu do biznesu3camp
 
Gobarbra
GobarbraGobarbra
Gobarbra3camp
 
Mobile Game Development Process
Mobile Game Development ProcessMobile Game Development Process
Mobile Game Development Process3camp
 
Łukasz Brzeziński - Jak zarabiać z Wikingami? Czyli monetyzacja portalu inter...
Łukasz Brzeziński - Jak zarabiać z Wikingami? Czyli monetyzacja portalu inter...Łukasz Brzeziński - Jak zarabiać z Wikingami? Czyli monetyzacja portalu inter...
Łukasz Brzeziński - Jak zarabiać z Wikingami? Czyli monetyzacja portalu inter...3camp
 
Aplikacja po drugiej stronie lustra, czyli rzeczywistość o magię rozszerzona.
 Aplikacja po drugiej stronie lustra, czyli rzeczywistość o magię rozszerzona. Aplikacja po drugiej stronie lustra, czyli rzeczywistość o magię rozszerzona.
Aplikacja po drugiej stronie lustra, czyli rzeczywistość o magię rozszerzona.3camp
 
Multiplatformowosc w technologiach mobilnych
Multiplatformowosc w technologiach mobilnychMultiplatformowosc w technologiach mobilnych
Multiplatformowosc w technologiach mobilnych3camp
 
JSON, REST API
JSON, REST APIJSON, REST API
JSON, REST API3camp
 
Going global from Eastern Europe
Going global from Eastern EuropeGoing global from Eastern Europe
Going global from Eastern Europe3camp
 
Inwestowanie w technologie mobilne z punktu widzenia funduszu VC.
Inwestowanie w technologie mobilne z punktu widzenia funduszu VC.Inwestowanie w technologie mobilne z punktu widzenia funduszu VC.
Inwestowanie w technologie mobilne z punktu widzenia funduszu VC.3camp
 

Viewers also liked (20)

Prezentacja firmy Lufthansa Systems Poland podczas II edycji Future3
Prezentacja firmy Lufthansa Systems Poland podczas II edycji Future3Prezentacja firmy Lufthansa Systems Poland podczas II edycji Future3
Prezentacja firmy Lufthansa Systems Poland podczas II edycji Future3
 
Chmura nieuchronnym elementem Twojego IT w (nie)dalekiej przyszłości. Śmierte...
Chmura nieuchronnym elementem Twojego IT w (nie)dalekiej przyszłości. Śmierte...Chmura nieuchronnym elementem Twojego IT w (nie)dalekiej przyszłości. Śmierte...
Chmura nieuchronnym elementem Twojego IT w (nie)dalekiej przyszłości. Śmierte...
 
Gra no damage no fun
Gra no damage no funGra no damage no fun
Gra no damage no fun
 
Netresearch
NetresearchNetresearch
Netresearch
 
Prezentacja Gdańskiego Parku Naukowo-Technologicznego
Prezentacja Gdańskiego Parku Naukowo-Technologicznego Prezentacja Gdańskiego Parku Naukowo-Technologicznego
Prezentacja Gdańskiego Parku Naukowo-Technologicznego
 
Marketing polityczny
Marketing politycznyMarketing polityczny
Marketing polityczny
 
Jak reanimować kampanie email marketingowe dzięki segmentacji?
Jak reanimować kampanie email marketingowe dzięki segmentacji?Jak reanimować kampanie email marketingowe dzięki segmentacji?
Jak reanimować kampanie email marketingowe dzięki segmentacji?
 
Fuzzing
FuzzingFuzzing
Fuzzing
 
Prezentacja firmy Acxiom podczas II edycji Future3
Prezentacja firmy Acxiom podczas II edycji Future3Prezentacja firmy Acxiom podczas II edycji Future3
Prezentacja firmy Acxiom podczas II edycji Future3
 
… I ŚWIAT SIĘ ZNOWU KRĘCI!
… I ŚWIAT SIĘ ZNOWU KRĘCI!… I ŚWIAT SIĘ ZNOWU KRĘCI!
… I ŚWIAT SIĘ ZNOWU KRĘCI!
 
Panda Update
Panda UpdatePanda Update
Panda Update
 
Virtual Recruiter – zwycięzca Startup Weekend Trójmiasto. Od pomysłu do biznesu
Virtual Recruiter – zwycięzca Startup Weekend Trójmiasto. Od pomysłu do biznesuVirtual Recruiter – zwycięzca Startup Weekend Trójmiasto. Od pomysłu do biznesu
Virtual Recruiter – zwycięzca Startup Weekend Trójmiasto. Od pomysłu do biznesu
 
Gobarbra
GobarbraGobarbra
Gobarbra
 
Mobile Game Development Process
Mobile Game Development ProcessMobile Game Development Process
Mobile Game Development Process
 
Łukasz Brzeziński - Jak zarabiać z Wikingami? Czyli monetyzacja portalu inter...
Łukasz Brzeziński - Jak zarabiać z Wikingami? Czyli monetyzacja portalu inter...Łukasz Brzeziński - Jak zarabiać z Wikingami? Czyli monetyzacja portalu inter...
Łukasz Brzeziński - Jak zarabiać z Wikingami? Czyli monetyzacja portalu inter...
 
Aplikacja po drugiej stronie lustra, czyli rzeczywistość o magię rozszerzona.
 Aplikacja po drugiej stronie lustra, czyli rzeczywistość o magię rozszerzona. Aplikacja po drugiej stronie lustra, czyli rzeczywistość o magię rozszerzona.
Aplikacja po drugiej stronie lustra, czyli rzeczywistość o magię rozszerzona.
 
Multiplatformowosc w technologiach mobilnych
Multiplatformowosc w technologiach mobilnychMultiplatformowosc w technologiach mobilnych
Multiplatformowosc w technologiach mobilnych
 
JSON, REST API
JSON, REST APIJSON, REST API
JSON, REST API
 
Going global from Eastern Europe
Going global from Eastern EuropeGoing global from Eastern Europe
Going global from Eastern Europe
 
Inwestowanie w technologie mobilne z punktu widzenia funduszu VC.
Inwestowanie w technologie mobilne z punktu widzenia funduszu VC.Inwestowanie w technologie mobilne z punktu widzenia funduszu VC.
Inwestowanie w technologie mobilne z punktu widzenia funduszu VC.
 

Similar to Osiąganie mądrej architektury z Symfony2

Build powerfull and smart web applications with Symfony2
Build powerfull and smart web applications with Symfony2Build powerfull and smart web applications with Symfony2
Build powerfull and smart web applications with Symfony2Hugo Hamon
 
Symfony2 - from the trenches
Symfony2 - from the trenchesSymfony2 - from the trenches
Symfony2 - from the trenchesLukas Smith
 
Harmonious Development: Via Vagrant and Puppet
Harmonious Development: Via Vagrant and PuppetHarmonious Development: Via Vagrant and Puppet
Harmonious Development: Via Vagrant and PuppetAchieve Internet
 
Codebits 2012 - Fast relational web site construction.
Codebits 2012 - Fast relational web site construction.Codebits 2012 - Fast relational web site construction.
Codebits 2012 - Fast relational web site construction.Nelson Gomes
 
WebNet Conference 2012 - Designing complex applications using html5 and knock...
WebNet Conference 2012 - Designing complex applications using html5 and knock...WebNet Conference 2012 - Designing complex applications using html5 and knock...
WebNet Conference 2012 - Designing complex applications using html5 and knock...Fabio Franzini
 
Domain Driven Design using Laravel
Domain Driven Design using LaravelDomain Driven Design using Laravel
Domain Driven Design using Laravelwajrcs
 
Exploring Symfony's Code
Exploring Symfony's CodeExploring Symfony's Code
Exploring Symfony's CodeWildan Maulana
 
Simplify your professional web development with symfony
Simplify your professional web development with symfonySimplify your professional web development with symfony
Simplify your professional web development with symfonyFrancois Zaninotto
 
Dependency injection in Drupal 8
Dependency injection in Drupal 8Dependency injection in Drupal 8
Dependency injection in Drupal 8Alexei Gorobets
 
[Srijan Wednesday Webinars] Ruling Drupal 8 with #d8rules
[Srijan Wednesday Webinars] Ruling Drupal 8 with #d8rules[Srijan Wednesday Webinars] Ruling Drupal 8 with #d8rules
[Srijan Wednesday Webinars] Ruling Drupal 8 with #d8rulesSrijan Technologies
 
What's New In Laravel 5
What's New In Laravel 5What's New In Laravel 5
What's New In Laravel 5Darren Craig
 
Whoops! Where did my architecture go?
Whoops! Where did my architecture go?Whoops! Where did my architecture go?
Whoops! Where did my architecture go?Oliver Gierke
 
Symfony2 from the Trenches
Symfony2 from the TrenchesSymfony2 from the Trenches
Symfony2 from the TrenchesJonathan Wage
 
Grâce aux tags Varnish, j'ai switché ma prod sur Raspberry Pi
Grâce aux tags Varnish, j'ai switché ma prod sur Raspberry PiGrâce aux tags Varnish, j'ai switché ma prod sur Raspberry Pi
Grâce aux tags Varnish, j'ai switché ma prod sur Raspberry PiJérémy Derussé
 
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
 
SymfonyCon Berlin 2016 - Symfony Plugin for PhpStorm - 3 years later
SymfonyCon Berlin 2016 - Symfony Plugin for PhpStorm - 3 years laterSymfonyCon Berlin 2016 - Symfony Plugin for PhpStorm - 3 years later
SymfonyCon Berlin 2016 - Symfony Plugin for PhpStorm - 3 years laterHaehnchen
 
Burn down the silos! Helping dev and ops gel on high availability websites
Burn down the silos! Helping dev and ops gel on high availability websitesBurn down the silos! Helping dev and ops gel on high availability websites
Burn down the silos! Helping dev and ops gel on high availability websitesLindsay Holmwood
 

Similar to Osiąganie mądrej architektury z Symfony2 (20)

Build powerfull and smart web applications with Symfony2
Build powerfull and smart web applications with Symfony2Build powerfull and smart web applications with Symfony2
Build powerfull and smart web applications with Symfony2
 
Symfony2 - from the trenches
Symfony2 - from the trenchesSymfony2 - from the trenches
Symfony2 - from the trenches
 
Harmonious Development: Via Vagrant and Puppet
Harmonious Development: Via Vagrant and PuppetHarmonious Development: Via Vagrant and Puppet
Harmonious Development: Via Vagrant and Puppet
 
Codebits 2012 - Fast relational web site construction.
Codebits 2012 - Fast relational web site construction.Codebits 2012 - Fast relational web site construction.
Codebits 2012 - Fast relational web site construction.
 
WebNet Conference 2012 - Designing complex applications using html5 and knock...
WebNet Conference 2012 - Designing complex applications using html5 and knock...WebNet Conference 2012 - Designing complex applications using html5 and knock...
WebNet Conference 2012 - Designing complex applications using html5 and knock...
 
Domain Driven Design using Laravel
Domain Driven Design using LaravelDomain Driven Design using Laravel
Domain Driven Design using Laravel
 
Exploring Symfony's Code
Exploring Symfony's CodeExploring Symfony's Code
Exploring Symfony's Code
 
Simplify your professional web development with symfony
Simplify your professional web development with symfonySimplify your professional web development with symfony
Simplify your professional web development with symfony
 
Dependency injection in Drupal 8
Dependency injection in Drupal 8Dependency injection in Drupal 8
Dependency injection in Drupal 8
 
Intro to Laravel 4
Intro to Laravel 4Intro to Laravel 4
Intro to Laravel 4
 
[Srijan Wednesday Webinars] Ruling Drupal 8 with #d8rules
[Srijan Wednesday Webinars] Ruling Drupal 8 with #d8rules[Srijan Wednesday Webinars] Ruling Drupal 8 with #d8rules
[Srijan Wednesday Webinars] Ruling Drupal 8 with #d8rules
 
What's New In Laravel 5
What's New In Laravel 5What's New In Laravel 5
What's New In Laravel 5
 
Whoops! Where did my architecture go?
Whoops! Where did my architecture go?Whoops! Where did my architecture go?
Whoops! Where did my architecture go?
 
Ruby For Startups
Ruby For StartupsRuby For Startups
Ruby For Startups
 
WebGUI Developers Workshop
WebGUI Developers WorkshopWebGUI Developers Workshop
WebGUI Developers Workshop
 
Symfony2 from the Trenches
Symfony2 from the TrenchesSymfony2 from the Trenches
Symfony2 from the Trenches
 
Grâce aux tags Varnish, j'ai switché ma prod sur Raspberry Pi
Grâce aux tags Varnish, j'ai switché ma prod sur Raspberry PiGrâce aux tags Varnish, j'ai switché ma prod sur Raspberry Pi
Grâce aux tags Varnish, j'ai switché ma prod sur Raspberry Pi
 
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)
 
SymfonyCon Berlin 2016 - Symfony Plugin for PhpStorm - 3 years later
SymfonyCon Berlin 2016 - Symfony Plugin for PhpStorm - 3 years laterSymfonyCon Berlin 2016 - Symfony Plugin for PhpStorm - 3 years later
SymfonyCon Berlin 2016 - Symfony Plugin for PhpStorm - 3 years later
 
Burn down the silos! Helping dev and ops gel on high availability websites
Burn down the silos! Helping dev and ops gel on high availability websitesBurn down the silos! Helping dev and ops gel on high availability websites
Burn down the silos! Helping dev and ops gel on high availability websites
 

More from 3camp

Ochrona podatnych webaplikacji za pomocą wirtualnych poprawek
Ochrona podatnych webaplikacji za pomocą wirtualnych poprawekOchrona podatnych webaplikacji za pomocą wirtualnych poprawek
Ochrona podatnych webaplikacji za pomocą wirtualnych poprawek3camp
 
HTTPS bez wymówek
HTTPS bez wymówekHTTPS bez wymówek
HTTPS bez wymówek3camp
 
Jak udokumentować bazę danych
Jak udokumentować bazę danychJak udokumentować bazę danych
Jak udokumentować bazę danych3camp
 
ORM - tuningujemy podejście do mapowania
ORM - tuningujemy podejście do mapowaniaORM - tuningujemy podejście do mapowania
ORM - tuningujemy podejście do mapowania3camp
 
No pressure, no diamonds. Rzecz o łamaniu zasad w projektach.
No pressure, no diamonds. Rzecz o łamaniu zasad w projektach.No pressure, no diamonds. Rzecz o łamaniu zasad w projektach.
No pressure, no diamonds. Rzecz o łamaniu zasad w projektach.3camp
 
W poszukiwaniu procesu doskonałego. Wdrożenie Scruma, Continuous Integrations...
W poszukiwaniu procesu doskonałego. Wdrożenie Scruma, Continuous Integrations...W poszukiwaniu procesu doskonałego. Wdrożenie Scruma, Continuous Integrations...
W poszukiwaniu procesu doskonałego. Wdrożenie Scruma, Continuous Integrations...3camp
 
Wykorzystanie języka Kotlin do aplikacji na platformie Android
Wykorzystanie języka Kotlin do aplikacji na platformie AndroidWykorzystanie języka Kotlin do aplikacji na platformie Android
Wykorzystanie języka Kotlin do aplikacji na platformie Android3camp
 
Learn you some rx for the greater good
Learn you some rx for the greater goodLearn you some rx for the greater good
Learn you some rx for the greater good3camp
 
Google App Engine i Google Play Services w Twoich aplikacjach
Google App Engine i Google Play Services w Twoich aplikacjachGoogle App Engine i Google Play Services w Twoich aplikacjach
Google App Engine i Google Play Services w Twoich aplikacjach3camp
 
Reakcja łańcuchowa, czyli React.js w praktyce
Reakcja łańcuchowa, czyli React.js w praktyceReakcja łańcuchowa, czyli React.js w praktyce
Reakcja łańcuchowa, czyli React.js w praktyce3camp
 
Odtwarzanie multimediów w HTML5, czyli Player przez duże „P”
Odtwarzanie multimediów w HTML5, czyli Player przez duże „P”Odtwarzanie multimediów w HTML5, czyli Player przez duże „P”
Odtwarzanie multimediów w HTML5, czyli Player przez duże „P”3camp
 
AngularJS (nie) nadaje się do dużego projektu
AngularJS (nie) nadaje się do dużego projektuAngularJS (nie) nadaje się do dużego projektu
AngularJS (nie) nadaje się do dużego projektu3camp
 
Przemysław Bartkowiak - Sam ustalasz ile za to zapłacisz – czyli nowy wymiar ...
Przemysław Bartkowiak - Sam ustalasz ile za to zapłacisz – czyli nowy wymiar ...Przemysław Bartkowiak - Sam ustalasz ile za to zapłacisz – czyli nowy wymiar ...
Przemysław Bartkowiak - Sam ustalasz ile za to zapłacisz – czyli nowy wymiar ...3camp
 
Mirek Wąsowicz - Segment jednego, dokąd zmierza marketing online?
Mirek Wąsowicz - Segment jednego, dokąd zmierza marketing online?Mirek Wąsowicz - Segment jednego, dokąd zmierza marketing online?
Mirek Wąsowicz - Segment jednego, dokąd zmierza marketing online?3camp
 
Artur Senk, OKE Poland, Big Data na zakupach
Artur Senk, OKE Poland, Big Data na zakupachArtur Senk, OKE Poland, Big Data na zakupach
Artur Senk, OKE Poland, Big Data na zakupach3camp
 
Piotr Macuk, Konfeo.com, Programista i biznes – plusy i minusy własnej działa...
Piotr Macuk, Konfeo.com, Programista i biznes – plusy i minusy własnej działa...Piotr Macuk, Konfeo.com, Programista i biznes – plusy i minusy własnej działa...
Piotr Macuk, Konfeo.com, Programista i biznes – plusy i minusy własnej działa...3camp
 
Marcin Maj, Kainos - QA – wartko, zmiennie i interdyscyplinarnie
Marcin Maj, Kainos - QA – wartko, zmiennie i interdyscyplinarnieMarcin Maj, Kainos - QA – wartko, zmiennie i interdyscyplinarnie
Marcin Maj, Kainos - QA – wartko, zmiennie i interdyscyplinarnie3camp
 
Jak przesiąść się na rower na dwóch kółkach? Od trzyosobowego startupu do spó...
Jak przesiąść się na rower na dwóch kółkach? Od trzyosobowego startupu do spó...Jak przesiąść się na rower na dwóch kółkach? Od trzyosobowego startupu do spó...
Jak przesiąść się na rower na dwóch kółkach? Od trzyosobowego startupu do spó...3camp
 
Marcin Szeląg, InnovationNest, Startup Risk Model
Marcin Szeląg, InnovationNest, Startup Risk ModelMarcin Szeląg, InnovationNest, Startup Risk Model
Marcin Szeląg, InnovationNest, Startup Risk Model3camp
 
Ostatnia faza produktu: co się dzieję kiedy programista zakończył swoje zadanie
Ostatnia faza produktu: co się dzieję kiedy programista zakończył swoje zadanieOstatnia faza produktu: co się dzieję kiedy programista zakończył swoje zadanie
Ostatnia faza produktu: co się dzieję kiedy programista zakończył swoje zadanie3camp
 

More from 3camp (20)

Ochrona podatnych webaplikacji za pomocą wirtualnych poprawek
Ochrona podatnych webaplikacji za pomocą wirtualnych poprawekOchrona podatnych webaplikacji za pomocą wirtualnych poprawek
Ochrona podatnych webaplikacji za pomocą wirtualnych poprawek
 
HTTPS bez wymówek
HTTPS bez wymówekHTTPS bez wymówek
HTTPS bez wymówek
 
Jak udokumentować bazę danych
Jak udokumentować bazę danychJak udokumentować bazę danych
Jak udokumentować bazę danych
 
ORM - tuningujemy podejście do mapowania
ORM - tuningujemy podejście do mapowaniaORM - tuningujemy podejście do mapowania
ORM - tuningujemy podejście do mapowania
 
No pressure, no diamonds. Rzecz o łamaniu zasad w projektach.
No pressure, no diamonds. Rzecz o łamaniu zasad w projektach.No pressure, no diamonds. Rzecz o łamaniu zasad w projektach.
No pressure, no diamonds. Rzecz o łamaniu zasad w projektach.
 
W poszukiwaniu procesu doskonałego. Wdrożenie Scruma, Continuous Integrations...
W poszukiwaniu procesu doskonałego. Wdrożenie Scruma, Continuous Integrations...W poszukiwaniu procesu doskonałego. Wdrożenie Scruma, Continuous Integrations...
W poszukiwaniu procesu doskonałego. Wdrożenie Scruma, Continuous Integrations...
 
Wykorzystanie języka Kotlin do aplikacji na platformie Android
Wykorzystanie języka Kotlin do aplikacji na platformie AndroidWykorzystanie języka Kotlin do aplikacji na platformie Android
Wykorzystanie języka Kotlin do aplikacji na platformie Android
 
Learn you some rx for the greater good
Learn you some rx for the greater goodLearn you some rx for the greater good
Learn you some rx for the greater good
 
Google App Engine i Google Play Services w Twoich aplikacjach
Google App Engine i Google Play Services w Twoich aplikacjachGoogle App Engine i Google Play Services w Twoich aplikacjach
Google App Engine i Google Play Services w Twoich aplikacjach
 
Reakcja łańcuchowa, czyli React.js w praktyce
Reakcja łańcuchowa, czyli React.js w praktyceReakcja łańcuchowa, czyli React.js w praktyce
Reakcja łańcuchowa, czyli React.js w praktyce
 
Odtwarzanie multimediów w HTML5, czyli Player przez duże „P”
Odtwarzanie multimediów w HTML5, czyli Player przez duże „P”Odtwarzanie multimediów w HTML5, czyli Player przez duże „P”
Odtwarzanie multimediów w HTML5, czyli Player przez duże „P”
 
AngularJS (nie) nadaje się do dużego projektu
AngularJS (nie) nadaje się do dużego projektuAngularJS (nie) nadaje się do dużego projektu
AngularJS (nie) nadaje się do dużego projektu
 
Przemysław Bartkowiak - Sam ustalasz ile za to zapłacisz – czyli nowy wymiar ...
Przemysław Bartkowiak - Sam ustalasz ile za to zapłacisz – czyli nowy wymiar ...Przemysław Bartkowiak - Sam ustalasz ile za to zapłacisz – czyli nowy wymiar ...
Przemysław Bartkowiak - Sam ustalasz ile za to zapłacisz – czyli nowy wymiar ...
 
Mirek Wąsowicz - Segment jednego, dokąd zmierza marketing online?
Mirek Wąsowicz - Segment jednego, dokąd zmierza marketing online?Mirek Wąsowicz - Segment jednego, dokąd zmierza marketing online?
Mirek Wąsowicz - Segment jednego, dokąd zmierza marketing online?
 
Artur Senk, OKE Poland, Big Data na zakupach
Artur Senk, OKE Poland, Big Data na zakupachArtur Senk, OKE Poland, Big Data na zakupach
Artur Senk, OKE Poland, Big Data na zakupach
 
Piotr Macuk, Konfeo.com, Programista i biznes – plusy i minusy własnej działa...
Piotr Macuk, Konfeo.com, Programista i biznes – plusy i minusy własnej działa...Piotr Macuk, Konfeo.com, Programista i biznes – plusy i minusy własnej działa...
Piotr Macuk, Konfeo.com, Programista i biznes – plusy i minusy własnej działa...
 
Marcin Maj, Kainos - QA – wartko, zmiennie i interdyscyplinarnie
Marcin Maj, Kainos - QA – wartko, zmiennie i interdyscyplinarnieMarcin Maj, Kainos - QA – wartko, zmiennie i interdyscyplinarnie
Marcin Maj, Kainos - QA – wartko, zmiennie i interdyscyplinarnie
 
Jak przesiąść się na rower na dwóch kółkach? Od trzyosobowego startupu do spó...
Jak przesiąść się na rower na dwóch kółkach? Od trzyosobowego startupu do spó...Jak przesiąść się na rower na dwóch kółkach? Od trzyosobowego startupu do spó...
Jak przesiąść się na rower na dwóch kółkach? Od trzyosobowego startupu do spó...
 
Marcin Szeląg, InnovationNest, Startup Risk Model
Marcin Szeląg, InnovationNest, Startup Risk ModelMarcin Szeląg, InnovationNest, Startup Risk Model
Marcin Szeląg, InnovationNest, Startup Risk Model
 
Ostatnia faza produktu: co się dzieję kiedy programista zakończył swoje zadanie
Ostatnia faza produktu: co się dzieję kiedy programista zakończył swoje zadanieOstatnia faza produktu: co się dzieję kiedy programista zakończył swoje zadanie
Ostatnia faza produktu: co się dzieję kiedy programista zakończył swoje zadanie
 

Osiąganie mądrej architektury z Symfony2