SlideShare a Scribd company logo
1 of 73
Download to read offline
T3CON12
Québec City, Canada




                      Robert Lemke

                      Getting into
                      FLOW3
T3CON12
Québec City, Canada




Robert Lemke

project founder of FLOW3 and TYPO3 “Phoenix”

co-founder of the TYPO3 Association

coach, coder, consultant

36 years old

lives in Lübeck, Germany

1 wife, 2 daughters, 1 espresso machine

likes drumming
Starters
Installation

Kickstart & Hello World!

Controller, Actions, Arguments & HTTP

Domain-Driven Design

Doctrine

Forms, Validation
Main Dishes

Resources, Image Upload

Session Handling

User, Account, Authentication

Authorization
Deserts
 Caching       Testing

 Logging       Deployment

 Signal-Slot   I18n

 Routing       Espresso
?
T3CON12
Québec City, Canada




At a Glance

FLOW3 is a web application platform
    • holistic concept for your apps

    • modular, extensible, package based

    • pedantically clean with focus on quality

    • puts a smile on developer’s faces


    • free & Open Source (LGPL v3)

    • backed by one of the largest Open Source projects
T3CON12
 Québec City, Canada




 Foundation for the Next Generation CMS


TYPO3 “Phoenix” is the all-new
Enterprise CMS
 • content repository, workspaces,
   versions, i18n, modular UI ...

 • powered by FLOW3

 • compatible code base

 • use TYPO3 features in FLOW3
   standalone apps as you like
T3CON12
Québec City, Canada




FLOW3 Website and Download

#
T3CON12
Québec City, Canada




Git Clone




 $ git clone --recursive git://git.typo3.org/FLOW3/Distributions/Base.git .
 Cloning into ....
 remote: Counting objects: 3837, done.
 remote: Compressing objects: 100% (2023/2023), done.
 remote: Total 3837 (delta 2007), reused 2721 (delta 1465)
 Receiving objects: 100% (3837/3837), 3.49 MiB | 28 KiB/s, done.
 Resolving deltas: 100% (2007/2007), done.
T3CON12
 Québec City, Canada




 Set File Permissions

  $ sudo ./flow3 core:setfilepermissions robert _www _www
  FLOW3 File Permission Script

  Checking permissions from here upwards.
  Making sure Data and Web/_Resources exist.
  Setting file permissions, trying to set ACLs via chmod ...
  Done.



Linux:


  $ sudo usermod -a -G www-data robert


Mac OS X:

  $ sudo dscl . -append /Groups/_www GroupMembership robert
T3CON12
Québec City, Canada




Set Up Database Connection
Configuration/Settings.yaml



   #                                                           #
   # Global Settings                                           #
   #                                                           #

   TYPO3:
     FLOW3:
       persistence:
          backendOptions:
            dbname: 'demo'
            user: 'demo'
            password: 'password'
            host: '127.0.0.1'

            # only on Windows:
            core:
              phpBinaryPathAndFilename: 'C:/path/to/php.exe'
T3CON12
Québec City, Canada




Set Up Virtual Host

Apache Virtual Host



    <VirtualHost *:80>
            DocumentRoot /opt/local/apache2/htdocs/Talks/FLOW3/Web/
            ServerName dev.flow3.rob
            SetEnv FLOW3_CONTEXT Development
    </VirtualHost>

    <VirtualHost *:80>
            DocumentRoot /opt/local/apache2/htdocs/Talks/FLOW3/Web/
            ServerName flow3.rob
            SetEnv FLOW3_CONTEXT Production
    </VirtualHost>
T3CON12
Québec City, Canada




Final Check
C lo ne t h e Be a s t

 5         1                1   1
        Ro bert Lem ke
         D.P. F l u x t r
        time ();
T3CON12
Québec City, Canada




Biggest Book Store: Amazon
T3CON12
Québec City, Canada




Biggest River: Amazon River




                              © Google
T3CON12
Québec City, Canada




Smallest River: Roe River




                            © Google
T3CON12
Québec City, Canada




Smallest River: Roe River




                            © Google
T3CON12
Québec City, Canada




Smallest River: Roe River




                            © Google
T3CON12
Québec City, Canada




Smallest River: Roe River
Smallest Book Store: Roe Books
Sketchy Model
Jus t C o de a Sh o p

 5        2                1   1
       Ro bert Lem ke
        D.P. F l u x t r
       time ();
T3CON12
Québec City, Canada




Tackling the Heart of Software Development

                                            /**
Domain-Driven Design                         * A Book
                                             *
                                             * @FLOW3Scope(“protot
                                                                    ype”)
                                             * @FLOW3Entity
A methodology which ...                      */
                                           class Book {

    • results in rich domain models        	    /**
                                           	     * @var string
                                           	     */
    • provides a common language           	    protected $title;

      across the project team          	       /**
                                       	        * @var string
                                       	        */
    • simplify the design of complex   	       protected $isbn;
      applications                     	       /**
                                       	        * @var string
                                       	        */
                                       	       protected $description
                                                                      ;
FLOW3 is the first PHP framework
                                       	       /**
tailored to Domain-Driven Design       	        * @var integer
                                       	        */
                                       	       protected $price;
T3CON12
Québec City, Canada




Domain-Driven Design

Domain
    activity or business of the user

Domain-Driven Design
    is about

    • focussing on the domain and domain logic

    • accurately mapping the concepts to software

    • forming a ubiquitous language among the
      project members
T3CON12
Québec City, Canada




Domain-Driven Design

Ubiquitous Language
    • important prerequisite for successful
      collaboration

    • use the same words for

           • discussion

           • modeling

           • development

           • documentation
T3CON12
Québec City, Canada




Domain-Driven Design

Building Blocks
    • Entity: An object that is not defined by its attributes, but rather by a
      thread of continuity and its identity.

    • Value Object: An object that contains attributes but has no
      conceptual identity. They should be treated as immutable.

    • Aggregate: A collection of objects that are bound together by a root
      entity, otherwise known as an aggregate root. The aggregate root
      guarantees the consistency of changes being made within the
      aggregate by forbidding external objects from holding references to
      its members.
T3CON12
Québec City, Canada




Domain-Driven Design

Building Blocks
    • Service: When an operation does not conceptually belong to any
      object. Following the natural contours of the problem, you can
      implement these operations in services.

    • Repository: methods for retrieving domain objects should delegate
      to a specialized Repository object such that alternative storage
      implementations may be easily interchanged.
T3CON12
Québec City, Canada




Domain-Driven Design
T3CON12
Québec City, Canada




Object Management

FLOW3's take on Dependency Injection
    • one of the first PHP implementations
      (started in 2006, improved ever since)

    • object management for the whole lifecycle of all objects

    • no unnecessary configuration if information can be
      gatered automatically (autowiring)

    • intuitive use and no bad magical surprises

    • fast! (like hardcoded or faster)
T3CON12
Québec City, Canada




Constructor Injection

namespace AcmeDemoController;

use TYPO3FLOW3MvcControllerActionController;
use AcmeDemoServiceGreeterService;

class DemoController extends ActionController {
	
	   /**
	    * @var AcmeDemoServiceGreeterService
	    */
	   protected $greeterService;

	      /**
	        * @param AcmeDemoServiceGreeterService
	        */
	      public function __construct(GreeterService $greeterService) {
	      	    $this->greeterService = $greeterService;
	      }
	
      /**
        * @param string $name
        */
      public function helloAction($name) {
      	
      	     return $this->greeterService->greet($name);
      }
}
T3CON12
Québec City, Canada




Setter Injection

namespace AcmeDemoController;

use TYPO3FLOW3MVCControllerActionController;
use AcmeDemoServiceGreeterService;

class DemoController extends ActionController {
	
	   /**
	    * @var AcmeDemoServiceGreeterService
	    */
	   protected $greeterService;

	      /**
	        * @param AcmeDemoServiceGreeterService
	        */
	      public function injectGreeterService(GreeterService $greeterService) {
	      	    $this->greeterService = $greeterService;
	      }
	
       /**
        * @param string $name
        */
       public function helloAction($name) {
      	
      	       return $this->greeterService->greet($name);
       }
}
T3CON12
Québec City, Canada




Property Injection

namespace TYPO3DemoController;

use TYPO3FLOW3Annotations as FLOW3;
use TYPO3FLOW3MVCControllerActionController;
use AcmeDemoServiceGreeterService;

class DemoController extends ActionController {
	
	   /**
	     * @var TYPO3DemoServiceGreeterService
	     * @FLOW3Inject
	     */
	   protected $greeterService;
	
    /**
      * @param string $name
      */
    public function helloAction($name) {
    	
    	     return $this->greeterService->greet($name);
    }
}
T3CON12
Québec City, Canada




Objects.yaml


         TYPO3FLOW3SecurityCryptographyRsaWalletServiceInterface:
           className: TYPO3FLOW3SecurityCryptographyRsaWalletServicePhp
           scope: singleton
           properties:
             keystoreCache:
               object:
                 factoryObjectName: TYPO3FLOW3CacheCacheManager
                 factoryMethodName: getCache
                 arguments:
                   1:
                      value: FLOW3_Security_Cryptography_RSAWallet
T3CON12
Québec City, Canada




Object Management


 class Customer {

 	     /**
 	      * @FLOW3Inject
 	      * @var AcmeCustomerNumberGenerator
 	      */
 	     protected $customerNumberGenerator;
       ...
 }

 $customer = new Customer();
 $customer->getCustomerNumber();
T3CON12
Québec City, Canada




Object Management
                                      <?php
                                      declare(ENCODING = 'u
                                                            tf-8');
                                      namespace TYPO3Conf
                                                           erenceDomainModel
                                      use TYPO3FLOW3Anno                      Conference;
                                                           tations as FLOW3;

FLOW3 creates proxy classes          /**
                                      * Autogenerated Prox
                                                            y Class
for realizing DI and AOP magic        * @FLOW3Scope(“prot
                                                            otype”)
                                      * @FLOW3Entity
                                      */

    • new operator is supported     class Paper extends
                                    TYPO3FLOW3Persist
                                                          Paper_Original implem
                                                                                 ents TYPO3FLOW3Obj
                                                                                                       ect
                                                          enceAspectPersiste
                                                                                nceMagicInterface {
                                    	     /**
    • proxy classes are created     	      * @var string
                                   	
      on the fly                    	
                                           * @ORMId
                                           * @ORMColumn(length
                                                                ="40")
                                   	       * introduced by TYPO
                                                                3FLOW3Persistence
                                   	       */                                        AspectPersistenceMa
    • in production context all    	     protected $FLOW3_Per
                                                               sistence_Identifier
                                                                                    = NULL;
      code is static              	      private $FLOW3_AOP_P
                                                              roxy_targetMethodsAn
                                                                                   dGroupedAdvices = ar
                                                                                                        ra
                                  	     private $FLOW3_AOP_P
                                                              roxy_groupedAdviceCh
                                                                                   ains = array();
                                  	     private $FLOW3_AOP_P
                                                              roxy_methodIsInAdvic
                                                                                   eMode = array();

                                  	    /**
                                  	     * Autogenerated Prox
                                                             y Method
                                  	     */
                                  	    public function __co
                                                            nstruct()
T3CON12
    Québec City, Canada




    Basic Object Persistence




	    	 // Create a new customer and persist it:
	    $customer = new Customer("Robert");
	    $this->customerRepository->add($customer);

	    	 // Find an existing customer:
	    $otherCustomer = $this->customerRepository->findByFirstName("Karsten");
	
	    	 // and delete it:
	    $this->customerRepository->remove($otherCustomer);
T3CON12
    Québec City, Canada




    Validation and Doctrine Annotations

namespace TYPO3BlogDomainModel;

/**
 * A Blog object
 *
 * @Entity
 */
class Blog {

      /**
       * @var string
       * @validate Text, StringLength(minimum = 1, maximum = 80)
       * @Column(length="80")
       */
      protected $title;

      /**
       * @var DoctrineCommonCollectionsCollection<TYPO3BlogDomainModelPost>
       * @OneToMany(mappedBy="blog")
       * @OrderBy({"date" = "DESC"})
       */
      protected $posts;

      ...

}
T3CON12
Québec City, Canada




Persistence-related Annotations


 @Entity              Declares a class as "entity"

 @Column              Controls the database column related to the class
                      property. Very useful for longer text content
                      (type="text" !)

 @ManyToOne           Defines relations to other entities. Unlike with
 @OneToMany           vanilla Doctrine targetEntity does not have to be
 @ManyToMany          given but will be reused from the @var
 @OneToOne            annotation.

                      cascade can be used to cascade operation to
                      related objects.
T3CON12
Québec City, Canada




Persistence-related Annotations




 @var                 Defines the type of a property, collections can be
                      typed using angle brackets:
                      DoctrineCommonCollectionsCollection<TYPO3ConferenceDomainModelComment>


 @transient           The property will be ignored, it will neither be
                      persisted nor reconstituted

 @identity            Marks the property as part of an objects identity
T3CON12
    Québec City, Canada




    Custom Queries using the Query Object Model
/**
 * A PostRepository
 */
class PostRepository extends TYPO3FLOW3PersistenceRepository {

      /**
        * Finds posts by the specified tag and blog
        *
        * @param TYPO3BlogDomainModelTag $tag
        * @param TYPO3BlogDomainModelBlog $blog The blog the post must refer to
        * @return TYPO3FLOW3PersistenceQueryResultInterface The posts
        */
      public function findByTagAndBlog(TYPO3BlogDomainModelTag $tag,
          TYPO3BlogDomainModelBlog $blog) {
            $query = $this->createQuery();
            return $query->matching(
                $query->logicalAnd(
                    $query->equals('blog', $blog),
                    $query->contains('tags', $tag)
                )
            )
            ->setOrderings(array(
                'date' => TYPO3FLOW3PersistenceQueryInterface::ORDER_DESCENDING)
            )
            ->execute();
      }
}
T3CON12
Québec City, Canada




Schema Management

Running Migrations
• needed after installation or upgrade:


 $ ./flow3 doctrine:migrate
T3CON12
Québec City, Canada




Schema Management

Manual database updates
• for simple situations this can be good enough:


 $ ./flow3 doctrine:create

 $ ./flow3 doctrine:update




• useful when

    • you are just starting a project and have never released
T3CON12
Québec City, Canada




Schema Management

Generating migrations

 $ ./flow3 doctrine:migrationgenerate
 Generated new migration class to "…/Version20110608074324.php"
 from schema differences.
 $




• Generated migrations can contain errors and should be checked
  and adjusted as needed

• Migrations need to be moved to their “owning” package manually
T3CON12
Québec City, Canada




Validation

Validation in FLOW3

• you do not want to code checks into your controllers

• FLOW3 separates validation from your controller’s concerns

    • no PHP code needed for validation

    • declared through annotations
T3CON12
Québec City, Canada




Validation

Validation Models

• BaseProperties
  rules defining the minimum requirements on individual properties of a
  model

• BaseModel
  rules or custom validators enforcing the minimum requirements on the
  combination of properties of a model

• Supplemental
  rules defining additional requirements on a model for a specific
  situation (e.g. a certain action method)
T3CON12
Québec City, Canada




Validation

Base Properties

• Validation rules defined directly at the properties


    	      /**
    	       * @var string
    	       * @validate StringLength(minimum = 10, maximum = 100)
    	       */
    	      protected $title;

    	      /**
    	       * @var string
    	       * @validate StringLength(minimum = 1, maximum = 50)
    	       */
    	      protected $author;
T3CON12
Québec City, Canada




Validation

Validators

• validators provided by FLOW3 can be used through their short name

    • Count, Float, NotEmpty, RegularExpression, Uuid, DateTime,
      NumberRange, StringLength, Alphanumeric, Integer, Number, String,
      EmailAddress, Label, Raw, Text

• custom validators need to implement the ValidatorInterface

• use them by specifying the fully qualified class name
    	      /**
    	       * @var DambekalnsStuffDomainModelStuff
    	       * @validate DambekalnsStuffDomainValidatorStuffValidator
    	       */
    	      protected $stuff;
T3CON12
    Québec City, Canada




    Property Mapper




	    $articleArray = array(
	    	 'headline' => 'Hello World!',
	    	 'story' => 'Just a demo ...'
	    );

	    $article = $mapper->convert($sourceArray, 'Acme.DemoDomainModelArticle');
T3CON12
  Québec City, Canada




 Resource Management

 Image Upload
 Resources are handled like other properties in a form:



	 <f:form method="blog" action="update" object="{blog}" name="blog"
enctype="multipart/form-data">
	 	 <f:if condition="{blog.authorPicture}">
	 	 	 <img src="{f:uri.resource(resource: blog.authorPicture)}" />
	 	 </f:if>
	 	 <label for="authorPicture">Author picture</label>
	 	 <f:form.upload property="authorPicture" id="authorPicture" />
	 	 <f:form.submit value="Update"/>
	 </f:form>
T3CON12
    Québec City, Canada




    Property Mapper

    Allow nested object structures
    For security reasons the creation of nested structure through the
    property mapper is disabled by default

	    /**
	      * @return void
	      */
	    public function initializeUpdateAction() {
	    	 $this->arguments['article']->getPropertyMappingConfiguration()
             ->allowCreationForSubProperty('picture');
	    	 $this->arguments['article']->getPropertyMappingConfiguration()
             ->allowModificationForSubProperty('picture');
	    }
T3CON12
Québec City, Canada




Fluid


Example for assigning a string to a Fluid variable:

	      	 // in the action controller:
	      $this->view->assign('title', 'Welcome to Fluid');




	      <!-- in the Fluid template: -->
	      <head>
	      	 <title>{title}</title>
	      </head>
T3CON12
Québec City, Canada




Fluid


Variables can also be objects:

	      	 // in the action controller:
	      $this->view->assign('conference', $conference);




	      <!-- in the Fluid template: -->
	      <div class="venue">
	      	 <p>Venue Street: {conference.venue.street}</p>
	      </div>
T3CON12
Québec City, Canada




Fluid


if-then-else:

	      	 // in the action controller:
	      $this->view->assign('post', $blogPost);




	      <!-- in the Fluid template: -->
	      <f:if condition="{post.comments}">
	      	 <f:then>There are some comments.</f:then>
	      	 <f:else>There are no comments.</f:else>		
	      </f:if>
T3CON12
Québec City, Canada




Fluid


for-each:

	      	 // in the action controller:
	      $this->view->assign('ages', array("Karsten" => 34, "Robert" => 35));




	      <!-- in the Fluid template: -->
	      <ul>
	      	 <f:for each="{ages}" as="age" key="name">
	      	 	 <li>{name} is {age} year old.</li>
	      	 </f:for>
	      </ul>
T3CON12
Québec City, Canada




Fluid


for-each:

	      	 // in the action controller:
	      $this->view->assign('post', $blogPost);




	      <!-- in the Fluid template: -->
	      <f:if condition="{post.comments}">
	      	 <ul>
	      	 	 <f:for each="{post.comments}" as="comment" >
	      	 	 	 <li>{post.title}</li>
	      	 	 </f:for>
	      	 </ul>	 	 	
	      </f:if>
T3CON12
Québec City, Canada




Fluid


View helpers – in this case the link.action view helper:


	      <!-- in the Fluid template: -->
	      {namespace f=TYPO3FluidViewHelpers}

	      <f:link.action action="delete" arguments="{post: post, really: 'yes'}">
	      	 Delete this post
	      </f:link.action>
T3CON12
Québec City, Canada




Security Policy
T3CON12
Québec City, Canada




Security

Cross-Site Request Forgery
    • enables an attacker to execute privileged operations without being
      authenticated

    • the risk lies in using malicious links or forms while still being
      authenticated

    • imagine a link coming in through an URL shortener...
T3CON12
Québec City, Canada




Security

Avoiding Cross-Site Request Forgery
    • add a (truly!) random string token to each link or form

    • make sure this token is correct before executing anything



    • change the token as often as possible to make it impossible to send
      you a working malicious link while you’re logged in

    • in most cases, we can assume that it should be enough to generate
      one token when you log in – that’s the default
T3CON12
Québec City, Canada




Security

CSRF Protection in FLOW3
    • you must not forget to add that token to any link

    • FLOW3 automatically adds the CSRF token to each

           • link you generate

           • each form you create with Fluid

    • and checks it for every call to a protected action



    • the protection can be disabled using
      @skipCsrfProtection on an action
T3CON12
Québec City, Canada




Roadmap

http://forge.typo3.org/projects/flow3-distribution-base/roadmap
T3CON12
Québec City, Canada




Conference App

git://git.typo3.org/TYPO3v5/Distributions/Conference.git
T3CON12
Québec City, Canada




Blog App

git://git.typo3.org/FLOW3/Applications/Blog.git
Rossmann
• second biggest drug store
  in Germany
• 5,13 billion € turnover
• 31,000 employees
Customer Database
• custom persistence with CouchDB
• SOAP support
• continuous delivery
• cluster setup
                                    by networkteam, Kiel
Amadeus
• world’s biggest
  e-ticket provider
• 217 markets
• 948 million billable
  transactions / year
• 2,7 billion € revenue
Social Media Suite
• central hub for social media activities
  for potentially thousands of travel
  agencies
• advanced form engine
• various detail improvements         by AKOM360, Munich
• uses an early version of
  TYPO3 Phoenix
“Our senior developers are
extremely happy with FLOW3 –

it is definitely the most
capable PHP framework we       Fabian Pfütze
                                 Project Lead
have come across
so far.”
?
T3CON12
Québec City, Canada




Thanks for having me!

Slides:               http://slideshare.net/robertlemke

Examples:             http://github.com/robertlemke

Blog:                 http://robertlemke.com

Twitter:              @robertlemke

Feedback:             robert@typo3.org

FLOW3:                http://flow3.typo3.org

More Related Content

What's hot

Ruby on Rails 101 - Presentation Slides for a Five Day Introductory Course
Ruby on Rails 101 - Presentation Slides for a Five Day Introductory CourseRuby on Rails 101 - Presentation Slides for a Five Day Introductory Course
Ruby on Rails 101 - Presentation Slides for a Five Day Introductory Coursepeter_marklund
 
Killer Docker Workflows for Development
Killer Docker Workflows for DevelopmentKiller Docker Workflows for Development
Killer Docker Workflows for DevelopmentChris Tankersley
 
Modern Web Development with Perl
Modern Web Development with PerlModern Web Development with Perl
Modern Web Development with PerlDave Cross
 
Overview Of .Net 4.0 Sanjay Vyas
Overview Of .Net 4.0   Sanjay VyasOverview Of .Net 4.0   Sanjay Vyas
Overview Of .Net 4.0 Sanjay Vyasrsnarayanan
 
Yang in OpenDaylight
Yang in OpenDaylightYang in OpenDaylight
Yang in OpenDaylightGunjan Patel
 
Ruby on Rails Training - Module 1
Ruby on Rails Training - Module 1Ruby on Rails Training - Module 1
Ruby on Rails Training - Module 1Mark Menard
 
Web Development in Perl
Web Development in PerlWeb Development in Perl
Web Development in PerlNaveen Gupta
 
What's new in DWR version 3
What's new in DWR version 3What's new in DWR version 3
What's new in DWR version 3Joe Walker
 
JavaOne 2008 - TS-5793 - Groovy and Grails, changing the landscape of Java EE...
JavaOne 2008 - TS-5793 - Groovy and Grails, changing the landscape of Java EE...JavaOne 2008 - TS-5793 - Groovy and Grails, changing the landscape of Java EE...
JavaOne 2008 - TS-5793 - Groovy and Grails, changing the landscape of Java EE...Guillaume Laforge
 
How to collect Big Data into Hadoop
How to collect Big Data into HadoopHow to collect Big Data into Hadoop
How to collect Big Data into HadoopSadayuki Furuhashi
 
SD, a P2P bug tracking system
SD, a P2P bug tracking systemSD, a P2P bug tracking system
SD, a P2P bug tracking systemJesse Vincent
 
Dive into Fluentd plugin v0.12
Dive into Fluentd plugin v0.12Dive into Fluentd plugin v0.12
Dive into Fluentd plugin v0.12N Masahiro
 
2019 11-bgphp
2019 11-bgphp2019 11-bgphp
2019 11-bgphpdantleech
 
Introduction to Ruby on Rails
Introduction to Ruby on RailsIntroduction to Ruby on Rails
Introduction to Ruby on RailsAgnieszka Figiel
 
Fluentd meetup dive into fluent plugin (outdated)
Fluentd meetup dive into fluent plugin (outdated)Fluentd meetup dive into fluent plugin (outdated)
Fluentd meetup dive into fluent plugin (outdated)N Masahiro
 

What's hot (20)

Ruby on Rails 101 - Presentation Slides for a Five Day Introductory Course
Ruby on Rails 101 - Presentation Slides for a Five Day Introductory CourseRuby on Rails 101 - Presentation Slides for a Five Day Introductory Course
Ruby on Rails 101 - Presentation Slides for a Five Day Introductory Course
 
Killer Docker Workflows for Development
Killer Docker Workflows for DevelopmentKiller Docker Workflows for Development
Killer Docker Workflows for Development
 
Modern Web Development with Perl
Modern Web Development with PerlModern Web Development with Perl
Modern Web Development with Perl
 
Overview Of .Net 4.0 Sanjay Vyas
Overview Of .Net 4.0   Sanjay VyasOverview Of .Net 4.0   Sanjay Vyas
Overview Of .Net 4.0 Sanjay Vyas
 
Yang in OpenDaylight
Yang in OpenDaylightYang in OpenDaylight
Yang in OpenDaylight
 
Ruby on Rails Training - Module 1
Ruby on Rails Training - Module 1Ruby on Rails Training - Module 1
Ruby on Rails Training - Module 1
 
Web Development in Perl
Web Development in PerlWeb Development in Perl
Web Development in Perl
 
What's new in DWR version 3
What's new in DWR version 3What's new in DWR version 3
What's new in DWR version 3
 
JavaOne 2008 - TS-5793 - Groovy and Grails, changing the landscape of Java EE...
JavaOne 2008 - TS-5793 - Groovy and Grails, changing the landscape of Java EE...JavaOne 2008 - TS-5793 - Groovy and Grails, changing the landscape of Java EE...
JavaOne 2008 - TS-5793 - Groovy and Grails, changing the landscape of Java EE...
 
Demo 0.9.4
Demo 0.9.4Demo 0.9.4
Demo 0.9.4
 
How to collect Big Data into Hadoop
How to collect Big Data into HadoopHow to collect Big Data into Hadoop
How to collect Big Data into Hadoop
 
Serialization in Go
Serialization in GoSerialization in Go
Serialization in Go
 
Fluentd meetup at Slideshare
Fluentd meetup at SlideshareFluentd meetup at Slideshare
Fluentd meetup at Slideshare
 
Ndp Slides
Ndp SlidesNdp Slides
Ndp Slides
 
SD, a P2P bug tracking system
SD, a P2P bug tracking systemSD, a P2P bug tracking system
SD, a P2P bug tracking system
 
Dive into Fluentd plugin v0.12
Dive into Fluentd plugin v0.12Dive into Fluentd plugin v0.12
Dive into Fluentd plugin v0.12
 
How DSL works on Ruby
How DSL works on RubyHow DSL works on Ruby
How DSL works on Ruby
 
2019 11-bgphp
2019 11-bgphp2019 11-bgphp
2019 11-bgphp
 
Introduction to Ruby on Rails
Introduction to Ruby on RailsIntroduction to Ruby on Rails
Introduction to Ruby on Rails
 
Fluentd meetup dive into fluent plugin (outdated)
Fluentd meetup dive into fluent plugin (outdated)Fluentd meetup dive into fluent plugin (outdated)
Fluentd meetup dive into fluent plugin (outdated)
 

Viewers also liked

Profiling TYPO3 Flow Applications
Profiling TYPO3 Flow ApplicationsProfiling TYPO3 Flow Applications
Profiling TYPO3 Flow ApplicationsKarsten Dambekalns
 
Hands on FLOW3 (DPC12)
Hands on FLOW3 (DPC12)Hands on FLOW3 (DPC12)
Hands on FLOW3 (DPC12)Robert Lemke
 
Turning Neos inside out / React.js HH
Turning Neos inside out / React.js HHTurning Neos inside out / React.js HH
Turning Neos inside out / React.js HHRobert Lemke
 
Meet Neos Nürnberg 2016: Ja ich will!
Meet Neos Nürnberg 2016: Ja ich will!Meet Neos Nürnberg 2016: Ja ich will!
Meet Neos Nürnberg 2016: Ja ich will!Robert Lemke
 
Meet Neos Nürnberg 2016: Hallo Neos!
Meet Neos Nürnberg 2016: Hallo Neos!Meet Neos Nürnberg 2016: Hallo Neos!
Meet Neos Nürnberg 2016: Hallo Neos!Robert Lemke
 
Is this Open Source Thing Really Worth it? (IPC 2016 Berlin)
Is this Open Source Thing Really Worth it? (IPC 2016 Berlin)Is this Open Source Thing Really Worth it? (IPC 2016 Berlin)
Is this Open Source Thing Really Worth it? (IPC 2016 Berlin)Robert Lemke
 
The Neos Brand (Inspiring Conference 2016)
The Neos Brand (Inspiring Conference 2016)The Neos Brand (Inspiring Conference 2016)
The Neos Brand (Inspiring Conference 2016)Robert Lemke
 
Neos - past, present, future (Inspiring Conference 2016)
Neos - past, present, future (Inspiring Conference 2016)Neos - past, present, future (Inspiring Conference 2016)
Neos - past, present, future (Inspiring Conference 2016)Robert Lemke
 
Docker in Production - IPC 2016
Docker in Production - IPC 2016Docker in Production - IPC 2016
Docker in Production - IPC 2016Robert Lemke
 

Viewers also liked (9)

Profiling TYPO3 Flow Applications
Profiling TYPO3 Flow ApplicationsProfiling TYPO3 Flow Applications
Profiling TYPO3 Flow Applications
 
Hands on FLOW3 (DPC12)
Hands on FLOW3 (DPC12)Hands on FLOW3 (DPC12)
Hands on FLOW3 (DPC12)
 
Turning Neos inside out / React.js HH
Turning Neos inside out / React.js HHTurning Neos inside out / React.js HH
Turning Neos inside out / React.js HH
 
Meet Neos Nürnberg 2016: Ja ich will!
Meet Neos Nürnberg 2016: Ja ich will!Meet Neos Nürnberg 2016: Ja ich will!
Meet Neos Nürnberg 2016: Ja ich will!
 
Meet Neos Nürnberg 2016: Hallo Neos!
Meet Neos Nürnberg 2016: Hallo Neos!Meet Neos Nürnberg 2016: Hallo Neos!
Meet Neos Nürnberg 2016: Hallo Neos!
 
Is this Open Source Thing Really Worth it? (IPC 2016 Berlin)
Is this Open Source Thing Really Worth it? (IPC 2016 Berlin)Is this Open Source Thing Really Worth it? (IPC 2016 Berlin)
Is this Open Source Thing Really Worth it? (IPC 2016 Berlin)
 
The Neos Brand (Inspiring Conference 2016)
The Neos Brand (Inspiring Conference 2016)The Neos Brand (Inspiring Conference 2016)
The Neos Brand (Inspiring Conference 2016)
 
Neos - past, present, future (Inspiring Conference 2016)
Neos - past, present, future (Inspiring Conference 2016)Neos - past, present, future (Inspiring Conference 2016)
Neos - past, present, future (Inspiring Conference 2016)
 
Docker in Production - IPC 2016
Docker in Production - IPC 2016Docker in Production - IPC 2016
Docker in Production - IPC 2016
 

Similar to Getting Into FLOW3 (TYPO312CA)

Getting Into FLOW3 (DPC12)
Getting Into FLOW3 (DPC12)Getting Into FLOW3 (DPC12)
Getting Into FLOW3 (DPC12)Robert Lemke
 
IPCSE12: Getting into FLOW3
IPCSE12: Getting into FLOW3IPCSE12: Getting into FLOW3
IPCSE12: Getting into FLOW3Robert Lemke
 
Fluent Development with FLOW3 1.0
Fluent Development with FLOW3 1.0Fluent Development with FLOW3 1.0
Fluent Development with FLOW3 1.0Robert Lemke
 
IPCSE12: Hands on FLOW3
IPCSE12: Hands on FLOW3IPCSE12: Hands on FLOW3
IPCSE12: Hands on FLOW3Robert Lemke
 
FLOW3 Tutorial - T3CON11 Frankfurt
FLOW3 Tutorial - T3CON11 FrankfurtFLOW3 Tutorial - T3CON11 Frankfurt
FLOW3 Tutorial - T3CON11 FrankfurtRobert Lemke
 
2012 08-11-flow3-northeast-php
2012 08-11-flow3-northeast-php2012 08-11-flow3-northeast-php
2012 08-11-flow3-northeast-phpJochen Rau
 
Fluent Development with FLOW3 1.0
Fluent Development with FLOW3 1.0Fluent Development with FLOW3 1.0
Fluent Development with FLOW3 1.0Robert Lemke
 
Applications for the Enterprise with PHP (CPEurope)
Applications for the Enterprise with PHP (CPEurope)Applications for the Enterprise with PHP (CPEurope)
Applications for the Enterprise with PHP (CPEurope)Robert Lemke
 
Architecting .NET Applications for Docker and Container Based Deployments
Architecting .NET Applications for Docker and Container Based DeploymentsArchitecting .NET Applications for Docker and Container Based Deployments
Architecting .NET Applications for Docker and Container Based DeploymentsBen Hall
 
Speed up your developments with Symfony2
Speed up your developments with Symfony2Speed up your developments with Symfony2
Speed up your developments with Symfony2Hugo Hamon
 
DCEU 18: Developing with Docker Containers
DCEU 18: Developing with Docker ContainersDCEU 18: Developing with Docker Containers
DCEU 18: Developing with Docker ContainersDocker, Inc.
 
XebiCon'18 - Passage à l'échelle de mes applications Kafka-Streams
XebiCon'18 - Passage à l'échelle de mes applications Kafka-StreamsXebiCon'18 - Passage à l'échelle de mes applications Kafka-Streams
XebiCon'18 - Passage à l'échelle de mes applications Kafka-StreamsPublicis Sapient Engineering
 
Server(less) Swift at SwiftCloudWorkshop 3
Server(less) Swift at SwiftCloudWorkshop 3Server(less) Swift at SwiftCloudWorkshop 3
Server(less) Swift at SwiftCloudWorkshop 3kognate
 
Kubernetes for java developers - Tutorial at Oracle Code One 2018
Kubernetes for java developers - Tutorial at Oracle Code One 2018Kubernetes for java developers - Tutorial at Oracle Code One 2018
Kubernetes for java developers - Tutorial at Oracle Code One 2018Anthony Dahanne
 
Into The Box 2018 Going live with commandbox and docker
Into The Box 2018 Going live with commandbox and dockerInto The Box 2018 Going live with commandbox and docker
Into The Box 2018 Going live with commandbox and dockerOrtus Solutions, Corp
 
Going live with BommandBox and docker Into The Box 2018
Going live with BommandBox and docker Into The Box 2018Going live with BommandBox and docker Into The Box 2018
Going live with BommandBox and docker Into The Box 2018Ortus Solutions, Corp
 
Kubernetes Java Operator
Kubernetes Java OperatorKubernetes Java Operator
Kubernetes Java OperatorAnthony Dahanne
 

Similar to Getting Into FLOW3 (TYPO312CA) (20)

Getting Into FLOW3 (DPC12)
Getting Into FLOW3 (DPC12)Getting Into FLOW3 (DPC12)
Getting Into FLOW3 (DPC12)
 
IPCSE12: Getting into FLOW3
IPCSE12: Getting into FLOW3IPCSE12: Getting into FLOW3
IPCSE12: Getting into FLOW3
 
Fluent Development with FLOW3 1.0
Fluent Development with FLOW3 1.0Fluent Development with FLOW3 1.0
Fluent Development with FLOW3 1.0
 
IPCSE12: Hands on FLOW3
IPCSE12: Hands on FLOW3IPCSE12: Hands on FLOW3
IPCSE12: Hands on FLOW3
 
FLOW3 Tutorial - T3CON11 Frankfurt
FLOW3 Tutorial - T3CON11 FrankfurtFLOW3 Tutorial - T3CON11 Frankfurt
FLOW3 Tutorial - T3CON11 Frankfurt
 
2012 08-11-flow3-northeast-php
2012 08-11-flow3-northeast-php2012 08-11-flow3-northeast-php
2012 08-11-flow3-northeast-php
 
Fluent Development with FLOW3 1.0
Fluent Development with FLOW3 1.0Fluent Development with FLOW3 1.0
Fluent Development with FLOW3 1.0
 
Docker Kubernetes Istio
Docker Kubernetes IstioDocker Kubernetes Istio
Docker Kubernetes Istio
 
Applications for the Enterprise with PHP (CPEurope)
Applications for the Enterprise with PHP (CPEurope)Applications for the Enterprise with PHP (CPEurope)
Applications for the Enterprise with PHP (CPEurope)
 
Architecting .NET Applications for Docker and Container Based Deployments
Architecting .NET Applications for Docker and Container Based DeploymentsArchitecting .NET Applications for Docker and Container Based Deployments
Architecting .NET Applications for Docker and Container Based Deployments
 
Speed up your developments with Symfony2
Speed up your developments with Symfony2Speed up your developments with Symfony2
Speed up your developments with Symfony2
 
DCEU 18: Developing with Docker Containers
DCEU 18: Developing with Docker ContainersDCEU 18: Developing with Docker Containers
DCEU 18: Developing with Docker Containers
 
XebiCon'18 - Passage à l'échelle de mes applications Kafka-Streams
XebiCon'18 - Passage à l'échelle de mes applications Kafka-StreamsXebiCon'18 - Passage à l'échelle de mes applications Kafka-Streams
XebiCon'18 - Passage à l'échelle de mes applications Kafka-Streams
 
Inside DocBlox
Inside DocBloxInside DocBlox
Inside DocBlox
 
Server(less) Swift at SwiftCloudWorkshop 3
Server(less) Swift at SwiftCloudWorkshop 3Server(less) Swift at SwiftCloudWorkshop 3
Server(less) Swift at SwiftCloudWorkshop 3
 
Kubernetes for java developers - Tutorial at Oracle Code One 2018
Kubernetes for java developers - Tutorial at Oracle Code One 2018Kubernetes for java developers - Tutorial at Oracle Code One 2018
Kubernetes for java developers - Tutorial at Oracle Code One 2018
 
Into The Box 2018 Going live with commandbox and docker
Into The Box 2018 Going live with commandbox and dockerInto The Box 2018 Going live with commandbox and docker
Into The Box 2018 Going live with commandbox and docker
 
Going live with BommandBox and docker Into The Box 2018
Going live with BommandBox and docker Into The Box 2018Going live with BommandBox and docker Into The Box 2018
Going live with BommandBox and docker Into The Box 2018
 
Before & After Docker Init
Before & After Docker InitBefore & After Docker Init
Before & After Docker Init
 
Kubernetes Java Operator
Kubernetes Java OperatorKubernetes Java Operator
Kubernetes Java Operator
 

More from Robert Lemke

Neos Content Repository – Git for content
Neos Content Repository – Git for contentNeos Content Repository – Git for content
Neos Content Repository – Git for contentRobert Lemke
 
A General Purpose Docker Image for PHP
A General Purpose Docker Image for PHPA General Purpose Docker Image for PHP
A General Purpose Docker Image for PHPRobert Lemke
 
Scaleable PHP Applications in Kubernetes
Scaleable PHP Applications in KubernetesScaleable PHP Applications in Kubernetes
Scaleable PHP Applications in KubernetesRobert Lemke
 
Flownative Beach - Neos Meetup Hamburg 2022
Flownative Beach - Neos Meetup Hamburg 2022Flownative Beach - Neos Meetup Hamburg 2022
Flownative Beach - Neos Meetup Hamburg 2022Robert Lemke
 
GitOps with Flux - IPC Munich 2022
GitOps with Flux - IPC Munich 2022GitOps with Flux - IPC Munich 2022
GitOps with Flux - IPC Munich 2022Robert Lemke
 
OpenID Connect with Neos and Flow
OpenID Connect with Neos and FlowOpenID Connect with Neos and Flow
OpenID Connect with Neos and FlowRobert Lemke
 
Neos Conference 2019 Keynote
Neos Conference 2019 KeynoteNeos Conference 2019 Keynote
Neos Conference 2019 KeynoteRobert Lemke
 
A practical introduction to Kubernetes (IPC 2018)
A practical introduction to Kubernetes (IPC 2018)A practical introduction to Kubernetes (IPC 2018)
A practical introduction to Kubernetes (IPC 2018)Robert Lemke
 
Neos Conference 2018 Welcome Keynote
Neos Conference 2018 Welcome KeynoteNeos Conference 2018 Welcome Keynote
Neos Conference 2018 Welcome KeynoteRobert Lemke
 
A practical introduction to Event Sourcing and CQRS
A practical introduction to Event Sourcing and CQRSA practical introduction to Event Sourcing and CQRS
A practical introduction to Event Sourcing and CQRSRobert Lemke
 
Neos Conference 2017 Welcome Keynote
Neos Conference 2017 Welcome KeynoteNeos Conference 2017 Welcome Keynote
Neos Conference 2017 Welcome KeynoteRobert Lemke
 
IPC16: A Practical Introduction to Kubernetes
IPC16: A Practical Introduction to Kubernetes IPC16: A Practical Introduction to Kubernetes
IPC16: A Practical Introduction to Kubernetes Robert Lemke
 
IPC 2016: Content Strategy for Developers
IPC 2016: Content Strategy for DevelopersIPC 2016: Content Strategy for Developers
IPC 2016: Content Strategy for DevelopersRobert Lemke
 
Docker in Production - IPC 15 München
Docker in Production - IPC 15 MünchenDocker in Production - IPC 15 München
Docker in Production - IPC 15 MünchenRobert Lemke
 
Two Stack CMS - code.talks 2015
Two Stack CMS - code.talks 2015Two Stack CMS - code.talks 2015
Two Stack CMS - code.talks 2015Robert Lemke
 
Two Stack CMS – code.talks Hamburg 2015
Two Stack CMS – code.talks Hamburg 2015Two Stack CMS – code.talks Hamburg 2015
Two Stack CMS – code.talks Hamburg 2015Robert Lemke
 
Neos: Assets in the Cloud - Inspiring Conference 2015
Neos: Assets in the Cloud - Inspiring Conference 2015Neos: Assets in the Cloud - Inspiring Conference 2015
Neos: Assets in the Cloud - Inspiring Conference 2015Robert Lemke
 
Neos – Past, Present, Future – Keynote Inspiring Conference 2015
Neos – Past, Present, Future – Keynote Inspiring Conference 2015Neos – Past, Present, Future – Keynote Inspiring Conference 2015
Neos – Past, Present, Future – Keynote Inspiring Conference 2015Robert Lemke
 
SPHERE.IO & Neos (eCommerce Camp Jena)
SPHERE.IO & Neos (eCommerce Camp Jena)SPHERE.IO & Neos (eCommerce Camp Jena)
SPHERE.IO & Neos (eCommerce Camp Jena)Robert Lemke
 
Multi Language Websites with TYPO3 Neos
Multi Language Websites with TYPO3 NeosMulti Language Websites with TYPO3 Neos
Multi Language Websites with TYPO3 NeosRobert Lemke
 

More from Robert Lemke (20)

Neos Content Repository – Git for content
Neos Content Repository – Git for contentNeos Content Repository – Git for content
Neos Content Repository – Git for content
 
A General Purpose Docker Image for PHP
A General Purpose Docker Image for PHPA General Purpose Docker Image for PHP
A General Purpose Docker Image for PHP
 
Scaleable PHP Applications in Kubernetes
Scaleable PHP Applications in KubernetesScaleable PHP Applications in Kubernetes
Scaleable PHP Applications in Kubernetes
 
Flownative Beach - Neos Meetup Hamburg 2022
Flownative Beach - Neos Meetup Hamburg 2022Flownative Beach - Neos Meetup Hamburg 2022
Flownative Beach - Neos Meetup Hamburg 2022
 
GitOps with Flux - IPC Munich 2022
GitOps with Flux - IPC Munich 2022GitOps with Flux - IPC Munich 2022
GitOps with Flux - IPC Munich 2022
 
OpenID Connect with Neos and Flow
OpenID Connect with Neos and FlowOpenID Connect with Neos and Flow
OpenID Connect with Neos and Flow
 
Neos Conference 2019 Keynote
Neos Conference 2019 KeynoteNeos Conference 2019 Keynote
Neos Conference 2019 Keynote
 
A practical introduction to Kubernetes (IPC 2018)
A practical introduction to Kubernetes (IPC 2018)A practical introduction to Kubernetes (IPC 2018)
A practical introduction to Kubernetes (IPC 2018)
 
Neos Conference 2018 Welcome Keynote
Neos Conference 2018 Welcome KeynoteNeos Conference 2018 Welcome Keynote
Neos Conference 2018 Welcome Keynote
 
A practical introduction to Event Sourcing and CQRS
A practical introduction to Event Sourcing and CQRSA practical introduction to Event Sourcing and CQRS
A practical introduction to Event Sourcing and CQRS
 
Neos Conference 2017 Welcome Keynote
Neos Conference 2017 Welcome KeynoteNeos Conference 2017 Welcome Keynote
Neos Conference 2017 Welcome Keynote
 
IPC16: A Practical Introduction to Kubernetes
IPC16: A Practical Introduction to Kubernetes IPC16: A Practical Introduction to Kubernetes
IPC16: A Practical Introduction to Kubernetes
 
IPC 2016: Content Strategy for Developers
IPC 2016: Content Strategy for DevelopersIPC 2016: Content Strategy for Developers
IPC 2016: Content Strategy for Developers
 
Docker in Production - IPC 15 München
Docker in Production - IPC 15 MünchenDocker in Production - IPC 15 München
Docker in Production - IPC 15 München
 
Two Stack CMS - code.talks 2015
Two Stack CMS - code.talks 2015Two Stack CMS - code.talks 2015
Two Stack CMS - code.talks 2015
 
Two Stack CMS – code.talks Hamburg 2015
Two Stack CMS – code.talks Hamburg 2015Two Stack CMS – code.talks Hamburg 2015
Two Stack CMS – code.talks Hamburg 2015
 
Neos: Assets in the Cloud - Inspiring Conference 2015
Neos: Assets in the Cloud - Inspiring Conference 2015Neos: Assets in the Cloud - Inspiring Conference 2015
Neos: Assets in the Cloud - Inspiring Conference 2015
 
Neos – Past, Present, Future – Keynote Inspiring Conference 2015
Neos – Past, Present, Future – Keynote Inspiring Conference 2015Neos – Past, Present, Future – Keynote Inspiring Conference 2015
Neos – Past, Present, Future – Keynote Inspiring Conference 2015
 
SPHERE.IO & Neos (eCommerce Camp Jena)
SPHERE.IO & Neos (eCommerce Camp Jena)SPHERE.IO & Neos (eCommerce Camp Jena)
SPHERE.IO & Neos (eCommerce Camp Jena)
 
Multi Language Websites with TYPO3 Neos
Multi Language Websites with TYPO3 NeosMulti Language Websites with TYPO3 Neos
Multi Language Websites with TYPO3 Neos
 

Recently uploaded

Kotlin Multiplatform & Compose Multiplatform - Starter kit for pragmatics
Kotlin Multiplatform & Compose Multiplatform - Starter kit for pragmaticsKotlin Multiplatform & Compose Multiplatform - Starter kit for pragmatics
Kotlin Multiplatform & Compose Multiplatform - Starter kit for pragmaticscarlostorres15106
 
Advanced Test Driven-Development @ php[tek] 2024
Advanced Test Driven-Development @ php[tek] 2024Advanced Test Driven-Development @ php[tek] 2024
Advanced Test Driven-Development @ php[tek] 2024Scott Keck-Warren
 
WordPress Websites for Engineers: Elevate Your Brand
WordPress Websites for Engineers: Elevate Your BrandWordPress Websites for Engineers: Elevate Your Brand
WordPress Websites for Engineers: Elevate Your Brandgvaughan
 
SIP trunking in Janus @ Kamailio World 2024
SIP trunking in Janus @ Kamailio World 2024SIP trunking in Janus @ Kamailio World 2024
SIP trunking in Janus @ Kamailio World 2024Lorenzo Miniero
 
Streamlining Python Development: A Guide to a Modern Project Setup
Streamlining Python Development: A Guide to a Modern Project SetupStreamlining Python Development: A Guide to a Modern Project Setup
Streamlining Python Development: A Guide to a Modern Project SetupFlorian Wilhelm
 
Are Multi-Cloud and Serverless Good or Bad?
Are Multi-Cloud and Serverless Good or Bad?Are Multi-Cloud and Serverless Good or Bad?
Are Multi-Cloud and Serverless Good or Bad?Mattias Andersson
 
"Debugging python applications inside k8s environment", Andrii Soldatenko
"Debugging python applications inside k8s environment", Andrii Soldatenko"Debugging python applications inside k8s environment", Andrii Soldatenko
"Debugging python applications inside k8s environment", Andrii SoldatenkoFwdays
 
"Federated learning: out of reach no matter how close",Oleksandr Lapshyn
"Federated learning: out of reach no matter how close",Oleksandr Lapshyn"Federated learning: out of reach no matter how close",Oleksandr Lapshyn
"Federated learning: out of reach no matter how close",Oleksandr LapshynFwdays
 
Vector Databases 101 - An introduction to the world of Vector Databases
Vector Databases 101 - An introduction to the world of Vector DatabasesVector Databases 101 - An introduction to the world of Vector Databases
Vector Databases 101 - An introduction to the world of Vector DatabasesZilliz
 
AI as an Interface for Commercial Buildings
AI as an Interface for Commercial BuildingsAI as an Interface for Commercial Buildings
AI as an Interface for Commercial BuildingsMemoori
 
Artificial intelligence in cctv survelliance.pptx
Artificial intelligence in cctv survelliance.pptxArtificial intelligence in cctv survelliance.pptx
Artificial intelligence in cctv survelliance.pptxhariprasad279825
 
Beyond Boundaries: Leveraging No-Code Solutions for Industry Innovation
Beyond Boundaries: Leveraging No-Code Solutions for Industry InnovationBeyond Boundaries: Leveraging No-Code Solutions for Industry Innovation
Beyond Boundaries: Leveraging No-Code Solutions for Industry InnovationSafe Software
 
Bun (KitWorks Team Study 노별마루 발표 2024.4.22)
Bun (KitWorks Team Study 노별마루 발표 2024.4.22)Bun (KitWorks Team Study 노별마루 발표 2024.4.22)
Bun (KitWorks Team Study 노별마루 발표 2024.4.22)Wonjun Hwang
 
Story boards and shot lists for my a level piece
Story boards and shot lists for my a level pieceStory boards and shot lists for my a level piece
Story boards and shot lists for my a level piececharlottematthew16
 
Search Engine Optimization SEO PDF for 2024.pdf
Search Engine Optimization SEO PDF for 2024.pdfSearch Engine Optimization SEO PDF for 2024.pdf
Search Engine Optimization SEO PDF for 2024.pdfRankYa
 
Unraveling Multimodality with Large Language Models.pdf
Unraveling Multimodality with Large Language Models.pdfUnraveling Multimodality with Large Language Models.pdf
Unraveling Multimodality with Large Language Models.pdfAlex Barbosa Coqueiro
 
DevoxxFR 2024 Reproducible Builds with Apache Maven
DevoxxFR 2024 Reproducible Builds with Apache MavenDevoxxFR 2024 Reproducible Builds with Apache Maven
DevoxxFR 2024 Reproducible Builds with Apache MavenHervé Boutemy
 
Nell’iperspazio con Rocket: il Framework Web di Rust!
Nell’iperspazio con Rocket: il Framework Web di Rust!Nell’iperspazio con Rocket: il Framework Web di Rust!
Nell’iperspazio con Rocket: il Framework Web di Rust!Commit University
 
Install Stable Diffusion in windows machine
Install Stable Diffusion in windows machineInstall Stable Diffusion in windows machine
Install Stable Diffusion in windows machinePadma Pradeep
 
Unleash Your Potential - Namagunga Girls Coding Club
Unleash Your Potential - Namagunga Girls Coding ClubUnleash Your Potential - Namagunga Girls Coding Club
Unleash Your Potential - Namagunga Girls Coding ClubKalema Edgar
 

Recently uploaded (20)

Kotlin Multiplatform & Compose Multiplatform - Starter kit for pragmatics
Kotlin Multiplatform & Compose Multiplatform - Starter kit for pragmaticsKotlin Multiplatform & Compose Multiplatform - Starter kit for pragmatics
Kotlin Multiplatform & Compose Multiplatform - Starter kit for pragmatics
 
Advanced Test Driven-Development @ php[tek] 2024
Advanced Test Driven-Development @ php[tek] 2024Advanced Test Driven-Development @ php[tek] 2024
Advanced Test Driven-Development @ php[tek] 2024
 
WordPress Websites for Engineers: Elevate Your Brand
WordPress Websites for Engineers: Elevate Your BrandWordPress Websites for Engineers: Elevate Your Brand
WordPress Websites for Engineers: Elevate Your Brand
 
SIP trunking in Janus @ Kamailio World 2024
SIP trunking in Janus @ Kamailio World 2024SIP trunking in Janus @ Kamailio World 2024
SIP trunking in Janus @ Kamailio World 2024
 
Streamlining Python Development: A Guide to a Modern Project Setup
Streamlining Python Development: A Guide to a Modern Project SetupStreamlining Python Development: A Guide to a Modern Project Setup
Streamlining Python Development: A Guide to a Modern Project Setup
 
Are Multi-Cloud and Serverless Good or Bad?
Are Multi-Cloud and Serverless Good or Bad?Are Multi-Cloud and Serverless Good or Bad?
Are Multi-Cloud and Serverless Good or Bad?
 
"Debugging python applications inside k8s environment", Andrii Soldatenko
"Debugging python applications inside k8s environment", Andrii Soldatenko"Debugging python applications inside k8s environment", Andrii Soldatenko
"Debugging python applications inside k8s environment", Andrii Soldatenko
 
"Federated learning: out of reach no matter how close",Oleksandr Lapshyn
"Federated learning: out of reach no matter how close",Oleksandr Lapshyn"Federated learning: out of reach no matter how close",Oleksandr Lapshyn
"Federated learning: out of reach no matter how close",Oleksandr Lapshyn
 
Vector Databases 101 - An introduction to the world of Vector Databases
Vector Databases 101 - An introduction to the world of Vector DatabasesVector Databases 101 - An introduction to the world of Vector Databases
Vector Databases 101 - An introduction to the world of Vector Databases
 
AI as an Interface for Commercial Buildings
AI as an Interface for Commercial BuildingsAI as an Interface for Commercial Buildings
AI as an Interface for Commercial Buildings
 
Artificial intelligence in cctv survelliance.pptx
Artificial intelligence in cctv survelliance.pptxArtificial intelligence in cctv survelliance.pptx
Artificial intelligence in cctv survelliance.pptx
 
Beyond Boundaries: Leveraging No-Code Solutions for Industry Innovation
Beyond Boundaries: Leveraging No-Code Solutions for Industry InnovationBeyond Boundaries: Leveraging No-Code Solutions for Industry Innovation
Beyond Boundaries: Leveraging No-Code Solutions for Industry Innovation
 
Bun (KitWorks Team Study 노별마루 발표 2024.4.22)
Bun (KitWorks Team Study 노별마루 발표 2024.4.22)Bun (KitWorks Team Study 노별마루 발표 2024.4.22)
Bun (KitWorks Team Study 노별마루 발표 2024.4.22)
 
Story boards and shot lists for my a level piece
Story boards and shot lists for my a level pieceStory boards and shot lists for my a level piece
Story boards and shot lists for my a level piece
 
Search Engine Optimization SEO PDF for 2024.pdf
Search Engine Optimization SEO PDF for 2024.pdfSearch Engine Optimization SEO PDF for 2024.pdf
Search Engine Optimization SEO PDF for 2024.pdf
 
Unraveling Multimodality with Large Language Models.pdf
Unraveling Multimodality with Large Language Models.pdfUnraveling Multimodality with Large Language Models.pdf
Unraveling Multimodality with Large Language Models.pdf
 
DevoxxFR 2024 Reproducible Builds with Apache Maven
DevoxxFR 2024 Reproducible Builds with Apache MavenDevoxxFR 2024 Reproducible Builds with Apache Maven
DevoxxFR 2024 Reproducible Builds with Apache Maven
 
Nell’iperspazio con Rocket: il Framework Web di Rust!
Nell’iperspazio con Rocket: il Framework Web di Rust!Nell’iperspazio con Rocket: il Framework Web di Rust!
Nell’iperspazio con Rocket: il Framework Web di Rust!
 
Install Stable Diffusion in windows machine
Install Stable Diffusion in windows machineInstall Stable Diffusion in windows machine
Install Stable Diffusion in windows machine
 
Unleash Your Potential - Namagunga Girls Coding Club
Unleash Your Potential - Namagunga Girls Coding ClubUnleash Your Potential - Namagunga Girls Coding Club
Unleash Your Potential - Namagunga Girls Coding Club
 

Getting Into FLOW3 (TYPO312CA)

  • 1. T3CON12 Québec City, Canada Robert Lemke Getting into FLOW3
  • 2. T3CON12 Québec City, Canada Robert Lemke project founder of FLOW3 and TYPO3 “Phoenix” co-founder of the TYPO3 Association coach, coder, consultant 36 years old lives in Lübeck, Germany 1 wife, 2 daughters, 1 espresso machine likes drumming
  • 3. Starters Installation Kickstart & Hello World! Controller, Actions, Arguments & HTTP Domain-Driven Design Doctrine Forms, Validation
  • 4. Main Dishes Resources, Image Upload Session Handling User, Account, Authentication Authorization
  • 5. Deserts Caching Testing Logging Deployment Signal-Slot I18n Routing Espresso
  • 6. ?
  • 7.
  • 8. T3CON12 Québec City, Canada At a Glance FLOW3 is a web application platform • holistic concept for your apps • modular, extensible, package based • pedantically clean with focus on quality • puts a smile on developer’s faces • free & Open Source (LGPL v3) • backed by one of the largest Open Source projects
  • 9. T3CON12 Québec City, Canada Foundation for the Next Generation CMS TYPO3 “Phoenix” is the all-new Enterprise CMS • content repository, workspaces, versions, i18n, modular UI ... • powered by FLOW3 • compatible code base • use TYPO3 features in FLOW3 standalone apps as you like
  • 10. T3CON12 Québec City, Canada FLOW3 Website and Download #
  • 11. T3CON12 Québec City, Canada Git Clone $ git clone --recursive git://git.typo3.org/FLOW3/Distributions/Base.git . Cloning into .... remote: Counting objects: 3837, done. remote: Compressing objects: 100% (2023/2023), done. remote: Total 3837 (delta 2007), reused 2721 (delta 1465) Receiving objects: 100% (3837/3837), 3.49 MiB | 28 KiB/s, done. Resolving deltas: 100% (2007/2007), done.
  • 12. T3CON12 Québec City, Canada Set File Permissions $ sudo ./flow3 core:setfilepermissions robert _www _www FLOW3 File Permission Script Checking permissions from here upwards. Making sure Data and Web/_Resources exist. Setting file permissions, trying to set ACLs via chmod ... Done. Linux: $ sudo usermod -a -G www-data robert Mac OS X: $ sudo dscl . -append /Groups/_www GroupMembership robert
  • 13. T3CON12 Québec City, Canada Set Up Database Connection Configuration/Settings.yaml # # # Global Settings # # # TYPO3: FLOW3: persistence: backendOptions: dbname: 'demo' user: 'demo' password: 'password' host: '127.0.0.1' # only on Windows: core: phpBinaryPathAndFilename: 'C:/path/to/php.exe'
  • 14. T3CON12 Québec City, Canada Set Up Virtual Host Apache Virtual Host <VirtualHost *:80> DocumentRoot /opt/local/apache2/htdocs/Talks/FLOW3/Web/ ServerName dev.flow3.rob SetEnv FLOW3_CONTEXT Development </VirtualHost> <VirtualHost *:80> DocumentRoot /opt/local/apache2/htdocs/Talks/FLOW3/Web/ ServerName flow3.rob SetEnv FLOW3_CONTEXT Production </VirtualHost>
  • 16. C lo ne t h e Be a s t 5 1 1 1 Ro bert Lem ke D.P. F l u x t r time ();
  • 18. T3CON12 Québec City, Canada Biggest River: Amazon River © Google
  • 19. T3CON12 Québec City, Canada Smallest River: Roe River © Google
  • 20. T3CON12 Québec City, Canada Smallest River: Roe River © Google
  • 21. T3CON12 Québec City, Canada Smallest River: Roe River © Google
  • 23. Smallest Book Store: Roe Books
  • 25. Jus t C o de a Sh o p 5 2 1 1 Ro bert Lem ke D.P. F l u x t r time ();
  • 26. T3CON12 Québec City, Canada Tackling the Heart of Software Development /** Domain-Driven Design * A Book * * @FLOW3Scope(“protot ype”) * @FLOW3Entity A methodology which ... */ class Book { • results in rich domain models /** * @var string */ • provides a common language protected $title; across the project team /** * @var string */ • simplify the design of complex protected $isbn; applications /** * @var string */ protected $description ; FLOW3 is the first PHP framework /** tailored to Domain-Driven Design * @var integer */ protected $price;
  • 27. T3CON12 Québec City, Canada Domain-Driven Design Domain activity or business of the user Domain-Driven Design is about • focussing on the domain and domain logic • accurately mapping the concepts to software • forming a ubiquitous language among the project members
  • 28. T3CON12 Québec City, Canada Domain-Driven Design Ubiquitous Language • important prerequisite for successful collaboration • use the same words for • discussion • modeling • development • documentation
  • 29. T3CON12 Québec City, Canada Domain-Driven Design Building Blocks • Entity: An object that is not defined by its attributes, but rather by a thread of continuity and its identity. • Value Object: An object that contains attributes but has no conceptual identity. They should be treated as immutable. • Aggregate: A collection of objects that are bound together by a root entity, otherwise known as an aggregate root. The aggregate root guarantees the consistency of changes being made within the aggregate by forbidding external objects from holding references to its members.
  • 30. T3CON12 Québec City, Canada Domain-Driven Design Building Blocks • Service: When an operation does not conceptually belong to any object. Following the natural contours of the problem, you can implement these operations in services. • Repository: methods for retrieving domain objects should delegate to a specialized Repository object such that alternative storage implementations may be easily interchanged.
  • 32. T3CON12 Québec City, Canada Object Management FLOW3's take on Dependency Injection • one of the first PHP implementations (started in 2006, improved ever since) • object management for the whole lifecycle of all objects • no unnecessary configuration if information can be gatered automatically (autowiring) • intuitive use and no bad magical surprises • fast! (like hardcoded or faster)
  • 33. T3CON12 Québec City, Canada Constructor Injection namespace AcmeDemoController; use TYPO3FLOW3MvcControllerActionController; use AcmeDemoServiceGreeterService; class DemoController extends ActionController { /** * @var AcmeDemoServiceGreeterService */ protected $greeterService; /** * @param AcmeDemoServiceGreeterService */ public function __construct(GreeterService $greeterService) { $this->greeterService = $greeterService; } /** * @param string $name */ public function helloAction($name) { return $this->greeterService->greet($name); } }
  • 34. T3CON12 Québec City, Canada Setter Injection namespace AcmeDemoController; use TYPO3FLOW3MVCControllerActionController; use AcmeDemoServiceGreeterService; class DemoController extends ActionController { /** * @var AcmeDemoServiceGreeterService */ protected $greeterService; /** * @param AcmeDemoServiceGreeterService */ public function injectGreeterService(GreeterService $greeterService) { $this->greeterService = $greeterService; } /** * @param string $name */ public function helloAction($name) { return $this->greeterService->greet($name); } }
  • 35. T3CON12 Québec City, Canada Property Injection namespace TYPO3DemoController; use TYPO3FLOW3Annotations as FLOW3; use TYPO3FLOW3MVCControllerActionController; use AcmeDemoServiceGreeterService; class DemoController extends ActionController { /** * @var TYPO3DemoServiceGreeterService * @FLOW3Inject */ protected $greeterService; /** * @param string $name */ public function helloAction($name) { return $this->greeterService->greet($name); } }
  • 36. T3CON12 Québec City, Canada Objects.yaml TYPO3FLOW3SecurityCryptographyRsaWalletServiceInterface: className: TYPO3FLOW3SecurityCryptographyRsaWalletServicePhp scope: singleton properties: keystoreCache: object: factoryObjectName: TYPO3FLOW3CacheCacheManager factoryMethodName: getCache arguments: 1: value: FLOW3_Security_Cryptography_RSAWallet
  • 37. T3CON12 Québec City, Canada Object Management class Customer { /** * @FLOW3Inject * @var AcmeCustomerNumberGenerator */ protected $customerNumberGenerator; ... } $customer = new Customer(); $customer->getCustomerNumber();
  • 38. T3CON12 Québec City, Canada Object Management <?php declare(ENCODING = 'u tf-8'); namespace TYPO3Conf erenceDomainModel use TYPO3FLOW3Anno Conference; tations as FLOW3; FLOW3 creates proxy classes /** * Autogenerated Prox y Class for realizing DI and AOP magic * @FLOW3Scope(“prot otype”) * @FLOW3Entity */ • new operator is supported class Paper extends TYPO3FLOW3Persist Paper_Original implem ents TYPO3FLOW3Obj ect enceAspectPersiste nceMagicInterface { /** • proxy classes are created * @var string on the fly * @ORMId * @ORMColumn(length ="40") * introduced by TYPO 3FLOW3Persistence */ AspectPersistenceMa • in production context all protected $FLOW3_Per sistence_Identifier = NULL; code is static private $FLOW3_AOP_P roxy_targetMethodsAn dGroupedAdvices = ar ra private $FLOW3_AOP_P roxy_groupedAdviceCh ains = array(); private $FLOW3_AOP_P roxy_methodIsInAdvic eMode = array(); /** * Autogenerated Prox y Method */ public function __co nstruct()
  • 39. T3CON12 Québec City, Canada Basic Object Persistence // Create a new customer and persist it: $customer = new Customer("Robert"); $this->customerRepository->add($customer); // Find an existing customer: $otherCustomer = $this->customerRepository->findByFirstName("Karsten"); // and delete it: $this->customerRepository->remove($otherCustomer);
  • 40. T3CON12 Québec City, Canada Validation and Doctrine Annotations namespace TYPO3BlogDomainModel; /** * A Blog object * * @Entity */ class Blog { /** * @var string * @validate Text, StringLength(minimum = 1, maximum = 80) * @Column(length="80") */ protected $title; /** * @var DoctrineCommonCollectionsCollection<TYPO3BlogDomainModelPost> * @OneToMany(mappedBy="blog") * @OrderBy({"date" = "DESC"}) */ protected $posts; ... }
  • 41. T3CON12 Québec City, Canada Persistence-related Annotations @Entity Declares a class as "entity" @Column Controls the database column related to the class property. Very useful for longer text content (type="text" !) @ManyToOne Defines relations to other entities. Unlike with @OneToMany vanilla Doctrine targetEntity does not have to be @ManyToMany given but will be reused from the @var @OneToOne annotation. cascade can be used to cascade operation to related objects.
  • 42. T3CON12 Québec City, Canada Persistence-related Annotations @var Defines the type of a property, collections can be typed using angle brackets: DoctrineCommonCollectionsCollection<TYPO3ConferenceDomainModelComment> @transient The property will be ignored, it will neither be persisted nor reconstituted @identity Marks the property as part of an objects identity
  • 43. T3CON12 Québec City, Canada Custom Queries using the Query Object Model /** * A PostRepository */ class PostRepository extends TYPO3FLOW3PersistenceRepository { /** * Finds posts by the specified tag and blog * * @param TYPO3BlogDomainModelTag $tag * @param TYPO3BlogDomainModelBlog $blog The blog the post must refer to * @return TYPO3FLOW3PersistenceQueryResultInterface The posts */ public function findByTagAndBlog(TYPO3BlogDomainModelTag $tag, TYPO3BlogDomainModelBlog $blog) { $query = $this->createQuery(); return $query->matching( $query->logicalAnd( $query->equals('blog', $blog), $query->contains('tags', $tag) ) ) ->setOrderings(array( 'date' => TYPO3FLOW3PersistenceQueryInterface::ORDER_DESCENDING) ) ->execute(); } }
  • 44. T3CON12 Québec City, Canada Schema Management Running Migrations • needed after installation or upgrade: $ ./flow3 doctrine:migrate
  • 45. T3CON12 Québec City, Canada Schema Management Manual database updates • for simple situations this can be good enough: $ ./flow3 doctrine:create $ ./flow3 doctrine:update • useful when • you are just starting a project and have never released
  • 46. T3CON12 Québec City, Canada Schema Management Generating migrations $ ./flow3 doctrine:migrationgenerate Generated new migration class to "…/Version20110608074324.php" from schema differences. $ • Generated migrations can contain errors and should be checked and adjusted as needed • Migrations need to be moved to their “owning” package manually
  • 47. T3CON12 Québec City, Canada Validation Validation in FLOW3 • you do not want to code checks into your controllers • FLOW3 separates validation from your controller’s concerns • no PHP code needed for validation • declared through annotations
  • 48. T3CON12 Québec City, Canada Validation Validation Models • BaseProperties rules defining the minimum requirements on individual properties of a model • BaseModel rules or custom validators enforcing the minimum requirements on the combination of properties of a model • Supplemental rules defining additional requirements on a model for a specific situation (e.g. a certain action method)
  • 49. T3CON12 Québec City, Canada Validation Base Properties • Validation rules defined directly at the properties /** * @var string * @validate StringLength(minimum = 10, maximum = 100) */ protected $title; /** * @var string * @validate StringLength(minimum = 1, maximum = 50) */ protected $author;
  • 50. T3CON12 Québec City, Canada Validation Validators • validators provided by FLOW3 can be used through their short name • Count, Float, NotEmpty, RegularExpression, Uuid, DateTime, NumberRange, StringLength, Alphanumeric, Integer, Number, String, EmailAddress, Label, Raw, Text • custom validators need to implement the ValidatorInterface • use them by specifying the fully qualified class name /** * @var DambekalnsStuffDomainModelStuff * @validate DambekalnsStuffDomainValidatorStuffValidator */ protected $stuff;
  • 51. T3CON12 Québec City, Canada Property Mapper $articleArray = array( 'headline' => 'Hello World!', 'story' => 'Just a demo ...' ); $article = $mapper->convert($sourceArray, 'Acme.DemoDomainModelArticle');
  • 52. T3CON12 Québec City, Canada Resource Management Image Upload Resources are handled like other properties in a form: <f:form method="blog" action="update" object="{blog}" name="blog" enctype="multipart/form-data"> <f:if condition="{blog.authorPicture}"> <img src="{f:uri.resource(resource: blog.authorPicture)}" /> </f:if> <label for="authorPicture">Author picture</label> <f:form.upload property="authorPicture" id="authorPicture" /> <f:form.submit value="Update"/> </f:form>
  • 53. T3CON12 Québec City, Canada Property Mapper Allow nested object structures For security reasons the creation of nested structure through the property mapper is disabled by default /** * @return void */ public function initializeUpdateAction() { $this->arguments['article']->getPropertyMappingConfiguration() ->allowCreationForSubProperty('picture'); $this->arguments['article']->getPropertyMappingConfiguration() ->allowModificationForSubProperty('picture'); }
  • 54. T3CON12 Québec City, Canada Fluid Example for assigning a string to a Fluid variable: // in the action controller: $this->view->assign('title', 'Welcome to Fluid'); <!-- in the Fluid template: --> <head> <title>{title}</title> </head>
  • 55. T3CON12 Québec City, Canada Fluid Variables can also be objects: // in the action controller: $this->view->assign('conference', $conference); <!-- in the Fluid template: --> <div class="venue"> <p>Venue Street: {conference.venue.street}</p> </div>
  • 56. T3CON12 Québec City, Canada Fluid if-then-else: // in the action controller: $this->view->assign('post', $blogPost); <!-- in the Fluid template: --> <f:if condition="{post.comments}"> <f:then>There are some comments.</f:then> <f:else>There are no comments.</f:else> </f:if>
  • 57. T3CON12 Québec City, Canada Fluid for-each: // in the action controller: $this->view->assign('ages', array("Karsten" => 34, "Robert" => 35)); <!-- in the Fluid template: --> <ul> <f:for each="{ages}" as="age" key="name"> <li>{name} is {age} year old.</li> </f:for> </ul>
  • 58. T3CON12 Québec City, Canada Fluid for-each: // in the action controller: $this->view->assign('post', $blogPost); <!-- in the Fluid template: --> <f:if condition="{post.comments}"> <ul> <f:for each="{post.comments}" as="comment" > <li>{post.title}</li> </f:for> </ul> </f:if>
  • 59. T3CON12 Québec City, Canada Fluid View helpers – in this case the link.action view helper: <!-- in the Fluid template: --> {namespace f=TYPO3FluidViewHelpers} <f:link.action action="delete" arguments="{post: post, really: 'yes'}"> Delete this post </f:link.action>
  • 61. T3CON12 Québec City, Canada Security Cross-Site Request Forgery • enables an attacker to execute privileged operations without being authenticated • the risk lies in using malicious links or forms while still being authenticated • imagine a link coming in through an URL shortener...
  • 62. T3CON12 Québec City, Canada Security Avoiding Cross-Site Request Forgery • add a (truly!) random string token to each link or form • make sure this token is correct before executing anything • change the token as often as possible to make it impossible to send you a working malicious link while you’re logged in • in most cases, we can assume that it should be enough to generate one token when you log in – that’s the default
  • 63. T3CON12 Québec City, Canada Security CSRF Protection in FLOW3 • you must not forget to add that token to any link • FLOW3 automatically adds the CSRF token to each • link you generate • each form you create with Fluid • and checks it for every call to a protected action • the protection can be disabled using @skipCsrfProtection on an action
  • 65. T3CON12 Québec City, Canada Conference App git://git.typo3.org/TYPO3v5/Distributions/Conference.git
  • 66. T3CON12 Québec City, Canada Blog App git://git.typo3.org/FLOW3/Applications/Blog.git
  • 67. Rossmann • second biggest drug store in Germany • 5,13 billion € turnover • 31,000 employees
  • 68. Customer Database • custom persistence with CouchDB • SOAP support • continuous delivery • cluster setup by networkteam, Kiel
  • 69. Amadeus • world’s biggest e-ticket provider • 217 markets • 948 million billable transactions / year • 2,7 billion € revenue
  • 70. Social Media Suite • central hub for social media activities for potentially thousands of travel agencies • advanced form engine • various detail improvements by AKOM360, Munich • uses an early version of TYPO3 Phoenix
  • 71. “Our senior developers are extremely happy with FLOW3 – it is definitely the most capable PHP framework we Fabian Pfütze Project Lead have come across so far.”
  • 72. ?
  • 73. T3CON12 Québec City, Canada Thanks for having me! Slides: http://slideshare.net/robertlemke Examples: http://github.com/robertlemke Blog: http://robertlemke.com Twitter: @robertlemke Feedback: robert@typo3.org FLOW3: http://flow3.typo3.org