Building Multi-Tenant and SaaS products in PHP - CloudConf 2015
-
Upload
innomatic-platform -
Category
Software
-
view
344 -
download
1
Transcript of Building Multi-Tenant and SaaS products in PHP - CloudConf 2015
First of all: what is NOT Innomatic?
Innomatic is NOT a framework like Laravel or Symfony
– in fact, we are progressively migrating to a system
based on Symfony components!
3
So, what really is Innomatic?
Innomatic is an open source platform for:
developing, deploying and managing
Multi-Tenant and SaaS web applications in PHP
4
Building new SaaS: Classic vs Innomatic approach
6 Innomatic Platform
Go live!
Classic life cycle
Innoma,c life cycle
Learn and configure Innoma4c
+ 4me + budget
to develop & market the app
Innomatic Platform
Go live! (late…)
Develop infrastructure (mul4 tenancy, build system,
billing tools, CRM, etc.)
-‐ Time -‐ budget
to develop & market the app
Opt.: Innomedia CMF for web sites + Innowork BAF for intranets
Innomatic Layers
7 Innomatic Platform
Debug
Tenant Web Apps
HTTP Kernel File system Rou4ng
Cache Localiza4on Logging Web services Symfony
Components based deploy and tasks AppCentral
Root Desktop Tenant Desktop Panels / Web User Interface
Dependency Injec4on Database / ORM Templa4ng Class Loader
Mul4 tenancy Applica4ons container Tenant Users / RBAC
Packages Composer
Innoma4c
Innomedia CMF Innowork BAF SaaS tools (billing, CRM, 4ckets, …)
Other major Frameworks and tools
PLATFORM
Multi-Tenancy in Innomatic
8 Innomatic Platform
Innoma4c strategy: Mul,-‐Tenant code + Single Tenant databases
Innomatic = Innovation + AUTOMATIC
Innomatic handles this for you
Deployment and update tasks are automatized by Innomatic for each tenant
10 Innomatic Platform
An Innomatic application is a set of components of the types supported by Innomatic or other Innomatic based applications:
• PHP classes,
• database tables,
• catalogues of localization strings,
• dashboard widgets,
• desktop UI elements,
• traybar items,
• maintenance tasks,
• etc.
Structure of an Innomatic application
11 Innomatic Platform
This is the core of Innomatic automation at runtime. Each component type defines the operation to be executed in the following phases:
Innomatic components operations
Innomatic Platform 12
Application: • Deploy inside Innomatic • Upgrade • Undeploy
Tenant: • Enable component to the tenant • Upgrade component in the tenant • Disable component from the
tenant
<?xml version='1.0'?> <application>
<definition>
<idname>example-basic-app</idname> <release> <version>1.0.0</version>
<date>2014/10/07</date> <changesfile>CHANGES</changesfile> </release>
<description>Innomatic example: basic application</description> <category>examples</category> <iconfile></iconfile> <dependencies> <dependency>innomatic[6.4.0]</dependency> </dependencies>
<options> <!-- <option></option> --> </options>
The application.xml file 1/3 – Meta data part 1
Innomatic Platform 13
<legal> <author> <name>Innomatic Company</name>
<email>[email protected]</email> <web>http://www.innomatic.io/</web> </author> <copyright>Copyright (c) 2014 Innomatic Company</copyright> <license>New BSD</license> <licensefile>LICENSE</licensefile>
</legal> <support> <supportemail>[email protected]</supportemail> <bugsemail>[email protected]</bugsemail> <maintainer> <name>Alex Pagnoni</name>
<email>[email protected]</email> </maintainer> </support> </definition>
The application.xml file 2/3 – Meta data part 2
Innomatic Platform 14
<components> <tempdir name="example-basic-app" />
<domaingroup name="examples" catalog="example-basic-app::misc" />
<domaintable name="example_basic_table" file="example_basic_table.xml" />
<domainpanel name="basicapp" catalog="example-basic-app::misc" category="examples" />
<catalog name="example-basic-app" />
<class name="examples/basic/BasicClass.php" />
</components> </application>
The application.xml file 3/3 – Components
Innomatic Platform 15
You can also use Composer for your classes
You can also declare your dependencies to external packages using Composer: you only have to add your composer.json
inside your application package.
Since Innomatic is a platform and you deploy applications at runtime, Innomatic provides a recursive Composers
dependencies feature with multiple composer.json from different Innomatic applications.
Including classes and packages with Composer
Innomatic Platform 16
Applications may also define their own component types that can be used by other applications.
Extending Component Types
Innomatic Platform 17
Normally Innomatic desktop applications are built up of various panels which provide an USER INTERFACE inside the Innomatic desktop.
Panels & Panel Groups
Innomatic Platform 18
Declaring a Panel inside application.xml
Innomatic Platform 19
<tempdir name="example-basic-app" />
<domaingroup name="examples" catalog="example-basic-app::misc" />
<domaintable name="example_basic_table" file="example_basic_table.xml" />
<domainpanel name="basicapp" catalog="example-basic-app::misc" category="examples" />
<catalog name="example-basic-app" />
<class name="examples/basic/BasicClass.php" />
class BasicappPanelViews extends \Innomatic\Desktop\Panel\PanelViews
{
public function update($observable, $arg = '’) {}
public function beginHelper() {}
public function endHelper() {}
public function viewDefault($eventData)
{
$this->tpl->set(’title', ‘Panel title’);
}
}
Panel views – View code example
Innomatic Platform 20
class BasicappPanelActions extends \Innomatic\Desktop\Panel\PanelActions {
public function __construct(\Innomatic\Desktop\Panel\PanelController $controller) {
parent::__construct($controller);
}
public function beginHelper() {}
public function endHelper() {}
public function executeDeleteItem($eventData) {
$this->dataAccess->execute(‘DELETE FROM my_items WHERE ID=‘.$eventData[‘id’]);
}
}
Panel actions – Code example
Innomatic Platform 21
<form> <name>item</name> <args> <action><?=$editAction?></action>
</args> <children> <grid>
<children> <label row="0" col="0" halign="right">
<args> <label><?=$nameLabel?></label>
</args> </label>
<string row="0" col="1"> <name>name</name> <args> <disp>action</disp>
<size>30</size> <value><?=$nameValue?></value> </args> </string>
Web User Interface (WUI)
Innomatic Platform 22
Tenant Desktops and Web Apps
Tenants have 2 types of interfaces: Tenant Desktop A web desktop with a standard GUI for backoffice applications accessible via a login panel. e.g. intranet, enterprise applications Web App An interface for external web applications with a chained router e.g. public web sites, extranets The Tenant Desktop and the Web App share the same database and can interact (e.g. you may have a CMS inside the Desktop for managing the Web App content).
25 Innomatic Platform
<wuitheme name="flattheme" file="flattheme_wuitheme.ini"
catalog="innomatic::flattheme" />
<wuicolorsset name="flattheme"
file="flattheme_wuicolorsset.ini”
catalog="innomatic::flattheme" />
<wuistyle name="flattheme" file="flattheme_wuistyle.ini"
catalog="innomatic::flattheme" />
<wuiiconsset name="subway" file="subway_wuiiconsset.ini"
catalog="innomatic::flattheme" />
Declaring new themes in application.xml
Innomatic Platform 38
You can also do it inside PHP and CLI scripts
Creating a tenant from CLI: php core/scripts/tenant.php create <tenant_name> <description> <admin_password> Deploying an application from CLI: php core/scripts/application.php deploy <application_archive.tgz> Enabling an application to a tenant from CLI: php core/scripts/tenant.php appenable <tenantname> <appname>
48 Innomatic Platform