Clio online flow undervisning
-
Upload
jan-erik-revsbech -
Category
Technology
-
view
317 -
download
4
description
Transcript of Clio online flow undervisning
TYPO3 FLOWHands-on undervisning af Clio online 7,8 oktober 2013
Agenda
• Underliggende teknologier
• Hands on: Start nyt flow projekt - Installation af Flow
• Generelt om OOP
• Domain driven design og MVC og alt det andet Buzz
• Flere hands-on øvelser
Underliggende teknologier
• Composer
• Doctrine
• Yaml
• Symphony
• PSR0 - Namespaces, autoloading
Composer
• http://getcomposer.org/
• PHP Dependency manager
• Inspireret af npm (nodejs) bundler (ruby) etc.
• Installerer “pakker” lokalt. Dvs. ingen deling globalt.
curl -sS https://getcomposer.org/installer | phpphp composer.phar help
composer.json{ "name": "clio/clio-base-distribution", "description" : "Clio Flow Base Distribution", "require": { "typo3/flow": "2.0.*" },}
Packagist.org
Composer install workflow
composer create-project
Hent manifest
Udregn afhængigheder
Hent manifest
Klon fra versionsstyring
Git clone }
PHP NamespacesAlle navne i denne fil, er nu inde i namespacet Clio\Beer\Controller
Den fulde “path” er altså \Clio\Beer\Controller\BeerController
Når jeg skriver Flow mener jeg i virkeligheden \TYPO3\Flow\Annotations
Når jeg skriver Debugger, mener jeg altså den her Debugger\TYPO3\Flow\Error\Debugger
Doctrine
• Flow bruger Doctrine2 som ORM (Object Relational Mapper) til persistering
• Bruger UUID som unikke record ID
• Opdateret databaseskema ud fra PHP kode
• Automatisk foreign-key i databasen for øget databasekonsistens
• Heavy brug af annoteringer! (Ligesom alt andet i Flow)
Eksempel
Eksempel
Ren Doctrine
Doctrine2 i Flow
Yaml
•Yaml Aint’t Markup Language
•Var: Yet Another Markup Language
•Generelt brugt til alt konfiguration i Flow
Spaces
Symphony
• Hvorfor bruge et andet Framework til at bygge Flow?
• Udvalgte pakker• Yaml parser (symfony/yaml)
• dom-crawler (symfony/dom-crawler)
• console (symfony/console)
• Ingen grund til at genopfinde den dybe tallerken
PSR-0 og Autoload
• Defineret af PHP Framework Interoperatability Group
• PSR0 Definerer autoload og navngivning• Et fuldt klassenavn skal have denne struktur: Vendor\Namespace\Classname
• Et namespace skal have et top-level “Vendor”-prefix samt vilkårligt antal “under”-namespaces
PSR
• PSR1: Basic coding standard• https://github.com/php-fig/fig-standards/blob/master/accepted/PSR-1-
basic-coding-standard.md
• “Best” eller “Good” practice (En fil, én klasse, UTF8, UppperCamelCase etc)
• PSR2: Codestyle standard• https://github.com/php-fig/fig-standards/blob/master/accepted/PSR-2-
coding-style-guide.md
• Relativ kontroversiel standard. (Tabs vs. spaces, blanke linier, braces etc)
Hands-on: Basis installation
Copy og paste
http://bit.ly/1bwHCat
Installation af Composer
curl -sS https://getcomposer.org/installer | php
Boostrap flow installation
php composer.phar create-project --dev --keep-vcs typo3/flow-base-distribution flow
Packagist.org package
Udviklingversioner
Oprethold reference til git
Dest. dir
Test[revsbech@je-laptop:~/websites/clio/flow ./flow helpTYPO3 Flow 2.0 ("Development" context)usage: ./flow <command identifier>
The following commands are currently available:
PACKAGE "TYPO3.FLOW":-------------------------------------------------------------------------------* flow:cache:flush Flush all caches cache:warmup Warm up caches
configuration:show Show the active configuration settings configuration:validate Validate the given configuration configuration:generateschema Generate a schema for the given configuration or YAML file.
Database
mysql>CREATE database clio;
TYPO3: Flow: persistence:
# It is good practice to not specify user name and password of the database # connection in this global Settings.yaml file. Rather specify them in the # settings of the respective context (Production / Development ...). backendOptions: host: '127.0.0.1' # adjust to your database host user: 'root' dbname: 'clio' password: ‘MyPassword’
Configuration/Settings.yaml
Opret ny database
dobbelt space!!
Ignorér (for nu)./flow doctrine:create
Opret nødvendige tabeller
Webadgang
• Opsæt apache til at pege på Web folderen
Hvis i ser dette, er alt i orden. Well done!
Generelt om OOP, DDD, MVC, TDD, AOP og alle de andre 3 bogstavs buzzwords
Udvalgt litteratur
ISBN: 0321127420 ISBN: 0321125215 ISBN: 0321268202 ISBN: 0321834577
Objekt orienteret programmering
• Indkapsling i “Klasser” og “Objekter” (instanser af en klasse)
• Nedarvning
• Interfaces
class Lager extends Beer implements Drinkable, AlcoholicBeverage {
}
Lager “is a” Beer
Definerer metoder som Lager skal implementere
Public, private, protected, abstract final?
• Metoder og variable kan deklareres efter om man ønsker at andre end en selv (private, protected) eller alle andre (public) kan kalde metoden.
• Det gør det markant nemmere når man skal fejlsøge at man ved om andre end en selv kalder metoden
• Det er god skik at holde variable protected og lavet set- og getter
• Abstrakte metoder, er metoder som kun har en definition, og ikke nogen implementering. Metoden skal implementeres i en klasse som arver. Klassen skal være deklareret abstrakt hvis den har mindst én abstrakt metode
Domain Driven Design
• Eric Evans
• Byggesten• Model: Entitiet og Value objekter
• Aggregater: Samlinger af objekter/modeller. Har ét indgangspunkt (aggregate root)
• Repository: Persistering af objekter
• Services
• Bounded contexts
MVC
• Måske det mest brugte pattern inden for webudvikling
• Opdeling af kode i tre byggesten• Model (Domænemodeller og Repositories)
• Views (Præsentation og præsentationslogik)
• Controller (Binder modellerne sammen med views)
TDD (Test driven development)
• Definer først dit outcome
• Skriv unit/funktionelle teste
• Programmér indtil dine tests fungerer
• Refaktorér
Dependency injection
• Også kendt som “The hollywood principle”: Dont call us, we call you.
• Øger “Separation of concerns”
• Gør test lettere $this->reflectionService vil nu være tilgængelig
AOP: Aspect oriented programming
• Bruges til såkaldte “Cross cutting concerns”
• Klassiske eksempler er• Logging
• Sikkerhed
• Giver en måde at “væve” noget kode ind i alle eller udvalgte funktioner.
• Advice, Pointcut, Aspect
FilstrukturForskellige kontekster
Webroot
Dine pakker
Kommandolinien
./flow help
./flow help
./flow flow:cache:flush (--force)
./flow cache:warmup
./flow doctrine:update
./flow kickstart:*
Generel hjælp
Nyttige kommander
Kontekst
• Forskellige kontekster• Development
• Production
• TestingFLOW_CONTEXT=Production ./flow help
<VirtualHost *:80> ServerAdmin [email protected] ServerName old.new.moc.net DocumentRoot /MYSITEDIR/flow/Web SetEnv FLOW_CONTEXT Production
Kommandolinie
Web
Pakker
• ./flow package:list
• Ensartet filstruktur
• Installeres med composer
• Kan kickstartes med ./flow kicstart:package
Action controllere
Fluid templates (View)Layoutet fortæller hvor de enkelte sektioner skal stå
Data fra controlleren
ViewhelpersEgne viewhelpers
Indbyggede viewhelpersnamespace f er fluid
Modeller
Kalder getter (hvis det er et objekt)
Repositories
• Abstrakt adgang til data
• Implementerer std. metoder som• findAll
• findByMyVarName
• add
• remove
• Muligheder for avanceret querying
Query i repository
$query = $beerRepository->createQuery();$items = $query->matching( $query->greater(‘alcoholByVolume’, 5.0))->limit(10)->execute();
$query = $beerRepository->createQuery();$items = $query->matching( $query->logicalOr(array( $query->greaterThan(‘alcoholByVolume’, 8.0), $query->LessThan(‘alcoholByVolume’, 2.0) )))->setOrderings(array(‘name’))->limit(10)->execute();
Eksempel 1
Eksempel 2
Lets see some action!!!
Færdig pakke
• Kan hentes herfra: • https://github.com/revsbech/Clio.Beer
Første opgave
• Opret ny pakke indeholdende simpel Controller som outputter Hello world
• Opret ekstra action og link mellem dem
• Implementer en lidt mere “lækker” skabelon (Vælg en eller anden standard)
• Bonus opgave: Opret korrekt routes, så den nye pakke er default: http://docs.typo3.org/flow/TYPO3FlowDocumentation/stable/
./flow kickstart:package Clio.Beer
Opret ny “Pakke”
Rediger controller og view
Hent std skabelon og rediger layout
Resources/Templates/Private/Templates/Standard/Index.htmlClasses/Clio/Beer/Controller/StandardController
Resources/Templates/Private/Layout/Default.html
Anden opgave
• Kickstart ny model: Beer samt tilhørende BeerRepository (we like!)
• Tilføj ny BeerController
• Lav liste over alle øl
• Opret ny øl formular
• Bonus opgave1 : Lav lidt pænere validering af formularerhttp://docs.typo3.org/flow/TYPO3FlowDocumentation/stable/TheDefinitiveGuide/PartII/Validation.html
• Bonus opgave 2: Implementer rediger formular
Tredje opgave
• Opret Brewery domænemodel.
• Tilknyt en mange-til-en relation mellem øl og bryggeri
• Opret en CommandController til at oprette bryggerier
• Udvide redigeringsformular så man kan vælge bryggeri ved oprettelse
• Bonus: Lav mulighed for at se alle øl til et bryggeri
Fjerde opgave
• Opret loginformular
• Implementer autentifikation samt mulighed for at kunne redigere/oprette øl hvis man er logget ind
• http://docs.typo3.org/flow/TYPO3FlowDocumentation/stable/TheDefinitiveGuide/PartIII/Security.html
Links
• http://martinfowler.com/bliki
• http://docs.typo3.org/flow/TYPO3FlowDocumentation/TheDefinitiveGuide/Index.html
• http://en.wikipedia.org/wiki/Domain-driven_design
• http://en.wikipedia.org/wiki/Aspect-oriented_programming
• https://github.com/revsbech/Clio.Beer