Robert Lemke
          Create Clean Code with Aspect-Oriented Programming
           International PHP Conference, Mainz 2010



                             /**             Asp ect
                              *S  ecu   rity
                               *@   asp  ect
                                 */             ityA spe ct {
                                 cla s s Se cur        olic ies;
                                           tec ted $p
Mittwoch, 13. 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




Mittwoch, 13. Oktober 2010
= PHP 5.3 Full Stack Application Framework




Mittwoch, 13. 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

Mittwoch, 13. 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                      International PHP Conference, Mainz 2010
Mittwoch, 13. 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                      International PHP Conference, Mainz 2010
Mittwoch, 13. Oktober 2010
AOP
                Create Clean Code with AOP   International PHP Conference, Mainz 2010
Mittwoch, 13. 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                           International PHP Conference, Mainz 2010
Mittwoch, 13. 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                   International PHP Conference, Mainz 2010
Mittwoch, 13. Oktober 2010
Concerns?
                Create Clean Code with AOP   International PHP Conference, Mainz 2010
Mittwoch, 13. 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                                International PHP Conference, Mainz 2010
Mittwoch, 13. Oktober 2010
Cross-Cutting Concerns
                             Logging

                             Security

                             Persistence

                             Global Business Logic

                             Dirty Hacks




                Create Clean Code with AOP           International PHP Conference, Mainz 2010
Mittwoch, 13. Oktober 2010
We don't want infrastructure code
                 in our models.




                Create Clean Code with AOP   International PHP Conference, Mainz 2010
Mittwoch, 13. Oktober 2010
We want to unit-test even
                 cross-cutting concerns




                Create Clean Code with AOP   International PHP Conference, Mainz 2010
Mittwoch, 13. Oktober 2010
We want to centralize
                 security-related code




                Create Clean Code with AOP   International PHP Conference, Mainz 2010
Mittwoch, 13. Oktober 2010
AOP Lingo


                Create Clean Code with AOP   International PHP Conference, Mainz 2010
Mittwoch, 13. 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                                International PHP Conference, Mainz 2010
Mittwoch, 13. 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                         International PHP Conference, Mainz 2010
Mittwoch, 13. Oktober 2010
Pointcut
                             A set of join points where advices could be executed

                               can be composed

                               can be named




                Create Clean Code with AOP                                 International PHP Conference, Mainz 2010
Mittwoch, 13. Oktober 2010
Advice
                             Action to take at a join points defined by the point cut




                Create Clean Code with AOP                                  International PHP Conference, Mainz 2010
Mittwoch, 13. Oktober 2010
DEMO
                                              Inspiring people to
                Hitchhiker's Guide to FLOW3   share
Mittwoch, 13. Oktober 2010
Kinds of Advice
                 Advice types supported by FLOW3:

                 @before
                 @afterreturning
                 @afterthrowing
                 @after
                 @around




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




                                                      Inspiring people to
                Hitchhiker's Guide to FLOW3           share
Mittwoch, 13. 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
Mittwoch, 13. Oktober 2010
DEMO
                                              Inspiring people to
                Hitchhiker's Guide to FLOW3   share
Mittwoch, 13. 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
Mittwoch, 13. Oktober 2010
Inspiring people to
                Hitchhiker's Guide to FLOW3   share
Mittwoch, 13. Oktober 2010
Inspiring people to
                Hitchhiker's Guide to FLOW3   share
Mittwoch, 13. Oktober 2010
Progress

                                   FLOW3 1.0.0




                Create Clean Code with AOP       International PHP Conference, Mainz 2010
Mittwoch, 13. 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                                  International PHP Conference, Mainz 2010
Mittwoch, 13. Oktober 2010
Questions

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

                 Slides:           http://slideshare.net/rlmp




                Create Clean Code with AOP                      International PHP Conference, Mainz 2010
Mittwoch, 13. Oktober 2010
Mittwoch, 13. Oktober 2010

Creating Clean Code with AOP

  • 1.
    Robert Lemke Create Clean Code with Aspect-Oriented Programming International PHP Conference, Mainz 2010 /** Asp ect *S ecu rity *@ asp ect */ ityA spe ct { cla s s Se cur olic ies; tec ted $p Mittwoch, 13. 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 Mittwoch, 13. Oktober 2010
  • 3.
    = PHP 5.3Full Stack Application Framework Mittwoch, 13. 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 Mittwoch, 13. 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 International PHP Conference, Mainz 2010 Mittwoch, 13. 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 International PHP Conference, Mainz 2010 Mittwoch, 13. Oktober 2010
  • 7.
    AOP Create Clean Code with AOP International PHP Conference, Mainz 2010 Mittwoch, 13. 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 International PHP Conference, Mainz 2010 Mittwoch, 13. 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 International PHP Conference, Mainz 2010 Mittwoch, 13. Oktober 2010
  • 10.
    Concerns? Create Clean Code with AOP International PHP Conference, Mainz 2010 Mittwoch, 13. 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 International PHP Conference, Mainz 2010 Mittwoch, 13. Oktober 2010
  • 12.
    Cross-Cutting Concerns Logging Security Persistence Global Business Logic Dirty Hacks Create Clean Code with AOP International PHP Conference, Mainz 2010 Mittwoch, 13. Oktober 2010
  • 13.
    We don't wantinfrastructure code in our models. Create Clean Code with AOP International PHP Conference, Mainz 2010 Mittwoch, 13. Oktober 2010
  • 14.
    We want tounit-test even cross-cutting concerns Create Clean Code with AOP International PHP Conference, Mainz 2010 Mittwoch, 13. Oktober 2010
  • 15.
    We want tocentralize security-related code Create Clean Code with AOP International PHP Conference, Mainz 2010 Mittwoch, 13. Oktober 2010
  • 16.
    AOP Lingo Create Clean Code with AOP International PHP Conference, Mainz 2010 Mittwoch, 13. 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 International PHP Conference, Mainz 2010 Mittwoch, 13. 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 International PHP Conference, Mainz 2010 Mittwoch, 13. 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 International PHP Conference, Mainz 2010 Mittwoch, 13. Oktober 2010
  • 20.
    Advice Action to take at a join points defined by the point cut Create Clean Code with AOP International PHP Conference, Mainz 2010 Mittwoch, 13. Oktober 2010
  • 21.
    DEMO Inspiring people to Hitchhiker's Guide to FLOW3 share Mittwoch, 13. 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 Mittwoch, 13. 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 Mittwoch, 13. Oktober 2010
  • 24.
    Runtime Evaluations evaluate(coffee.kind == "Arabica") Inspiring people to Hitchhiker's Guide to FLOW3 share Mittwoch, 13. 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 Mittwoch, 13. Oktober 2010
  • 26.
    DEMO Inspiring people to Hitchhiker's Guide to FLOW3 share Mittwoch, 13. 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 Mittwoch, 13. Oktober 2010
  • 28.
    Inspiring people to Hitchhiker's Guide to FLOW3 share Mittwoch, 13. Oktober 2010
  • 29.
    Inspiring people to Hitchhiker's Guide to FLOW3 share Mittwoch, 13. Oktober 2010
  • 30.
    Progress FLOW3 1.0.0 Create Clean Code with AOP International PHP Conference, Mainz 2010 Mittwoch, 13. 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 International PHP Conference, Mainz 2010 Mittwoch, 13. 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 International PHP Conference, Mainz 2010 Mittwoch, 13. Oktober 2010
  • 33.