SlideShare a Scribd company logo
1 of 32
Download to read offline
Robert Lemke
Create Clean Code with Aspect-Oriented Programming
International PHP Conference, Spring Edition 2010




   Photo: Wolfgang Staudt
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
= Full Stack Application Framework
DI   Dependency Injection              DRY
                                                     LLATIP
                             OOP   Object-Oriented Programming
YAGNI
               AOP Aspect-Oriented Programming
 CoC
                             MVC   Model View Controller


      POPO Plain Old PHP Object                      TDD
/**
	 * 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                                   IPC SE 2010, Berlin
/**
	 * 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->authorizationService->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);
		    $this->flashMessageContainer->add('Access denied.');
    }
		    $this->redirect('index');
	}



       Create Clean Code with AOP                                    IPC SE 2010, Berlin
AOP
Create Clean Code with AOP   IPC SE 2010, Berlin
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                                   IPC SE 2010, Berlin
/**
	 * 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                                   IPC SE 2010, Berlin
Concerns?
Create Clean Code with AOP   IPC SE 2010, Berlin
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                                             IPC SE 2010, Berlin
Cross-Cutting Concerns
       Logging

       Security

       Persistence

       Global Business Logic

       Dirty Hacks




Create Clean Code with AOP     IPC SE 2010, Berlin
We don't want infrastructure code
in our models.




Create Clean Code with AOP          IPC SE 2010, Berlin
We want to unit-test even
cross-cutting concerns




Create Clean Code with AOP   IPC SE 2010, Berlin
We want to centralize
security-related code




Create Clean Code with AOP   IPC SE 2010, Berlin
AOP Lingo


Create Clean Code with AOP   IPC SE 2010, Berlin
Aspect
       Part of the application where cross-cutting concerns are implemented

       In FLOW3 aspects are classes annotated with @aspect




Create Clean Code with AOP                                           IPC SE 2010, Berlin
Join Point
       Is a single point in the call graph

          Method Execution

          Exception

       Represents an event, not a location




Create Clean Code with AOP                   IPC SE 2010, Berlin
Pointcut
       A set of join points where advices could be executed

          can be composed

          can be named




Create Clean Code with AOP                                    IPC SE 2010, Berlin
Advice
       Action to take at a join points defined by the point cut




Create Clean Code with AOP                                       IPC SE 2010, Berlin
DEMO
                              Inspiring people to
Hitchhiker's Guide to FLOW3   share
Kinds of Advice
Advice types supported by FLOW3:

@before
@afterreturning
@afterthrowing
@after
@around




                                   Inspiring people to
Hitchhiker's Guide to FLOW3        share
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
Runtime Evaluations
evaluate(coffee.kind == "Arabica")




                                     Inspiring people to
Hitchhiker's Guide to FLOW3          share
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
DEMO
                              Inspiring people to
Hitchhiker's Guide to FLOW3   share
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
Inspiring people to
Hitchhiker's Guide to FLOW3   share
Progress

                   FLOW3 1.0.0




Create Clean Code with AOP       IPC SE 2010, Berlin
Further Reading
       FLOW3 Website
       http://flow3.typo3.org

       TYPO3 Forge
       http://forge.typo3.org

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

       http://bit.ly/GoodAOPArticle




Create Clean Code with AOP                                      IPC SE 2010, Berlin
Questions

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

Feedback:          http://joind.in/1743




Create Clean Code with AOP                      IPC SE 2010, Berlin
Create Clean Code with AOP

More Related Content

More from Robert 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
 
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
 

More from Robert Lemke (20)

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
 
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
 

Create Clean Code with AOP

  • 1. Robert Lemke Create Clean Code with Aspect-Oriented Programming International PHP Conference, Spring Edition 2010 Photo: Wolfgang Staudt
  • 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
  • 3. = Full Stack Application Framework
  • 4. DI Dependency Injection DRY LLATIP OOP Object-Oriented Programming YAGNI AOP Aspect-Oriented Programming CoC MVC Model View Controller POPO Plain Old PHP Object TDD
  • 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 IPC SE 2010, Berlin
  • 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->authorizationService->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); $this->flashMessageContainer->add('Access denied.'); } $this->redirect('index'); } Create Clean Code with AOP IPC SE 2010, Berlin
  • 7. AOP Create Clean Code with AOP IPC SE 2010, Berlin
  • 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 IPC SE 2010, Berlin
  • 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 IPC SE 2010, Berlin
  • 10. Concerns? Create Clean Code with AOP IPC SE 2010, Berlin
  • 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 IPC SE 2010, Berlin
  • 12. Cross-Cutting Concerns Logging Security Persistence Global Business Logic Dirty Hacks Create Clean Code with AOP IPC SE 2010, Berlin
  • 13. We don't want infrastructure code in our models. Create Clean Code with AOP IPC SE 2010, Berlin
  • 14. We want to unit-test even cross-cutting concerns Create Clean Code with AOP IPC SE 2010, Berlin
  • 15. We want to centralize security-related code Create Clean Code with AOP IPC SE 2010, Berlin
  • 16. AOP Lingo Create Clean Code with AOP IPC SE 2010, Berlin
  • 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 IPC SE 2010, Berlin
  • 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 IPC SE 2010, Berlin
  • 19. Pointcut A set of join points where advices could be executed can be composed can be named Create Clean Code with AOP IPC SE 2010, Berlin
  • 20. Advice Action to take at a join points defined by the point cut Create Clean Code with AOP IPC SE 2010, Berlin
  • 21. DEMO Inspiring people to Hitchhiker's Guide to FLOW3 share
  • 22. Kinds of Advice Advice types supported by FLOW3: @before @afterreturning @afterthrowing @after @around Inspiring people to Hitchhiker's Guide to FLOW3 share
  • 24. Runtime Evaluations evaluate(coffee.kind == "Arabica") Inspiring people to Hitchhiker's Guide to FLOW3 share
  • 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
  • 26. DEMO Inspiring people to Hitchhiker's Guide to FLOW3 share
  • 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
  • 28. Inspiring people to Hitchhiker's Guide to FLOW3 share
  • 29. Progress FLOW3 1.0.0 Create Clean Code with AOP IPC SE 2010, Berlin
  • 30. Further Reading FLOW3 Website http://flow3.typo3.org TYPO3 Forge http://forge.typo3.org Further Reading http://flow3.typo3.org/about/principles/further-reading http://bit.ly/GoodAOPArticle Create Clean Code with AOP IPC SE 2010, Berlin
  • 31. Questions Email: robert@typo3.org Blog: http://robertlemke.de/blog Twitter: @t3rob Feedback: http://joind.in/1743 Create Clean Code with AOP IPC SE 2010, Berlin