SlideShare a Scribd company logo
1 of 89
Download to read offline
How to build customizable
multitenant web applications
Multitenant web applications

 About me

  Stephan Hochdörfer, bitExpert AG
  Department Manager Research Labs
  enjoying PHP since 1999
  S.Hochdoerfer@bitExpert.de
  @shochdoerfer
Multitenant web applications

 Single Tenancy
Multitenant web applications




     Developer                 vs.   Businessman
Multitenant web applications

 Single Tenancy – more customers
Multitenant web applications

 Single Tenancy – even more customers
Multitenant web applications

 Where will this lead to?
Multitenant web applications




 Maintenance nightmare!
Multitenant web applications

 Single Tenancy

                            Tenant 1



                           Application


                           Database



                           Hardware
Multitenant web applications

 Single Tenancy

            Tenant 1       Tenant 2      Tenant 3



           Application    Application   Application


           Database        Database     Database



           Hardware        Hardware     Hardware
Multitenant web applications

 Multi Tenancy

            Tenant 1       Tenant 2     Tenant 3



                          Application


                           Database



                           Hardware
Multitenant web applications

 What should be customizable?
Multitenant web applications

 What should be customizable?

            Tenant 1       Tenant 2     Tenant 3



                          Application


                           Database



                           Hardware
Multitenant web applications

 What should be customizable?

            Tenant 1       Tenant 2     Tenant 3



                          Application


                           Database



                           Hardware
Multitenant web applications

 How to skin an application?
Multitenant web applications

 How to skin an application?




                  Remember:
            It`s a web application!
Multitenant web applications

 How to skin an application?




                               HTML
Multitenant web applications

 How to skin an application?




                      HTML + CSS
Multitenant web applications
Multitenant web applications
Multitenant web applications
Multitenant web applications

 How to customize?
 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0
 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-
 strict.dtd">
 <html xmlns="http://www.w3.org/1999/xhtml">
 <head>
   <title>My App</title>
   <meta http-equiv="Content-Type" content="text/html;
 charset=utf-8" />
   <link rel="stylesheet" type="text/css"
 href="css/styles/myapp.css" />
 </head>
 <body>
 </body>
 </html>
Multitenant web applications

 How to customize?
 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
 "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
 <html xmlns="http://www.w3.org/1999/xhtml">
 <head>
   <title>My App</title>
   <meta http-equiv="Content-Type" content="text/html;
 charset=utf-8" />
   <link rel="stylesheet" type="text/css"
 href="css/styles/<?php echo $tenant ?>.css" />
 </head>
 <body>
 </body>
 </html>
Multitenant web applications

 How to customize?
 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0
 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-
 strict.dtd">
 <html xmlns="http://www.w3.org/1999/xhtml">
 <head>
   <title>My App</title>
   <meta http-equiv="Content-Type" content="text/html;
 charset=utf-8" />
   <link rel="stylesheet" type="text/css"
 href="css/styles/myapp.css" />
   <link rel="stylesheet" type="text/css"
 href="css/styles/<?php echo $tenant ?>.css" />
 </head>
 <body>
 </body>
 </html>
Multitenant web applications

 Feature driven CSS




              Wait, there`s more...
Multitenant web applications

 Feature driven CSS




                     display: none
Multitenant web applications

 This is not an security advice!
Multitenant web applications

 Next level...
Multitenant web applications

 Menubar generation
 <?php

 if($user->hasEnabled(Module::ORDERMANAGEMENT))
 {
   if($user->canAccess(OrderManagement::LIST_ORDERS))
   {
     $this->renderLink(OrderManagement::LIST_ORDERS);
   }

     if($user->canAccess(OrderManagement::ADD_ORDER))
     {
       $this->renderLink(OrderManagement::ADD_ORDER);
     }
 }
Multitenant web applications

 Menubar generation
 <?php

 if($tenant->hasModule(Module::ORDERMANAGEMENT)
 {
   if($user->hasEnabled(Module::ORDERMANAGEMENT))
   {
     if($user->canAccess(OrderManagement::LIST_ORDERS))
     {
       $this->renderLink(OrderManagement::LIST_ORDERS);
     }

         if($user->canAccess(OrderManagement::ADD_ORDER))
         {
           $this->renderLink(OrderManagement::ADD_ORDER);
         }
     }
 }
Multitenant web applications

 Menubar generation




                      Modularize!
Multitenant web applications

 Menubar generation



           Module 1        Module 2       Module 3

                                                register at start up


                       Application core
Multitenant web applications

 Menubar generation



           Module 1        Module 2       Module 3

                                                register at start up


                       Application core
Multitenant web applications

 Menubar generation



           Module 1        Module 2       Module 3

                                                register at start up


                       Application core
Multitenant web applications

 Optimize workflows
Multitenant web applications

 Optimize workflows
 <?php

 if('CC' == $paymentType)
 {
   // handle credit card payment
 }
 else if('COD' == $paymentType)
 {
   // handle cash on delivery payment
 }
Multitenant web applications

 Optimize workflows
 <?php

 if('CC' == $paymentType)
 {
   // handle credit card payment for some tenants!
   if(in_array($tenant->getName(), array('tenant1', 'tenant2'))
   {
     // insert logic here...
   }
 }
 else if('COD' == $paymentType)
 {
   // handle cash on delivery payment for some tenants!
 }
Multitenant web applications

 Optimize workflows




            Decouple functionality!
Multitenant web applications

 Optimize workflows
 <?php

 $paymentType = 'CC'; // set via request
 $payment     = PaymentFactory::create($paymentType);

 $payment->execute($order);
Multitenant web applications

 Optimize workflows
 <?php

 $paymentType = 'CC'; // set via request
 $payment     = PaymentFactory::create($paymentType, $tenant);

 $payment->execute($order);
Multitenant web applications

 Optimize workflows




          How to add custom logic?
Multitenant web applications

 Custom logic - Subclassing?

                           Abstract
                           Payment


                             CC
                           Payment


                CCPayment             CCPayment
                 Tenant 1              Tenant 2
Multitenant web applications

 Custom logic




                  Any alternatives?
Multitenant web applications

 Custom logic




                 Let`s add hooks...
Multitenant web applications

 Custom logic - Hooks
 <?php

 $paymentType = 'CC'; // set via request
 $payment     = PaymentFactory::create($paymentType, $tenant);

 $payment->execute($order);

 if($this->paymentPostProcessor instanceof
 IPaymentPostProcessor) {
   $this->paymentPostProcessor->run($payment, $tenant, $order);
 }
Multitenant web applications

 Custom logic




      How to set the dependencies?
Multitenant web applications

 Custom logic




             Dependency Injection!
Multitenant web applications

 Custom logic – Dependency Injection
 <?xml version="1.0" encoding="UTF-8" ?>
 <beans xmlns="http://www.bitexpert.de/schema"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://www.bitexpert.de/schema/
        http://www.bitexpert.de/schema/bitFramework-
 beans.xsd">

    <bean id="Service.Order" class="MyAppServiceOrder.php">
    </bean>

    <bean id="Tenant1.Order" class="MyAppServiceOrder.php">
        <property name="paymentPostProcessor"
          ref="Tentant1.Payment.SendOrderMail" />
    </bean>
 </beans>
Multitenant web applications

 Custom logic – Dependency Injection
 <?xml version="1.0" encoding="UTF-8" ?>
 <beans xmlns="http://www.bitexpert.de/schema"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://www.bitexpert.de/schema/
        http://www.bitexpert.de/schema/bitFramework-
 beans.xsd">

    <bean id="Tenant2.Order" class="MyAppServiceOrder.php">
        <property name="paymentPostProcessor"
          ref="Tentant1.Payment.PushToERP" />
    </bean>
 </beans>
Multitenant web applications

 Custom logic




         Any further improvements?
Multitenant web applications

 Custom logic
 <?php

 $paymentType = 'CC'; // set via request
 $payment     = PaymentFactory::create($paymentType, $tenant);

 $payment->execute($order);

 if($this->paymentPostProcessor instanceof
 IPaymentPostProcessor) {
   $this->paymentPostProcessor->run($payment, $tenant, $order);
 }
Multitenant web applications

 Custom logic
 <?php

 $paymentType = 'CC'; // set via request
 $payment     = PaymentFactory::create($paymentType, $tenant);

 $payment->execute($order);

 if($this->paymentPostProcessor instanceof
 IPaymentPostProcessor) {
   $this->paymentPostProcessor->run($payment, $tenant, $order);
 }
Multitenant web applications

 Custom logic




      Aspect-oriented programming
Multitenant web applications

 Custom logic – Aspects for the masses!
 /**
  * @aspect
  */
 class CustomPaymentProcessingAspect {
     /**
      * @around MyAppServiceOrder->processPayment
      */
     public function customFilter(JoinPointInterface $jP) {
         $result = $jP->getAdviceChain()->proceed($jP);

         // @TODO: implement post-processing logic

         return $result;
     }
 }
Multitenant web applications

 Custom logic - Result
 <?php

 $paymentType = 'CC'; // set via request
 $payment     = PaymentFactory::create($paymentType, $tenant);

 $payment->execute($order);
Multitenant web applications

 Next level...
Multitenant web applications

 Database – Where to store the data?
Multitenant web applications

 Database – Where to store the data?




             We need to store data
                 for a tenant!
Multitenant web applications

 Database – Where to store the data?


               Database per Tenant?
Multitenant web applications

 Database – Where to store the data?


               Database per Tenant?

                Schema per Tenant?
Multitenant web applications

 Database – Where to store the data?


               Database per Tenant?

                Schema per Tenant?

                 Tenant Id per Row?
Multitenant web applications

 Database – How to access the data?




                               vs.

              ORM                     dynamic
                                     statements
Multitenant web applications




                  Generalize you should!
Multitenant web applications

 No single solution!
Multitenant web applications

 Softwaresystemfamily
Multitenant web applications

 A factory for mass production!
Multitenant web applications

 Multi Tenancy – Single Instance

            Tenant 1           Tenant 2   Tenant 3



                           Application



                           Database



                           Hardware
Multitenant web applications

 Multi Tenancy – Multi Instance

            Tenant 1           Tenant 2   Tenant 3



                           Application



                           Database



                           Hardware
Multitenant web applications

 Multi Tenancy – Multi Instance




           Generative Programming
Multitenant web applications

 Generative Programming




                               Generator
                               Generator
Multitenant web applications

 Generative Programming

                               Configuration
                                Configuration
                                  (DSL)
                                   (DSL)




                               Generator
                               Generator
Multitenant web applications

 Generative Programming

                               Configuration
                                Configuration
                                  (DSL)
                                   (DSL)




   Implementation-
    Implementation-
     components
                               Generator
                               Generator
      components
Multitenant web applications

 Generative Programming

                               Configuration
                                Configuration
                                  (DSL)
                                   (DSL)



                                                1..n
   Implementation-
    Implementation-
     components
                               Generator
                               Generator          Product
      components                                   Product
Multitenant web applications

 Generative Programming

                               Configuration
                                Configuration
                                  (DSL)
                                   (DSL)




   Implementation-
    Implementation-
     components
                               Generator
                               Generator        Tenant 11
      components                                 Tenant
Multitenant web applications

 Generative Programming

                               Configuration
                                Configuration
                                  (DSL)
                                   (DSL)
                                                Tenant 22
                                                 Tenant



   Implementation-
    Implementation-
     components
                               Generator
                               Generator        Tenant 11
      components                                 Tenant
Multitenant web applications

 Generative Programming
                                                Tenant 33
                                                 Tenant

                               Configuration
                                Configuration
                                  (DSL)
                                   (DSL)
                                                Tenant 22
                                                 Tenant



   Implementation-
    Implementation-
     components
                               Generator
                               Generator        Tenant 11
      components                                 Tenant
Multitenant web applications

 Generative Programming - Goal




    Create an optimized application!
Multitenant web applications

 Generative Programming - Goal




          Create an optimized
        application for one tenant!
Multitenant web applications

 Generative Programming – Bonus points
Multitenant web applications

 Generative Programming – Bonus points




     Reduce application complexity
Multitenant web applications

 Generative Programming – Bonus points
 <?php

 $paymentType = 'CC'; // set via request
 $payment     = PaymentFactory::create($paymentType, $tenant);

 $payment->execute($order);

 <!{PostProcessor}!>
Multitenant web applications

 Generative Programming – Bonus points
 public class PostProcessorFrame extends SimpleFrameController
 {

     public void execute(Frame frame, FeatureConfig config) {
        if(config.hasFeature("order_send_mail")) {
          frame.setSlot("PostProcessor", "...");
        }

         if(config.hasFeature("order_push_to_erp")) {
           frame.setSlot("PostProcessor", "...");
         }
     }
 }
Multitenant web applications

 Generative Programming – Bonus points




      Reduce maintenance support
Multitenant web applications

 Generative Programming – Bonus points




                               Implementation
            Feature
                                 component
Multitenant web applications

 Generative Programming – Bonus points




            Feature            Tenant
Multitenant web applications

 Generative Programming – Bonus points

                               Tenant




                               Feature




                        Implementation
                          component
Multitenant web applications

 Generative Programming – The book
http://joind.in/3517
Flickr Credits
http://www.flickr.com/photos/andresrueda/3452940751/
http://www.flickr.com/photos/andresrueda/3455410635/

More Related Content

What's hot

Cloud Computing: Changing the software business
Cloud Computing: Changing the software businessCloud Computing: Changing the software business
Cloud Computing: Changing the software businessSoftware Park Thailand
 
Building infrastructure with Azure Resource Manager using PowerShell
Building infrastructure with Azure Resource Manager using PowerShell Building infrastructure with Azure Resource Manager using PowerShell
Building infrastructure with Azure Resource Manager using PowerShell K.Mohamed Faizal
 
Paying for PaaS
Paying for PaaSPaying for PaaS
Paying for PaaSWSO2
 
AWS Twin Cities Meetup - IAM Deep Dive
AWS Twin Cities Meetup - IAM Deep DiveAWS Twin Cities Meetup - IAM Deep Dive
AWS Twin Cities Meetup - IAM Deep DiveAdam Fokken
 
Azure SQL Database
Azure SQL Database Azure SQL Database
Azure SQL Database nj-azure
 
Windows Azure AppFabric
Windows Azure AppFabricWindows Azure AppFabric
Windows Azure AppFabricDavid Chou
 
Windsor AWS UG Deep dive IAM 2 - no json101
Windsor AWS UG   Deep dive IAM 2 - no json101Windsor AWS UG   Deep dive IAM 2 - no json101
Windsor AWS UG Deep dive IAM 2 - no json101Goran Karmisevic
 
(APP304) AWS CloudFormation Best Practices | AWS re:Invent 2014
(APP304) AWS CloudFormation Best Practices | AWS re:Invent 2014(APP304) AWS CloudFormation Best Practices | AWS re:Invent 2014
(APP304) AWS CloudFormation Best Practices | AWS re:Invent 2014Amazon Web Services
 
Secure Amazon EC2 Environment with AWS IAM & Resource-Based Permissions (CPN2...
Secure Amazon EC2 Environment with AWS IAM & Resource-Based Permissions (CPN2...Secure Amazon EC2 Environment with AWS IAM & Resource-Based Permissions (CPN2...
Secure Amazon EC2 Environment with AWS IAM & Resource-Based Permissions (CPN2...Amazon Web Services
 
Session 35 - Design Patterns
Session 35 - Design PatternsSession 35 - Design Patterns
Session 35 - Design PatternsPawanMM
 
HTML5 and the dawn of rich mobile web applications pt 1
HTML5 and the dawn of rich mobile web applications pt 1HTML5 and the dawn of rich mobile web applications pt 1
HTML5 and the dawn of rich mobile web applications pt 1James Pearce
 
Session 30 - Servlets - Part 6
Session 30 - Servlets - Part 6Session 30 - Servlets - Part 6
Session 30 - Servlets - Part 6PawanMM
 
HTML5 and CSS3 refresher
HTML5 and CSS3 refresherHTML5 and CSS3 refresher
HTML5 and CSS3 refresherIvano Malavolta
 
Azure in Developer Perspective
Azure in Developer PerspectiveAzure in Developer Perspective
Azure in Developer Perspectiverizaon
 
Bluemix paas 기반 saas 개발 사례
Bluemix paas 기반 saas 개발 사례Bluemix paas 기반 saas 개발 사례
Bluemix paas 기반 saas 개발 사례uEngine Solutions
 
Session 31 - Session Management, Best Practices, Design Patterns in Web Apps
Session 31 - Session Management, Best Practices, Design Patterns in Web AppsSession 31 - Session Management, Best Practices, Design Patterns in Web Apps
Session 31 - Session Management, Best Practices, Design Patterns in Web AppsPawanMM
 
Monitoring Containers at Scale - September Webinar Series
Monitoring Containers at Scale - September Webinar SeriesMonitoring Containers at Scale - September Webinar Series
Monitoring Containers at Scale - September Webinar SeriesAmazon Web Services
 

What's hot (20)

Cloud Computing: Changing the software business
Cloud Computing: Changing the software businessCloud Computing: Changing the software business
Cloud Computing: Changing the software business
 
Building infrastructure with Azure Resource Manager using PowerShell
Building infrastructure with Azure Resource Manager using PowerShell Building infrastructure with Azure Resource Manager using PowerShell
Building infrastructure with Azure Resource Manager using PowerShell
 
Paying for PaaS
Paying for PaaSPaying for PaaS
Paying for PaaS
 
AWS Twin Cities Meetup - IAM Deep Dive
AWS Twin Cities Meetup - IAM Deep DiveAWS Twin Cities Meetup - IAM Deep Dive
AWS Twin Cities Meetup - IAM Deep Dive
 
Azure SQL Database
Azure SQL Database Azure SQL Database
Azure SQL Database
 
Windows Azure AppFabric
Windows Azure AppFabricWindows Azure AppFabric
Windows Azure AppFabric
 
Windsor AWS UG Deep dive IAM 2 - no json101
Windsor AWS UG   Deep dive IAM 2 - no json101Windsor AWS UG   Deep dive IAM 2 - no json101
Windsor AWS UG Deep dive IAM 2 - no json101
 
(APP304) AWS CloudFormation Best Practices | AWS re:Invent 2014
(APP304) AWS CloudFormation Best Practices | AWS re:Invent 2014(APP304) AWS CloudFormation Best Practices | AWS re:Invent 2014
(APP304) AWS CloudFormation Best Practices | AWS re:Invent 2014
 
Secure Amazon EC2 Environment with AWS IAM & Resource-Based Permissions (CPN2...
Secure Amazon EC2 Environment with AWS IAM & Resource-Based Permissions (CPN2...Secure Amazon EC2 Environment with AWS IAM & Resource-Based Permissions (CPN2...
Secure Amazon EC2 Environment with AWS IAM & Resource-Based Permissions (CPN2...
 
Session 35 - Design Patterns
Session 35 - Design PatternsSession 35 - Design Patterns
Session 35 - Design Patterns
 
HTML5 and the dawn of rich mobile web applications pt 1
HTML5 and the dawn of rich mobile web applications pt 1HTML5 and the dawn of rich mobile web applications pt 1
HTML5 and the dawn of rich mobile web applications pt 1
 
Session 30 - Servlets - Part 6
Session 30 - Servlets - Part 6Session 30 - Servlets - Part 6
Session 30 - Servlets - Part 6
 
Policy Ninja
Policy NinjaPolicy Ninja
Policy Ninja
 
HTML5 and CSS3 refresher
HTML5 and CSS3 refresherHTML5 and CSS3 refresher
HTML5 and CSS3 refresher
 
Azure in Developer Perspective
Azure in Developer PerspectiveAzure in Developer Perspective
Azure in Developer Perspective
 
Bluemix paas 기반 saas 개발 사례
Bluemix paas 기반 saas 개발 사례Bluemix paas 기반 saas 개발 사례
Bluemix paas 기반 saas 개발 사례
 
Session 31 - Session Management, Best Practices, Design Patterns in Web Apps
Session 31 - Session Management, Best Practices, Design Patterns in Web AppsSession 31 - Session Management, Best Practices, Design Patterns in Web Apps
Session 31 - Session Management, Best Practices, Design Patterns in Web Apps
 
IAM Best Practices
IAM Best PracticesIAM Best Practices
IAM Best Practices
 
Monitoring Containers at Scale - September Webinar Series
Monitoring Containers at Scale - September Webinar SeriesMonitoring Containers at Scale - September Webinar Series
Monitoring Containers at Scale - September Webinar Series
 
IAM Introduction
IAM IntroductionIAM Introduction
IAM Introduction
 

Similar to How to build customizable multitenant web applications - IPC11 Spring Edition

How to build customizable multitenant web applications - PHPBNL11
How to build customizable multitenant web applications - PHPBNL11How to build customizable multitenant web applications - PHPBNL11
How to build customizable multitenant web applications - PHPBNL11Stephan Hochdörfer
 
Reactive Application Using METEOR
Reactive Application Using METEORReactive Application Using METEOR
Reactive Application Using METEORNodeXperts
 
Benefit of CodeIgniter php framework
Benefit of CodeIgniter php frameworkBenefit of CodeIgniter php framework
Benefit of CodeIgniter php frameworkBo-Yi Wu
 
Reactive application using meteor
Reactive application using meteorReactive application using meteor
Reactive application using meteorSapna Upreti
 
Vue micro frontend implementation patterns
Vue micro frontend implementation patternsVue micro frontend implementation patterns
Vue micro frontend implementation patternsAlbert Brand
 
Meteor Meet-up San Diego December 2014
Meteor Meet-up San Diego December 2014Meteor Meet-up San Diego December 2014
Meteor Meet-up San Diego December 2014Lou Sacco
 
The web - What it has, what it lacks and where it must go - Istanbul
The web - What it has, what it lacks and where it must go - IstanbulThe web - What it has, what it lacks and where it must go - Istanbul
The web - What it has, what it lacks and where it must go - IstanbulRobert Nyman
 
Busy Bee Application Develompent Platform
Busy Bee Application Develompent PlatformBusy Bee Application Develompent Platform
Busy Bee Application Develompent PlatformUtkarsh Shukla
 
Progressive web apps
Progressive web appsProgressive web apps
Progressive web appsFastly
 
[drupalday2017] - Drupal come frontend che consuma servizi: HTTP Client Manager
[drupalday2017] - Drupal come frontend che consuma servizi: HTTP Client Manager[drupalday2017] - Drupal come frontend che consuma servizi: HTTP Client Manager
[drupalday2017] - Drupal come frontend che consuma servizi: HTTP Client ManagerDrupalDay
 
Creating Rajanikant Powered Site
Creating Rajanikant Powered SiteCreating Rajanikant Powered Site
Creating Rajanikant Powered Sitemarkandey
 
Costruire applicazioni multi-tenant e piattaforme SaaS in PHP con Innomatic
Costruire applicazioni multi-tenant e piattaforme SaaS in PHP con InnomaticCostruire applicazioni multi-tenant e piattaforme SaaS in PHP con Innomatic
Costruire applicazioni multi-tenant e piattaforme SaaS in PHP con InnomaticInnoteam Srl
 
High Availability by Design
High Availability by DesignHigh Availability by Design
High Availability by DesignDavid Prinzing
 
Refacoring vs Rewriting WixStores
Refacoring vs Rewriting WixStoresRefacoring vs Rewriting WixStores
Refacoring vs Rewriting WixStoresDoron Rosenstock
 
Progressive Web Apps by Millicent Convento
Progressive Web Apps by Millicent ConventoProgressive Web Apps by Millicent Convento
Progressive Web Apps by Millicent ConventoDEVCON
 
FEDM Meetup: Introducing Mojito
FEDM Meetup: Introducing MojitoFEDM Meetup: Introducing Mojito
FEDM Meetup: Introducing MojitoCaridy Patino
 
Stephane Lapointe, Frank Boucher & Alexandre Brisebois: Les micro-services et...
Stephane Lapointe, Frank Boucher & Alexandre Brisebois: Les micro-services et...Stephane Lapointe, Frank Boucher & Alexandre Brisebois: Les micro-services et...
Stephane Lapointe, Frank Boucher & Alexandre Brisebois: Les micro-services et...MSDEVMTL
 
Deploying configurable frontend web application containers
Deploying configurable frontend web application containersDeploying configurable frontend web application containers
Deploying configurable frontend web application containersJosé Moreira
 

Similar to How to build customizable multitenant web applications - IPC11 Spring Edition (20)

How to build customizable multitenant web applications - PHPBNL11
How to build customizable multitenant web applications - PHPBNL11How to build customizable multitenant web applications - PHPBNL11
How to build customizable multitenant web applications - PHPBNL11
 
Reactive Application Using METEOR
Reactive Application Using METEORReactive Application Using METEOR
Reactive Application Using METEOR
 
Benefit of CodeIgniter php framework
Benefit of CodeIgniter php frameworkBenefit of CodeIgniter php framework
Benefit of CodeIgniter php framework
 
Reactive application using meteor
Reactive application using meteorReactive application using meteor
Reactive application using meteor
 
Vue micro frontend implementation patterns
Vue micro frontend implementation patternsVue micro frontend implementation patterns
Vue micro frontend implementation patterns
 
Meteor Meet-up San Diego December 2014
Meteor Meet-up San Diego December 2014Meteor Meet-up San Diego December 2014
Meteor Meet-up San Diego December 2014
 
The web - What it has, what it lacks and where it must go - Istanbul
The web - What it has, what it lacks and where it must go - IstanbulThe web - What it has, what it lacks and where it must go - Istanbul
The web - What it has, what it lacks and where it must go - Istanbul
 
Busy Bee Application Develompent Platform
Busy Bee Application Develompent PlatformBusy Bee Application Develompent Platform
Busy Bee Application Develompent Platform
 
Progressive web apps
Progressive web appsProgressive web apps
Progressive web apps
 
[drupalday2017] - Drupal come frontend che consuma servizi: HTTP Client Manager
[drupalday2017] - Drupal come frontend che consuma servizi: HTTP Client Manager[drupalday2017] - Drupal come frontend che consuma servizi: HTTP Client Manager
[drupalday2017] - Drupal come frontend che consuma servizi: HTTP Client Manager
 
Presemtation Tier Optimizations
Presemtation Tier OptimizationsPresemtation Tier Optimizations
Presemtation Tier Optimizations
 
Creating Rajanikant Powered Site
Creating Rajanikant Powered SiteCreating Rajanikant Powered Site
Creating Rajanikant Powered Site
 
Costruire applicazioni multi-tenant e piattaforme SaaS in PHP con Innomatic
Costruire applicazioni multi-tenant e piattaforme SaaS in PHP con InnomaticCostruire applicazioni multi-tenant e piattaforme SaaS in PHP con Innomatic
Costruire applicazioni multi-tenant e piattaforme SaaS in PHP con Innomatic
 
High Availability by Design
High Availability by DesignHigh Availability by Design
High Availability by Design
 
Refacoring vs Rewriting WixStores
Refacoring vs Rewriting WixStoresRefacoring vs Rewriting WixStores
Refacoring vs Rewriting WixStores
 
Progressive Web Apps by Millicent Convento
Progressive Web Apps by Millicent ConventoProgressive Web Apps by Millicent Convento
Progressive Web Apps by Millicent Convento
 
Micro service architecture
Micro service architectureMicro service architecture
Micro service architecture
 
FEDM Meetup: Introducing Mojito
FEDM Meetup: Introducing MojitoFEDM Meetup: Introducing Mojito
FEDM Meetup: Introducing Mojito
 
Stephane Lapointe, Frank Boucher & Alexandre Brisebois: Les micro-services et...
Stephane Lapointe, Frank Boucher & Alexandre Brisebois: Les micro-services et...Stephane Lapointe, Frank Boucher & Alexandre Brisebois: Les micro-services et...
Stephane Lapointe, Frank Boucher & Alexandre Brisebois: Les micro-services et...
 
Deploying configurable frontend web application containers
Deploying configurable frontend web application containersDeploying configurable frontend web application containers
Deploying configurable frontend web application containers
 

More from Stephan Hochdörfer

Offline. Na und? Strategien für offlinefähige Applikationen in HTML5 - Herbst...
Offline. Na und? Strategien für offlinefähige Applikationen in HTML5 - Herbst...Offline. Na und? Strategien für offlinefähige Applikationen in HTML5 - Herbst...
Offline. Na und? Strategien für offlinefähige Applikationen in HTML5 - Herbst...Stephan Hochdörfer
 
Phing for power users - frOSCon8
Phing for power users - frOSCon8Phing for power users - frOSCon8
Phing for power users - frOSCon8Stephan Hochdörfer
 
Offline strategies for HTML5 web applications - frOSCon8
Offline strategies for HTML5 web applications - frOSCon8Offline strategies for HTML5 web applications - frOSCon8
Offline strategies for HTML5 web applications - frOSCon8Stephan Hochdörfer
 
Offline Strategies for HTML5 Web Applications - oscon13
Offline Strategies for HTML5 Web Applications - oscon13Offline Strategies for HTML5 Web Applications - oscon13
Offline Strategies for HTML5 Web Applications - oscon13Stephan Hochdörfer
 
Real World Dependency Injection - oscon13
Real World Dependency Injection - oscon13Real World Dependency Injection - oscon13
Real World Dependency Injection - oscon13Stephan Hochdörfer
 
Dependency Injection in PHP - dwx13
Dependency Injection in PHP - dwx13Dependency Injection in PHP - dwx13
Dependency Injection in PHP - dwx13Stephan Hochdörfer
 
Offline Strategien für HTML5 Web Applikationen - dwx13
Offline Strategien für HTML5 Web Applikationen - dwx13 Offline Strategien für HTML5 Web Applikationen - dwx13
Offline Strategien für HTML5 Web Applikationen - dwx13 Stephan Hochdörfer
 
Your Business. Your Language. Your Code - dpc13
Your Business. Your Language. Your Code - dpc13Your Business. Your Language. Your Code - dpc13
Your Business. Your Language. Your Code - dpc13Stephan Hochdörfer
 
Phing for power users - dpc_uncon13
Phing for power users - dpc_uncon13Phing for power users - dpc_uncon13
Phing for power users - dpc_uncon13Stephan Hochdörfer
 
Offline Strategies for HTML5 Web Applications - ipc13
Offline Strategies for HTML5 Web Applications - ipc13Offline Strategies for HTML5 Web Applications - ipc13
Offline Strategies for HTML5 Web Applications - ipc13Stephan Hochdörfer
 
Offline-Strategien für HTML5 Web Applikationen - wmka
Offline-Strategien für HTML5 Web Applikationen - wmkaOffline-Strategien für HTML5 Web Applikationen - wmka
Offline-Strategien für HTML5 Web Applikationen - wmkaStephan Hochdörfer
 
Offline-Strategien für HTML5 Web Applikationen - bedcon13
Offline-Strategien für HTML5 Web Applikationen - bedcon13Offline-Strategien für HTML5 Web Applikationen - bedcon13
Offline-Strategien für HTML5 Web Applikationen - bedcon13Stephan Hochdörfer
 
Real World Dependency Injection - phpugffm13
Real World Dependency Injection - phpugffm13Real World Dependency Injection - phpugffm13
Real World Dependency Injection - phpugffm13Stephan Hochdörfer
 
Testing untestable code - ConFoo13
Testing untestable code - ConFoo13Testing untestable code - ConFoo13
Testing untestable code - ConFoo13Stephan Hochdörfer
 
Offline strategies for HTML5 web applications - ConFoo13
Offline strategies for HTML5 web applications - ConFoo13Offline strategies for HTML5 web applications - ConFoo13
Offline strategies for HTML5 web applications - ConFoo13Stephan Hochdörfer
 
Offline-Strategien für HTML5Web Applikationen - WMMRN12
Offline-Strategien für HTML5Web Applikationen - WMMRN12Offline-Strategien für HTML5Web Applikationen - WMMRN12
Offline-Strategien für HTML5Web Applikationen - WMMRN12Stephan Hochdörfer
 
Offline strategies for HTML5 web applications - IPC12
Offline strategies for HTML5 web applications - IPC12Offline strategies for HTML5 web applications - IPC12
Offline strategies for HTML5 web applications - IPC12Stephan Hochdörfer
 
Große Systeme, lose Kopplung, Spaß bei der Arbeit! - WDC12
Große Systeme, lose Kopplung, Spaß bei der Arbeit! - WDC12Große Systeme, lose Kopplung, Spaß bei der Arbeit! - WDC12
Große Systeme, lose Kopplung, Spaß bei der Arbeit! - WDC12Stephan Hochdörfer
 

More from Stephan Hochdörfer (20)

Offline. Na und? Strategien für offlinefähige Applikationen in HTML5 - Herbst...
Offline. Na und? Strategien für offlinefähige Applikationen in HTML5 - Herbst...Offline. Na und? Strategien für offlinefähige Applikationen in HTML5 - Herbst...
Offline. Na und? Strategien für offlinefähige Applikationen in HTML5 - Herbst...
 
Phing for power users - frOSCon8
Phing for power users - frOSCon8Phing for power users - frOSCon8
Phing for power users - frOSCon8
 
Offline strategies for HTML5 web applications - frOSCon8
Offline strategies for HTML5 web applications - frOSCon8Offline strategies for HTML5 web applications - frOSCon8
Offline strategies for HTML5 web applications - frOSCon8
 
Offline Strategies for HTML5 Web Applications - oscon13
Offline Strategies for HTML5 Web Applications - oscon13Offline Strategies for HTML5 Web Applications - oscon13
Offline Strategies for HTML5 Web Applications - oscon13
 
Real World Dependency Injection - oscon13
Real World Dependency Injection - oscon13Real World Dependency Injection - oscon13
Real World Dependency Injection - oscon13
 
Dependency Injection in PHP - dwx13
Dependency Injection in PHP - dwx13Dependency Injection in PHP - dwx13
Dependency Injection in PHP - dwx13
 
Offline Strategien für HTML5 Web Applikationen - dwx13
Offline Strategien für HTML5 Web Applikationen - dwx13 Offline Strategien für HTML5 Web Applikationen - dwx13
Offline Strategien für HTML5 Web Applikationen - dwx13
 
Your Business. Your Language. Your Code - dpc13
Your Business. Your Language. Your Code - dpc13Your Business. Your Language. Your Code - dpc13
Your Business. Your Language. Your Code - dpc13
 
Phing for power users - dpc_uncon13
Phing for power users - dpc_uncon13Phing for power users - dpc_uncon13
Phing for power users - dpc_uncon13
 
Offline Strategies for HTML5 Web Applications - ipc13
Offline Strategies for HTML5 Web Applications - ipc13Offline Strategies for HTML5 Web Applications - ipc13
Offline Strategies for HTML5 Web Applications - ipc13
 
Offline-Strategien für HTML5 Web Applikationen - wmka
Offline-Strategien für HTML5 Web Applikationen - wmkaOffline-Strategien für HTML5 Web Applikationen - wmka
Offline-Strategien für HTML5 Web Applikationen - wmka
 
Offline-Strategien für HTML5 Web Applikationen - bedcon13
Offline-Strategien für HTML5 Web Applikationen - bedcon13Offline-Strategien für HTML5 Web Applikationen - bedcon13
Offline-Strategien für HTML5 Web Applikationen - bedcon13
 
Real World Dependency Injection - phpugffm13
Real World Dependency Injection - phpugffm13Real World Dependency Injection - phpugffm13
Real World Dependency Injection - phpugffm13
 
Testing untestable code - ConFoo13
Testing untestable code - ConFoo13Testing untestable code - ConFoo13
Testing untestable code - ConFoo13
 
A Phing fairy tale - ConFoo13
A Phing fairy tale - ConFoo13A Phing fairy tale - ConFoo13
A Phing fairy tale - ConFoo13
 
Offline strategies for HTML5 web applications - ConFoo13
Offline strategies for HTML5 web applications - ConFoo13Offline strategies for HTML5 web applications - ConFoo13
Offline strategies for HTML5 web applications - ConFoo13
 
Offline-Strategien für HTML5Web Applikationen - WMMRN12
Offline-Strategien für HTML5Web Applikationen - WMMRN12Offline-Strategien für HTML5Web Applikationen - WMMRN12
Offline-Strategien für HTML5Web Applikationen - WMMRN12
 
Testing untestable code - IPC12
Testing untestable code - IPC12Testing untestable code - IPC12
Testing untestable code - IPC12
 
Offline strategies for HTML5 web applications - IPC12
Offline strategies for HTML5 web applications - IPC12Offline strategies for HTML5 web applications - IPC12
Offline strategies for HTML5 web applications - IPC12
 
Große Systeme, lose Kopplung, Spaß bei der Arbeit! - WDC12
Große Systeme, lose Kopplung, Spaß bei der Arbeit! - WDC12Große Systeme, lose Kopplung, Spaß bei der Arbeit! - WDC12
Große Systeme, lose Kopplung, Spaß bei der Arbeit! - WDC12
 

How to build customizable multitenant web applications - IPC11 Spring Edition