OOP helps us creating a clearly laid out and intuitive model of the reality by means of objects. However, concerns like security, logging or transactions need to be implemented virtually anywhere, resulting in scattered error-prone code. Aspect-Oriented Programming separates these cross-cutting concerns from the rest of the code and lets you handle them in a well-known, central location.
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.3 Full 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 want infrastructure code
in our models.
Create Clean Code with AOP International PHP Conference, Mainz 2010
Mittwoch, 13. Oktober 2010
14. We want to unit-test even
cross-cutting concerns
Create Clean Code with AOP International PHP Conference, Mainz 2010
Mittwoch, 13. Oktober 2010
15. We want to centralize
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