89
How to build customizable multitenant web applications

How to build customizable multitenant web applications - IPC11 Spring Edition

Embed Size (px)

DESCRIPTION

 

Citation preview

Page 1: How to build customizable multitenant web applications - IPC11 Spring Edition

How to build customizablemultitenant web applications

Page 2: How to build customizable multitenant web applications - IPC11 Spring Edition

Multitenant web applications

About me

Stephan Hochdörfer, bitExpert AG

Department Manager Research Labs

enjoying PHP since 1999

[email protected]

@shochdoerfer

Page 3: How to build customizable multitenant web applications - IPC11 Spring Edition

Single Tenancy

Multitenant web applications

Page 4: How to build customizable multitenant web applications - IPC11 Spring Edition

Developer vs. Businessman

Multitenant web applications

Page 5: How to build customizable multitenant web applications - IPC11 Spring Edition

Single Tenancy – more customers

Multitenant web applications

Page 6: How to build customizable multitenant web applications - IPC11 Spring Edition

Single Tenancy – even more customers

Multitenant web applications

Page 7: How to build customizable multitenant web applications - IPC11 Spring Edition

Multitenant web applications

Where will this lead to?

Page 8: How to build customizable multitenant web applications - IPC11 Spring Edition

Multitenant web applications

Maintenance nightmare!

Page 9: How to build customizable multitenant web applications - IPC11 Spring Edition

Single Tenancy

Multitenant web applications

Tenant 1

Application

Database

Hardware

Page 10: How to build customizable multitenant web applications - IPC11 Spring Edition

Single Tenancy

Multitenant web applications

Tenant 1

Application

Database

Hardware

Tenant 2

Application

Database

Hardware

Tenant 3

Application

Database

Hardware

Page 11: How to build customizable multitenant web applications - IPC11 Spring Edition

Multi Tenancy

Multitenant web applications

Tenant 2Tenant 1

Application

Database

Hardware

Tenant 3

Page 12: How to build customizable multitenant web applications - IPC11 Spring Edition

What should be customizable?

Multitenant web applications

Page 13: How to build customizable multitenant web applications - IPC11 Spring Edition

What should be customizable?

Tenant 2Tenant 1

Application

Database

Hardware

Tenant 3

Multitenant web applications

Page 14: How to build customizable multitenant web applications - IPC11 Spring Edition

What should be customizable?

Tenant 2Tenant 1

Application

Database

Hardware

Tenant 3

Multitenant web applications

Page 15: How to build customizable multitenant web applications - IPC11 Spring Edition

How to skin an application?

Multitenant web applications

Page 16: How to build customizable multitenant web applications - IPC11 Spring Edition

How to skin an application?

Multitenant web applications

Remember:It`s a web application!

Page 17: How to build customizable multitenant web applications - IPC11 Spring Edition

How to skin an application?

Multitenant web applications

HTML

Page 18: How to build customizable multitenant web applications - IPC11 Spring Edition

How to skin an application?

Multitenant web applications

HTML + CSS

Page 19: How to build customizable multitenant web applications - IPC11 Spring Edition

Multitenant web applications

Page 20: How to build customizable multitenant web applications - IPC11 Spring Edition

Multitenant web applications

Page 21: How to build customizable multitenant web applications - IPC11 Spring Edition

Multitenant web applications

Page 22: How to build customizable multitenant web applications - IPC11 Spring Edition

How to customize?

Multitenant web applications

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0Strict//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>

Page 23: How to build customizable multitenant web applications - IPC11 Spring Edition

How to customize?

Multitenant web applications

<!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>

Page 24: How to build customizable multitenant web applications - IPC11 Spring Edition

How to customize?

Multitenant web applications

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0Strict//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>

Page 25: How to build customizable multitenant web applications - IPC11 Spring Edition

Feature driven CSS

Multitenant web applications

Wait, there`s more...

Page 26: How to build customizable multitenant web applications - IPC11 Spring Edition

Feature driven CSS

Multitenant web applications

display: none

Page 27: How to build customizable multitenant web applications - IPC11 Spring Edition

Multitenant web applications

This is not an security advice!

Page 28: How to build customizable multitenant web applications - IPC11 Spring Edition

Multitenant web applications

Next level...

Page 29: How to build customizable multitenant web applications - IPC11 Spring Edition

Menubar generation

Multitenant web applications

<?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); }}

Page 30: How to build customizable multitenant web applications - IPC11 Spring Edition

Menubar generation

Multitenant web applications

<?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);}

}}

Page 31: How to build customizable multitenant web applications - IPC11 Spring Edition

Menubar generation

Multitenant web applications

Modularize!

Page 32: How to build customizable multitenant web applications - IPC11 Spring Edition

Menubar generation

Multitenant web applications

Module 2Module 1

Application core

Module 3

register at start up

Page 33: How to build customizable multitenant web applications - IPC11 Spring Edition

Menubar generation

Multitenant web applications

Module 2Module 1

Application core

Module 3

register at start up

Page 34: How to build customizable multitenant web applications - IPC11 Spring Edition

Menubar generation

Multitenant web applications

Module 2Module 1

Application core

Module 3

register at start up

Page 35: How to build customizable multitenant web applications - IPC11 Spring Edition

Optimize workflows

Multitenant web applications

Page 36: How to build customizable multitenant web applications - IPC11 Spring Edition

Optimize workflows

Multitenant web applications

<?php

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

Page 37: How to build customizable multitenant web applications - IPC11 Spring Edition

Optimize workflows

Multitenant web applications

<?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!}

Page 38: How to build customizable multitenant web applications - IPC11 Spring Edition

Optimize workflows

Multitenant web applications

Decouple functionality!

Page 39: How to build customizable multitenant web applications - IPC11 Spring Edition

Optimize workflows

Multitenant web applications

<?php

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

$payment->execute($order);

Page 40: How to build customizable multitenant web applications - IPC11 Spring Edition

Optimize workflows

Multitenant web applications

<?php

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

$payment->execute($order);

Page 41: How to build customizable multitenant web applications - IPC11 Spring Edition

Optimize workflows

Multitenant web applications

How to add custom logic?

Page 42: How to build customizable multitenant web applications - IPC11 Spring Edition

Custom logic - Subclassing?

Multitenant web applications

AbstractPayment

CCPayment

CCPaymentTenant 1

CCPaymentTenant 2

Page 43: How to build customizable multitenant web applications - IPC11 Spring Edition

Custom logic

Multitenant web applications

Any alternatives?

Page 44: How to build customizable multitenant web applications - IPC11 Spring Edition

Custom logic

Multitenant web applications

Let`s add hooks...

Page 45: How to build customizable multitenant web applications - IPC11 Spring Edition

Custom logic - Hooks

Multitenant web applications

<?php

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

$payment->execute($order);

if($this->paymentPostProcessor instanceofIPaymentPostProcessor) { $this->paymentPostProcessor->run($payment, $tenant, $order);}

Page 46: How to build customizable multitenant web applications - IPC11 Spring Edition

Custom logic

Multitenant web applications

How to set the dependencies?

Page 47: How to build customizable multitenant web applications - IPC11 Spring Edition

Custom logic

Multitenant web applications

Dependency Injection!

Page 48: How to build customizable multitenant web applications - IPC11 Spring Edition

Custom logic – Dependency Injection

Multitenant web applications

<?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="MyApp\Service\Order.php"></bean>

<bean id="Tenant1.Order" class="MyApp\Service\Order.php"><property name="paymentPostProcessor"

ref="Tentant1.Payment.SendOrderMail" /></bean>

</beans>

Page 49: How to build customizable multitenant web applications - IPC11 Spring Edition

Custom logic – Dependency Injection

Multitenant web applications

<?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="MyApp\Service\Order.php"><property name="paymentPostProcessor"

ref="Tentant1.Payment.PushToERP" /></bean>

</beans>

Page 50: How to build customizable multitenant web applications - IPC11 Spring Edition

Custom logic

Multitenant web applications

Any further improvements?

Page 51: How to build customizable multitenant web applications - IPC11 Spring Edition

Custom logic

Multitenant web applications

<?php

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

$payment->execute($order);

if($this->paymentPostProcessor instanceofIPaymentPostProcessor) { $this->paymentPostProcessor->run($payment, $tenant, $order);}

Page 52: How to build customizable multitenant web applications - IPC11 Spring Edition

Custom logic

Multitenant web applications

<?php

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

$payment->execute($order);

if($this->paymentPostProcessor instanceofIPaymentPostProcessor) { $this->paymentPostProcessor->run($payment, $tenant, $order);}

Page 53: How to build customizable multitenant web applications - IPC11 Spring Edition

Custom logic

Multitenant web applications

Aspect-oriented programming

Page 54: How to build customizable multitenant web applications - IPC11 Spring Edition

Custom logic – Aspects for the masses!

Multitenant web applications

/** * @aspect */class CustomPaymentProcessingAspect {

/** * @around MyApp\Service\Order->processPayment */public function customFilter(JoinPointInterface $jP) {

$result = $jP->getAdviceChain()->proceed($jP);

// @TODO: implement post-processing logic

return $result;}

}

Page 55: How to build customizable multitenant web applications - IPC11 Spring Edition

Custom logic - Result

Multitenant web applications

<?php

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

$payment->execute($order);

Page 56: How to build customizable multitenant web applications - IPC11 Spring Edition

Multitenant web applications

Next level...

Page 57: How to build customizable multitenant web applications - IPC11 Spring Edition

Database – Where to store the data?

Multitenant web applications

Page 58: How to build customizable multitenant web applications - IPC11 Spring Edition

Database – Where to store the data?

Multitenant web applications

We need to store data for a tenant!

Page 59: How to build customizable multitenant web applications - IPC11 Spring Edition

Database – Where to store the data?

Multitenant web applications

Database per Tenant?

Page 60: How to build customizable multitenant web applications - IPC11 Spring Edition

Database – Where to store the data?

Multitenant web applications

Database per Tenant?

Schema per Tenant?

Page 61: How to build customizable multitenant web applications - IPC11 Spring Edition

Database – Where to store the data?

Multitenant web applications

Database per Tenant?

Schema per Tenant?

Tenant Id per Row?

Page 62: How to build customizable multitenant web applications - IPC11 Spring Edition

Database – How to access the data?

Multitenant web applications

ORM dynamic statements

vs.

Page 63: How to build customizable multitenant web applications - IPC11 Spring Edition

Multitenant web applications

Generalize you should!

Page 64: How to build customizable multitenant web applications - IPC11 Spring Edition

No single solution!

Multitenant web applications

Page 65: How to build customizable multitenant web applications - IPC11 Spring Edition

Multitenant web applications

Softwaresystemfamily

Page 66: How to build customizable multitenant web applications - IPC11 Spring Edition

A factory for mass production!

Multitenant web applications

Page 67: How to build customizable multitenant web applications - IPC11 Spring Edition

Multi Tenancy – Single Instance

Tenant 2Tenant 1

Application

Database

Hardware

Tenant 3

Multitenant web applications

Page 68: How to build customizable multitenant web applications - IPC11 Spring Edition

Multi Tenancy – Multi Instance

Tenant 2Tenant 1

Application

Database

Hardware

Tenant 3

Multitenant web applications

Page 69: How to build customizable multitenant web applications - IPC11 Spring Edition

Multi Tenancy – Multi Instance

Multitenant web applications

Generative Programming

Page 70: How to build customizable multitenant web applications - IPC11 Spring Edition

Generative Programming

Multitenant web applications

GeneratorGenerator

Page 71: How to build customizable multitenant web applications - IPC11 Spring Edition

Generative Programming

Multitenant web applications

Configuration(DSL)

Configuration(DSL)

GeneratorGenerator

Page 72: How to build customizable multitenant web applications - IPC11 Spring Edition

Generative Programming

Multitenant web applications

Configuration(DSL)

Configuration(DSL)

Implementation-components

Implementation-components GeneratorGenerator

Page 73: How to build customizable multitenant web applications - IPC11 Spring Edition

Generative Programming

Multitenant web applications

Configuration(DSL)

Configuration(DSL)

Implementation-components

Implementation-components GeneratorGenerator

ProductProduct

1..n

Page 74: How to build customizable multitenant web applications - IPC11 Spring Edition

Generative Programming

Multitenant web applications

Configuration(DSL)

Configuration(DSL)

Implementation-components

Implementation-components GeneratorGenerator

Tenant 1Tenant 1

Page 75: How to build customizable multitenant web applications - IPC11 Spring Edition

Generative Programming

Multitenant web applications

Configuration(DSL)

Configuration(DSL)

Implementation-components

Implementation-components GeneratorGenerator

Tenant 1Tenant 1

Tenant 2Tenant 2

Page 76: How to build customizable multitenant web applications - IPC11 Spring Edition

Generative Programming

Multitenant web applications

Configuration(DSL)

Configuration(DSL)

Implementation-components

Implementation-components

Tenant 3Tenant 3

GeneratorGeneratorTenant 1Tenant 1

Tenant 2Tenant 2

Page 77: How to build customizable multitenant web applications - IPC11 Spring Edition

Generative Programming - Goal

Multitenant web applications

Create an optimized application!

Page 78: How to build customizable multitenant web applications - IPC11 Spring Edition

Generative Programming - Goal

Multitenant web applications

Create an optimized application for one tenant!

Page 79: How to build customizable multitenant web applications - IPC11 Spring Edition

Generative Programming – Bonus points

Multitenant web applications

Page 80: How to build customizable multitenant web applications - IPC11 Spring Edition

Generative Programming – Bonus points

Multitenant web applications

Reduce application complexity

Page 81: How to build customizable multitenant web applications - IPC11 Spring Edition

Generative Programming – Bonus points

Multitenant web applications

<?php

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

$payment->execute($order);

<!{PostProcessor}!>

Page 82: How to build customizable multitenant web applications - IPC11 Spring Edition

Generative Programming – Bonus points

Multitenant web applications

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", "...");}

}}

Page 83: How to build customizable multitenant web applications - IPC11 Spring Edition

Generative Programming – Bonus points

Multitenant web applications

Reduce maintenance support

Page 84: How to build customizable multitenant web applications - IPC11 Spring Edition

Generative Programming – Bonus points

Multitenant web applications

FeatureImplementation

component

Page 85: How to build customizable multitenant web applications - IPC11 Spring Edition

Generative Programming – Bonus points

Multitenant web applications

Feature Tenant

Page 86: How to build customizable multitenant web applications - IPC11 Spring Edition

Generative Programming – Bonus points

Multitenant web applications

Feature

Implementationcomponent

Tenant

Page 87: How to build customizable multitenant web applications - IPC11 Spring Edition

Generative Programming – The book

Multitenant web applications

Page 88: How to build customizable multitenant web applications - IPC11 Spring Edition

http://joind.in/3517

Page 89: How to build customizable multitenant web applications - IPC11 Spring Edition

Flickr Creditshttp://www.flickr.com/photos/andresrueda/3452940751/

http://www.flickr.com/photos/andresrueda/3455410635/