fluent development with flow3

Post on 19-May-2015

993 Views

Category:

Documents

1 Downloads

Preview:

Click to see full reader

DESCRIPTION

FLOW3 is a modern web application framework for PHP, developed as the foundation of the upcoming version of the TYPO3 CMS. It introduces new development concepts to the PHP world such as Domain-Driven Design, Dependency Injection and Aspect-Oriented Programming. In this session you’ll get a first-hand introduction to the concepts behind FLOW3.

TRANSCRIPT

Inspiring people toshare

International PHP Conference 2008Fluent Development with FLOW3

The History of FLOW3(short version)

Since 1998

33 core members

committed 500.000 lines of code

resulting in a code base of

300.000 lines today

The Long History of TYPO3

Inspiring people toshareFluent Development with FLOW3

TYPO3 todayTYPO3 v4 is nearly feature complete

Grown architecture, few unit tests

Fundamental changes are risky

Often used as an application framework - but was designed as a CMS

Inspiring people toshareFluent Development with FLOW3

TYPO3 tomorrow?

<?php

Inspiring people toshareFluent Development with FLOW3

Buy none get two for free.

Inspiring people toshareFluent Development with FLOW3

TYPO3 tomorrowFLOW3 acts as a reliable basis for any kind of web application

TYPO3 v5 is a package based on FLOW3

Extensions are packages as well, all based on FLOW3

Packages can be used

as extensions for TYPO3

as libraries for standalone applications

Inspiring people toshareFluent Development with FLOW3

The FLOW3 experienceFlow [fl!] The mental state of operation in which the person is fully immersed in what he or she is doing by a feeling of energized focus, full involvement, and success in the process of the activity. Proposed by positive psychologist Mihály Csíkszentmihályi, the concept has been widely referenced across a variety of fields.

FLOW3 [fl!'three] The application framework which takes care of all hassle and lets you play the fun part.

Inspiring people toshareFluent Development with FLOW3

! /**

! * Creates a customer

! *

! * @return void

! */

! public function createAction() {

! ! if (!$this->authorizationService->getCurrentUser()->hasRole('Admin')) {

! ! ! $this->logger->log('Someone tried to create a new customer.');

! ! ! throw new AccessDeniedException('You may not create customers.');

! ! }

! ! if ($this->request->getProtocol != 'HTTPS') {

! ! ! $this->logger->log('Someone tried to create a new customer not using HTTPS.');

! ! ! throw new SecurityException('Customers may only be created via HTTPS');

! ! }

! !

! ! if (strlen($_POST['firstname']) > 50) throw new InvalidArgumentException();

! !

! ! $customer = new Model\Customer;

! ! $customer->setFirstName($_POST['firstname']);

! ! $customer->setLastName($_POST['lastname']);

! !

! ! $customerValidator = MyApp\Validators\CustomerValidator::getInstance();

! ! if ($customerValidator->validate($customer)) {

! ! ! $customer->save();

! ! ! $this->logger->log('A new customer was saved');

! ! } else {

! ! ! throw new InvalidCustomerException();

! ! }

! }

Inspiring people toshareFluent Development with FLOW3

! /**

! * Creates a customer

! *

! * @return void

! */

! public function createAction() {

! ! if (!$this->authorizationService->getCurrentUser()->hasRole('Admin')) {

! ! ! $this->logger->log('Someone tried to create a new customer.');

! ! ! throw new AccessDeniedException('You may not create customers.');

! ! }

! ! if ($this->request->getProtocol != 'HTTPS') {

! ! ! $this->logger->log('Someone tried to create a new customer not using HTTPS.');

! ! ! throw new SecurityException('Customers may only be created via HTTPS');

! ! }

! !

! ! if (strlen($_POST['firstname']) > 50) throw new InvalidArgumentException();

! !

! ! $customer = new Model\Customer;

! ! $customer->setFirstName($_POST['firstname']);

! ! $customer->setLastName($_POST['lastname']);

! !

! ! $customerValidator = MyApp\Validators\CustomerValidator::getInstance();

! ! if ($customerValidator->validate($customer)) {

! ! ! $customer->save();

! ! ! $this->logger->log('A new customer was saved');

! ! } else {

! ! ! throw new InvalidCustomerException();

! ! }

! }

Inspiring people toshareFluent Development with FLOW3

<?php

! /**

! * Creates a customer

! *

! * @return void

! */

! public function createAction() {

! ! if ($this->arguments->hasErrors()) $this->throwStatus(400, 'Bad Request', '<strong>Invalid arguments!</strong>');

! ! $customer = new Domain\Model\Customer();

! ! $this->dataMapper->map($this->arguments['customer'], $customer);

! ! $this->customerRepository->add($customer);

! ! $this->throwStatus(201);

! }

?>

Inspiring people toshareFluent Development with FLOW3

FLOW3 = Application FrameworkNot just a collection of components or code snippet library

Comes with ready-to-go default configuration

Package based

Runs with PHP 5.3 or later

Comes with a powerful JSR-283 based Content Repository

PHP 5.3alpha1

Inspiring people toshareFluent Development with FLOW3

Finest Handmade PHP Code100% documented source code (top project at Ohloh)

Consistent and intuitive class, method and variable names

FLOW3 Core Team always develops test-driven

Continuous Integration

multiple commits each day

automatic tests for Linux, Windows and Mac with SQLite, MySQL and Postgres

open CI server with statistics, email and jabber notifications

Inspiring people toshareFluent Development with FLOW3

FLOW3 modulesAOP

Component

Configuration

Cache

Error

Event

Locale

Log

MVC

Package

Persistence

Property

Reflection

Resource

Security

Utility

Validation

... and more

Inspiring people toshareFluent Development with FLOW3

Getting Started

Inspiring people toshareFluent Development with FLOW3

Getting Started

RequirementsSome webserver (tested with Apache and IIS)

PHP 5.3alpha1 or higher (see http://snaps.php.net/)

PHP extensions: zlib, PDO and PDO SQLite and the usual stuff

Some database (tested with SQLite, MySQL and Postgres)

Inspiring people toshareFluent Development with FLOW3

Getting Started

DownloadCurrently available through Subversion

Checkout the FLOW3 Distribution:svn co https://svn.typo3.org/FLOW3/distribution/trunk

or try the TYPO3 Distribution:svn co https://svn.typo3.org/TYPO3v5/distribution/trunk

Nightly builds will follow after the 1.0 alpha 1 release

Inspiring people toshareFluent Development with FLOW3

Inspiring people toshareFluent Development with FLOW3

Getting Started

Grant File PermissionsThe webserver needs

read access for all files of the distribution and

write access in the Public and Data directory

On Linux / Mac just call sudo ./fixpermissions.sh

On legacy operating systems: ask your system administrator

Inspiring people toshareFluent Development with FLOW3

Getting Started

Create a packageIn order to create a new package, just createa new folder within the Packages directory.

Inspiring people toshareFluent Development with FLOW3

Getting Started

Create a Default ControllerCreate a subfolder in your package: Classes/Controller/

Create the controller class file:

<?php

declare(ENCODING = 'utf-8');

namespace F3\MyPackage\Controller;

class DefaultController extends F3\FLOW3\MVC\Controller\ActionController {

! public function indexAction() {

! ! return 'Hello World!';

! }

}

?>

Inspiring people toshareFluent Development with FLOW3

Bootstrap

Inspiring people toshareFluent Development with FLOW3

Bootstrap

Public/index.phpThis file is the default main script

It launches FLOW3 in the Production context

The webserver's web root should point to the Public directory

define('FLOW3_PATH_PUBLIC', str_replace('\\', '/', __DIR__) . '/');require(FLOW3_PATH_PUBLIC . '../Packages/FLOW3/Classes/F3_FLOW3.php');

$framework = new F3\FLOW3();$framework->run();

Inspiring people toshareFluent Development with FLOW3

Bootstrap

Public/index_dev.phpThis script is used for development

It launches FLOW3 in the Development context

More scripts like this can be created for additional contexts

define('FLOW3_PATH_PUBLIC', str_replace('\\', '/', __DIR__) . '/');require(FLOW3_PATH_PUBLIC . '../Packages/FLOW3/Classes/F3_FLOW3.php');

$framework = new F3\FLOW3('Development');$framework->run();

Inspiring people toshareFluent Development with FLOW3

Model - View - Controller

Inspiring people toshareFluent Development with FLOW3

MVC

Key FeaturesPowerful Request-Response mechanism, based on Front Controller and Dispatcher

Very convenient controllers and views

Supports multiple template engines

Sophisticated, easy to configure routing

Built-in validation and default security

REST support

Inspiring people toshareFluent Development with FLOW3

MVC

Model TypesActive Record Domain Model

Model of / wrapper for a database table row

Model of a domain which consists of data and behaviour

is responsible for persistence doesn't know about persistence

mixes infrastructure concerns with model doesn't know about infrastructure

quick to implement without a framework clean and easy to use if framework supports it

Inspiring people toshareFluent Development with FLOW3

MVC Pattern

ModelActive Record Domain Model

Model of / wrapper for a database table row

Model of a domain which consists of data and behaviour

is responsible for persistence doesn't know about persistence

mixes infrastructure concerns with model doesn't know about infrastructure

quick to implement without a framework clean and easy to use if framework supports it

Inspiring people toshareFluent Development with FLOW3

MVC Pattern

ModelActive Record Domain Model

Model of / wrapper for a database table row

Model of a domain which consists of data and behaviour

is responsible for persistence doesn't know about persistence

mixes infrastructure concerns with model doesn't know about infrastructure

quick to implement without a framework clean and easy to use if framework supports it

Inspiring people toshareFluent Development with FLOW3

Persistence

Inspiring people toshareFluent Development with FLOW3

JSR-283 based Content RepositoryDefines a uniform API for accessing content repositories

A Content Repository

is a kind of object database for storage, search and retrieval of hierarchical data

provides methods for versioning, transactions and monitoring

TYPO3CR is the first working port of JSR-170 / JSR-283

Karsten Dambekalns is member of the JSR-283 expert group

Persistence

Inspiring people toshareFluent Development with FLOW3

Transparent PersistenceExplicit support for Domain-Driven Design

Class Schemata are defined by the Domain Model class

No need to write an XML or YAML schema definition

No need to define the database model and object model multiple times at different places

Automatic persistence in the JSR-283 based Content Repository

Legacy data sources can be mounted

Persistence

Inspiring people toshareFluent Development with FLOW3

Components

Inspiring people toshareFluent Development with FLOW3

Components

Component DependenciesComponents seldomly come alone

Components depend on other components which depend on other components which ...

Problem:

Components explicitly refer to other components:$phoneBookManager = new PhoneBookManager

Inspiring people toshareFluent Development with FLOW3

Components

Dependency InjectionA component doesn't ask for the instance of another component but gets it injected

This methodology is referred to as the "Hollywood Principle":"Don't call us, we'll call you"

Enforces loose coupling and high cohesion

Makes you a better programmer

Inspiring people toshareFluent Development with FLOW3

Components

AutowiringFLOW3 tries to autowire constructor arguments and arguments of inject* methods

The type of the component to be injected is determined by the argument type (type hinting)

Autowiring does not work with Setter Injection through regular setters (set* methods)

Dependencies are only autowired if no argument is passed explicitly

Inspiring people toshareFluent Development with FLOW3

DEMO

Inspiring people toshareFluent Development with FLOW3

Security

Inspiring people toshareFluent Development with FLOW3

Playground

Inspiring people toshareFluent Development with FLOW3

Things to play with

F3BLOGTry out the Blog Example:svn co https://svn.typo3.org/FLOW3/Distribution/branches/BlogExample/

Inspiring people toshareFluent Development with FLOW3

Things to play with

TYPO3CR AdminPlay with persistence and watch your object in the TYPO3CR Admin

Inspiring people toshareFluent Development with FLOW3

Things to play with

TestrunnerExperiment with Test-Driven Development and watch the tests inFLOW3's test runner

Inspiring people toshareFluent Development with FLOW3

Progress

Developing FLOW3 ...

Inspiring people toshareFluent Development with FLOW3

Next StepsFirst FLOW3 alpha release end of this year

First pilot projects based on FLOW3 in spring '09

Further development of the TYPO3 package

Planned release of TYPO3 5.0 alpha: end of 2009

Inspiring people toshareFluent Development with FLOW3

LinksThese Slideshttp://flow3.typo3.org/documentation/slides/

FLOW3 Websitehttp://flow3.typo3.org

TYPO3 Forgehttp://forge.typo3.org

Further Readinghttp://flow3.typo3.org/about/principles/further-reading/

Inspiring people toshareFluent Development with FLOW3

Questions

top related