SlideShare una empresa de Scribd logo
1 de 33
Descargar para leer sin conexión
Robert Lemke
          Create Clean Code with Aspect-Oriented Programming
          T3CON10 Frankfurt



                              /**             Asp ect
                               *S  ecu   rity
                                *@   asp  ect
                                  */             ityA spe ct {
                                  cla s s Se cur        olic ies;
                                            tec ted $p
Samstag, 2. Oktober 2010
                                        pro
Robert Lemke
                chief architect of TYPO3 Phoenix and FLOW3

                co-founder of the TYPO3 Association

                34 years old

                lives in Lübeck, Germany

                1 wife, 1 daughter, 1 espresso machine

                likes drumming




Samstag, 2. Oktober 2010
= PHP 5.3 Full Stack Application Framework




Samstag, 2. Oktober 2010
DI        Dependency Injection              DRY
                                                                    YAA
                                          OOP   Object-Oriented Programming
     YAGNI
                            AOP Aspect-Oriented Programming
             CoC
                                          MVC   Model View Controller


                   POPO Plain Old PHP Object                      TDD

Samstag, 2. Oktober 2010
/**
         * Creates a new post
         *
         * @param F3BlogDomainModelPost $newPost A fresh Post object which has not yet been
         *                                                               added to the repository
         * @return void
         */
       public function createAction(F3BlogDomainModelPost $newPost) {
            if ($this->policyService->isGranted($this->currentUser, __CLASS__, __METHOD__) {
                $this->blog->addPost($newPost);
                $this->flashMessageContainer->add('Your new post was created.');
                $this->systemLogger->log('A new post was created.', LOG_INFO);
                $this->notificationService->notify('A new post was created.', 'robert@typo3.org');
            } else {
                $this->systemLogger->log('Someone tried to create a post.', LOG_WARNING);
                throw new F3FLOW3SecurityExceptionAccessDeniedException('Tried to create.');
            }
            $this->redirect('index');
       }


               Create Clean Code with AOP                                         T3CON10 Frankfurt
Samstag, 2. Oktober 2010
/**
         * Creates a new post
         *
         * @param F3BlogDomainModelPost $newPost A fresh Post object which has not yet been
         *                                                               added to the repository
         * @return void
         */
       public function createAction(F3BlogDomainModelPost $newPost) {
            if ($this->policyService->isGranted($this->currentUser, __CLASS__, __METHOD__) {
                $this->blog->addPost($newPost);
                $this->flashMessageContainer->add('Your new post was created.');
                $this->systemLogger->log('A new post was created.', LOG_INFO);
                $this->notificationService->notify('A new post was created.', 'robert@typo3.org');
            } else {
                $this->systemLogger->log('Someone tried to create a post.', LOG_WARNING);
                throw new F3FLOW3SecurityExceptionAccessDeniedException('Tried to create.');
            }
            $this->redirect('index');
       }


               Create Clean Code with AOP                                         T3CON10 Frankfurt
Samstag, 2. Oktober 2010
AOP
               Create Clean Code with AOP   T3CON10 Frankfurt
Samstag, 2. Oktober 2010
Aspect-Oriented Programming
                           programming paradigm

                           separates concerns to improve modularization


                           OOP modularizes concerns into objects

                           AOP modularizes cross-cutting concerns into aspects




               Create Clean Code with AOP                                        T3CON10 Frankfurt
Samstag, 2. Oktober 2010
/**
         * Creates a new post
         *
         * @param F3BlogDomainModelPost $newPost A fresh Post object which has not yet been
         *                                            added to the repository
         * @return void
         */
       public function createAction(F3BlogDomainModelPost $newPost) {
            $this->blog->addPost($newPost);
            $this->flashMessageContainer->add('Your new post was created.');
            $this->redirect('index');
       }




               Create Clean Code with AOP                                    T3CON10 Frankfurt
Samstag, 2. Oktober 2010
Concerns?
               Create Clean Code with AOP   T3CON10 Frankfurt
Samstag, 2. Oktober 2010
Concerns
                           Separation of Concerns

                             group features and behavior into manageable parts

                             have a specific purpose and business to take care of

                           Cross-Cutting Concerns

                             are the party poopers who want to have a say in everything




               Create Clean Code with AOP                                                 T3CON10 Frankfurt
Samstag, 2. Oktober 2010
Cross-Cutting Concerns
                           Logging

                           Security

                           Persistence

                           Global Business Logic

                           Dirty Hacks




               Create Clean Code with AOP          T3CON10 Frankfurt
Samstag, 2. Oktober 2010
We don't want infrastructure code
                in our models.




               Create Clean Code with AOP           T3CON10 Frankfurt
Samstag, 2. Oktober 2010
We want to unit-test even
                cross-cutting concerns




               Create Clean Code with AOP   T3CON10 Frankfurt
Samstag, 2. Oktober 2010
We want to centralize
                security-related code




               Create Clean Code with AOP   T3CON10 Frankfurt
Samstag, 2. Oktober 2010
AOP Lingo


               Create Clean Code with AOP   T3CON10 Frankfurt
Samstag, 2. Oktober 2010
Aspect
                           Part of the application where cross-cutting concerns are implemented

                           In FLOW3 aspects are classes annotated with @aspect




               Create Clean Code with AOP                                                T3CON10 Frankfurt
Samstag, 2. Oktober 2010
Join Point
                           Is a single point in the call graph

                             Method Execution

                             Exception

                           Represents an event, not a location




               Create Clean Code with AOP                        T3CON10 Frankfurt
Samstag, 2. Oktober 2010
Pointcut
                           A set of join points where advices could be executed

                             can be composed

                             can be named




               Create Clean Code with AOP                                         T3CON10 Frankfurt
Samstag, 2. Oktober 2010
Advice
                           Action to take at a join points defined by the point cut




               Create Clean Code with AOP                                            T3CON10 Frankfurt
Samstag, 2. Oktober 2010
DEMO
                                              Inspiring people to
                Hitchhiker's Guide to FLOW3   share
Samstag, 2. Oktober 2010
Kinds of Advice
                Advice types supported by FLOW3:

                @before
                @afterreturning
                @afterthrowing
                @after
                @around




                                                   Inspiring people to
                Hitchhiker's Guide to FLOW3        share
Samstag, 2. Oktober 2010
Pointcut Designators
                method(F3MyPackageMyClass->myMethod())
                class(F3MyPackageMyClass)
                within(F3MyPackageMyInterface)
                classTaggedWith(someTag)
                methodTaggedWith(anotherTag)
                setting(Demo.Stuff.SomeSetting = "yeah, do it")
                filter(F3MyPackageMyCustomFilterImplementation)
                   fi




                                                          Inspiring people to
                Hitchhiker's Guide to FLOW3               share
Samstag, 2. Oktober 2010
Runtime Evaluations
                evaluate(coffee.kind == "Arabica")




                                                     Inspiring people to
                Hitchhiker's Guide to FLOW3          share
Samstag, 2. Oktober 2010
Compound Pointcuts
!    /**
!     * @around method(.*Controller->(new|create|edit|update|delete)Action()) && 
            !methodTaggedWith(anybodyMayAccessThis)
!     */
!    public function interceptMethodCalls($joinPoint) {
        ...
     }




                                                            Inspiring people to
                Hitchhiker's Guide to FLOW3                 share
Samstag, 2. Oktober 2010
DEMO
                                              Inspiring people to
                Hitchhiker's Guide to FLOW3   share
Samstag, 2. Oktober 2010
FLOW3's AOP implementation
                           based on proxy classes

                             unlike with most pre-processors line numbers stay the same

                           no scaffolding

                             0 Lines of generated code which need to be maintained by you

                           fast (on the second hit)




                                                                                      Inspiring people to
                Hitchhiker's Guide to FLOW3                                           share
Samstag, 2. Oktober 2010
Inspiring people to
                Hitchhiker's Guide to FLOW3   share
Samstag, 2. Oktober 2010
Inspiring people to
                Hitchhiker's Guide to FLOW3   share
Samstag, 2. Oktober 2010
Progress

                                  FLOW3 1.0.0




               Create Clean Code with AOP       T3CON10 Frankfurt
Samstag, 2. Oktober 2010
Further Reading
                           FLOW3 Website
                           http://flow3.typo3.org

                           FLOW3 Download
                           http://flow3.typo3.org/download
                           git://git.typo3.org/FLOW3/Distributions/Base.git

                           TYPO3 Forge
                           http://forge.typo3.org

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



               Create Clean Code with AOP                                           T3CON10 Frankfurt
Samstag, 2. Oktober 2010
Questions

                Email:            robert@typo3.org
                Blog:             http://robertlemke.de/blog
                Twitter:          @t3rob

                Slides:           http://slideshare.net/rlmp




               Create Clean Code with AOP                      T3CON10 Frankfurt
Samstag, 2. Oktober 2010
Samstag, 2. Oktober 2010

Más contenido relacionado

Similar a Create Clean Code with AOP T3CON10 Frankfurt

Creating Clean Code with AOP
Creating Clean Code with AOPCreating Clean Code with AOP
Creating Clean Code with AOPRobert Lemke
 
Creating Clean Code with AOP (WebExpo 2010)
Creating Clean Code with AOP (WebExpo 2010)Creating Clean Code with AOP (WebExpo 2010)
Creating Clean Code with AOP (WebExpo 2010)Robert Lemke
 
Socket programming-in-python
Socket programming-in-pythonSocket programming-in-python
Socket programming-in-pythonYuvaraja Ravi
 
Python Evolution
Python EvolutionPython Evolution
Python EvolutionQuintagroup
 
Where's the source, Luke? : How to find and debug the code behind Plone
Where's the source, Luke? : How to find and debug the code behind PloneWhere's the source, Luke? : How to find and debug the code behind Plone
Where's the source, Luke? : How to find and debug the code behind PloneVincenzo Barone
 
Socket Programming In Python
Socket Programming In PythonSocket Programming In Python
Socket Programming In Pythondidip
 
Model-Driven Software Development - Introduction & Overview
Model-Driven Software Development - Introduction & OverviewModel-Driven Software Development - Introduction & Overview
Model-Driven Software Development - Introduction & OverviewEelco Visser
 
Moving to Python 3
Moving to Python 3Moving to Python 3
Moving to Python 3Nick Efford
 
Will iPython replace Bash?
Will iPython replace Bash?Will iPython replace Bash?
Will iPython replace Bash?Babel
 
Will iPython replace bash?
Will iPython replace bash?Will iPython replace bash?
Will iPython replace bash?Roberto Polli
 
IPC2010SE Doctrine2 Enterprise Persistence Layer for PHP
IPC2010SE Doctrine2 Enterprise Persistence Layer for PHPIPC2010SE Doctrine2 Enterprise Persistence Layer for PHP
IPC2010SE Doctrine2 Enterprise Persistence Layer for PHPGuilherme Blanco
 
Eclipse 3.7 : Tips and tricks
Eclipse 3.7 : Tips and tricksEclipse 3.7 : Tips and tricks
Eclipse 3.7 : Tips and tricksTomasz Zarna
 
Open frameworks 101_fitc
Open frameworks 101_fitcOpen frameworks 101_fitc
Open frameworks 101_fitcbenDesigning
 
Hacking the Kinect with GAFFTA Day 1
Hacking the Kinect with GAFFTA Day 1Hacking the Kinect with GAFFTA Day 1
Hacking the Kinect with GAFFTA Day 1benDesigning
 
Ios fundamentals with ObjectiveC
Ios fundamentals with ObjectiveCIos fundamentals with ObjectiveC
Ios fundamentals with ObjectiveCMadusha Perera
 

Similar a Create Clean Code with AOP T3CON10 Frankfurt (20)

Creating Clean Code with AOP
Creating Clean Code with AOPCreating Clean Code with AOP
Creating Clean Code with AOP
 
Creating Clean Code with AOP (WebExpo 2010)
Creating Clean Code with AOP (WebExpo 2010)Creating Clean Code with AOP (WebExpo 2010)
Creating Clean Code with AOP (WebExpo 2010)
 
TypoScript 2.0
TypoScript 2.0TypoScript 2.0
TypoScript 2.0
 
Socket programming-in-python
Socket programming-in-pythonSocket programming-in-python
Socket programming-in-python
 
Python Evolution
Python EvolutionPython Evolution
Python Evolution
 
COinS (eng version)
COinS (eng version)COinS (eng version)
COinS (eng version)
 
Reversing Google Protobuf protocol
Reversing Google Protobuf protocolReversing Google Protobuf protocol
Reversing Google Protobuf protocol
 
Where's the source, Luke? : How to find and debug the code behind Plone
Where's the source, Luke? : How to find and debug the code behind PloneWhere's the source, Luke? : How to find and debug the code behind Plone
Where's the source, Luke? : How to find and debug the code behind Plone
 
Socket Programming In Python
Socket Programming In PythonSocket Programming In Python
Socket Programming In Python
 
Model-Driven Software Development - Introduction & Overview
Model-Driven Software Development - Introduction & OverviewModel-Driven Software Development - Introduction & Overview
Model-Driven Software Development - Introduction & Overview
 
Moving to Python 3
Moving to Python 3Moving to Python 3
Moving to Python 3
 
Will iPython replace Bash?
Will iPython replace Bash?Will iPython replace Bash?
Will iPython replace Bash?
 
Will iPython replace bash?
Will iPython replace bash?Will iPython replace bash?
Will iPython replace bash?
 
IPC2010SE Doctrine2 Enterprise Persistence Layer for PHP
IPC2010SE Doctrine2 Enterprise Persistence Layer for PHPIPC2010SE Doctrine2 Enterprise Persistence Layer for PHP
IPC2010SE Doctrine2 Enterprise Persistence Layer for PHP
 
Eclipse 3.7 : Tips and tricks
Eclipse 3.7 : Tips and tricksEclipse 3.7 : Tips and tricks
Eclipse 3.7 : Tips and tricks
 
Open frameworks 101_fitc
Open frameworks 101_fitcOpen frameworks 101_fitc
Open frameworks 101_fitc
 
Hacking the Kinect with GAFFTA Day 1
Hacking the Kinect with GAFFTA Day 1Hacking the Kinect with GAFFTA Day 1
Hacking the Kinect with GAFFTA Day 1
 
Ios fundamentals with ObjectiveC
Ios fundamentals with ObjectiveCIos fundamentals with ObjectiveC
Ios fundamentals with ObjectiveC
 
PHYTON-REPORT.pdf
PHYTON-REPORT.pdfPHYTON-REPORT.pdf
PHYTON-REPORT.pdf
 
PYTHON PROGRAMMING NOTES RKREDDY.pdf
PYTHON PROGRAMMING NOTES RKREDDY.pdfPYTHON PROGRAMMING NOTES RKREDDY.pdf
PYTHON PROGRAMMING NOTES RKREDDY.pdf
 

Más de 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
 
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
 
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
 
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
 
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
 

Más de 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
 
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)
 
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!
 
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
 
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
 

Create Clean Code with AOP T3CON10 Frankfurt

  • 1. Robert Lemke Create Clean Code with Aspect-Oriented Programming T3CON10 Frankfurt /** Asp ect *S ecu rity *@ asp ect */ ityA spe ct { cla s s Se cur olic ies; tec ted $p Samstag, 2. Oktober 2010 pro
  • 2. Robert Lemke chief architect of TYPO3 Phoenix and FLOW3 co-founder of the TYPO3 Association 34 years old lives in Lübeck, Germany 1 wife, 1 daughter, 1 espresso machine likes drumming Samstag, 2. Oktober 2010
  • 3. = PHP 5.3 Full Stack Application Framework Samstag, 2. Oktober 2010
  • 4. DI Dependency Injection DRY YAA OOP Object-Oriented Programming YAGNI AOP Aspect-Oriented Programming CoC MVC Model View Controller POPO Plain Old PHP Object TDD Samstag, 2. Oktober 2010
  • 5. /** * Creates a new post * * @param F3BlogDomainModelPost $newPost A fresh Post object which has not yet been * added to the repository * @return void */ public function createAction(F3BlogDomainModelPost $newPost) { if ($this->policyService->isGranted($this->currentUser, __CLASS__, __METHOD__) { $this->blog->addPost($newPost); $this->flashMessageContainer->add('Your new post was created.'); $this->systemLogger->log('A new post was created.', LOG_INFO); $this->notificationService->notify('A new post was created.', 'robert@typo3.org'); } else { $this->systemLogger->log('Someone tried to create a post.', LOG_WARNING); throw new F3FLOW3SecurityExceptionAccessDeniedException('Tried to create.'); } $this->redirect('index'); } Create Clean Code with AOP T3CON10 Frankfurt Samstag, 2. Oktober 2010
  • 6. /** * Creates a new post * * @param F3BlogDomainModelPost $newPost A fresh Post object which has not yet been * added to the repository * @return void */ public function createAction(F3BlogDomainModelPost $newPost) { if ($this->policyService->isGranted($this->currentUser, __CLASS__, __METHOD__) { $this->blog->addPost($newPost); $this->flashMessageContainer->add('Your new post was created.'); $this->systemLogger->log('A new post was created.', LOG_INFO); $this->notificationService->notify('A new post was created.', 'robert@typo3.org'); } else { $this->systemLogger->log('Someone tried to create a post.', LOG_WARNING); throw new F3FLOW3SecurityExceptionAccessDeniedException('Tried to create.'); } $this->redirect('index'); } Create Clean Code with AOP T3CON10 Frankfurt Samstag, 2. Oktober 2010
  • 7. AOP Create Clean Code with AOP T3CON10 Frankfurt Samstag, 2. Oktober 2010
  • 8. Aspect-Oriented Programming programming paradigm separates concerns to improve modularization OOP modularizes concerns into objects AOP modularizes cross-cutting concerns into aspects Create Clean Code with AOP T3CON10 Frankfurt Samstag, 2. Oktober 2010
  • 9. /** * Creates a new post * * @param F3BlogDomainModelPost $newPost A fresh Post object which has not yet been * added to the repository * @return void */ public function createAction(F3BlogDomainModelPost $newPost) { $this->blog->addPost($newPost); $this->flashMessageContainer->add('Your new post was created.'); $this->redirect('index'); } Create Clean Code with AOP T3CON10 Frankfurt Samstag, 2. Oktober 2010
  • 10. Concerns? Create Clean Code with AOP T3CON10 Frankfurt Samstag, 2. Oktober 2010
  • 11. Concerns Separation of Concerns group features and behavior into manageable parts have a specific purpose and business to take care of Cross-Cutting Concerns are the party poopers who want to have a say in everything Create Clean Code with AOP T3CON10 Frankfurt Samstag, 2. Oktober 2010
  • 12. Cross-Cutting Concerns Logging Security Persistence Global Business Logic Dirty Hacks Create Clean Code with AOP T3CON10 Frankfurt Samstag, 2. Oktober 2010
  • 13. We don't want infrastructure code in our models. Create Clean Code with AOP T3CON10 Frankfurt Samstag, 2. Oktober 2010
  • 14. We want to unit-test even cross-cutting concerns Create Clean Code with AOP T3CON10 Frankfurt Samstag, 2. Oktober 2010
  • 15. We want to centralize security-related code Create Clean Code with AOP T3CON10 Frankfurt Samstag, 2. Oktober 2010
  • 16. AOP Lingo Create Clean Code with AOP T3CON10 Frankfurt Samstag, 2. Oktober 2010
  • 17. Aspect Part of the application where cross-cutting concerns are implemented In FLOW3 aspects are classes annotated with @aspect Create Clean Code with AOP T3CON10 Frankfurt Samstag, 2. Oktober 2010
  • 18. Join Point Is a single point in the call graph Method Execution Exception Represents an event, not a location Create Clean Code with AOP T3CON10 Frankfurt Samstag, 2. Oktober 2010
  • 19. Pointcut A set of join points where advices could be executed can be composed can be named Create Clean Code with AOP T3CON10 Frankfurt Samstag, 2. Oktober 2010
  • 20. Advice Action to take at a join points defined by the point cut Create Clean Code with AOP T3CON10 Frankfurt Samstag, 2. Oktober 2010
  • 21. DEMO Inspiring people to Hitchhiker's Guide to FLOW3 share Samstag, 2. Oktober 2010
  • 22. Kinds of Advice Advice types supported by FLOW3: @before @afterreturning @afterthrowing @after @around Inspiring people to Hitchhiker's Guide to FLOW3 share Samstag, 2. Oktober 2010
  • 23. Pointcut Designators method(F3MyPackageMyClass->myMethod()) class(F3MyPackageMyClass) within(F3MyPackageMyInterface) classTaggedWith(someTag) methodTaggedWith(anotherTag) setting(Demo.Stuff.SomeSetting = "yeah, do it") filter(F3MyPackageMyCustomFilterImplementation) fi Inspiring people to Hitchhiker's Guide to FLOW3 share Samstag, 2. Oktober 2010
  • 24. Runtime Evaluations evaluate(coffee.kind == "Arabica") Inspiring people to Hitchhiker's Guide to FLOW3 share Samstag, 2. Oktober 2010
  • 25. Compound Pointcuts ! /** !  * @around method(.*Controller->(new|create|edit|update|delete)Action()) &&  !methodTaggedWith(anybodyMayAccessThis) !  */ ! public function interceptMethodCalls($joinPoint) { ... } Inspiring people to Hitchhiker's Guide to FLOW3 share Samstag, 2. Oktober 2010
  • 26. DEMO Inspiring people to Hitchhiker's Guide to FLOW3 share Samstag, 2. Oktober 2010
  • 27. FLOW3's AOP implementation based on proxy classes unlike with most pre-processors line numbers stay the same no scaffolding 0 Lines of generated code which need to be maintained by you fast (on the second hit) Inspiring people to Hitchhiker's Guide to FLOW3 share Samstag, 2. Oktober 2010
  • 28. Inspiring people to Hitchhiker's Guide to FLOW3 share Samstag, 2. Oktober 2010
  • 29. Inspiring people to Hitchhiker's Guide to FLOW3 share Samstag, 2. Oktober 2010
  • 30. Progress FLOW3 1.0.0 Create Clean Code with AOP T3CON10 Frankfurt Samstag, 2. Oktober 2010
  • 31. Further Reading FLOW3 Website http://flow3.typo3.org FLOW3 Download http://flow3.typo3.org/download git://git.typo3.org/FLOW3/Distributions/Base.git TYPO3 Forge http://forge.typo3.org Further Reading http://flow3.typo3.org/about/principles/further-reading Create Clean Code with AOP T3CON10 Frankfurt Samstag, 2. Oktober 2010
  • 32. Questions Email: robert@typo3.org Blog: http://robertlemke.de/blog Twitter: @t3rob Slides: http://slideshare.net/rlmp Create Clean Code with AOP T3CON10 Frankfurt Samstag, 2. Oktober 2010