Solving Cross-Cutting
Concerns in PHP
Alexander Lisachenko
About me:
2
lisachenko
lisachenko
‣ Head of Software Architecture
at Alpari (RU) Forex Broker
About me:
2
lisachenko
lisachenko
‣ Head of Software Architecture
at Alpari (RU) Forex Broker
‣ Have worked with computers
since 7 years old
About me:
2
lisachenko
lisachenko
‣ Head of Software Architecture
at Alpari (RU) Forex Broker
‣ Have worked with computers
since 7 years old
‣ Clean code advocate, guru in
enterprise architecture
About me:
2
lisachenko
lisachenko
‣ Head of Software Architecture
at Alpari (RU) Forex Broker
‣ Have worked with computers
since 7 years old
‣ Clean code advocate, guru in
enterprise architecture
‣ Author of the aspect-oriented
framework Go! AOP 

http://go.aopphp.com
About me:
2
lisachenko
lisachenko
Agenda
3
Agenda
‣ Advantages of Object-Oriented Paradigm
3
Agenda
‣ Advantages of Object-Oriented Paradigm
‣ Limitations of OOP and how they affect our
application
3
Agenda
‣ Advantages of Object-Oriented Paradigm
‣ Limitations of OOP and how they affect our
application
‣ Existing object-oriented ways of solving
cross-cutting concerns
3
Agenda
‣ Advantages of Object-Oriented Paradigm
‣ Limitations of OOP and how they affect our
application
‣ Existing object-oriented ways of solving
cross-cutting concerns
‣ Pros and cons: the aspect-oriented
approach of solving cross-cutting concerns
3
Agenda
‣ Advantages of Object-Oriented Paradigm
‣ Limitations of OOP and how they affect our
application
‣ Existing object-oriented ways of solving
cross-cutting concerns
‣ Pros and cons: the aspect-oriented
approach of solving cross-cutting concerns
‣ Examples of using aspects in real life
applications
3
Текст
Object-Oriented Paradigm
Solution to the complexity
5
Modularity
We connect classes, components, bundles, and
frameworks.
6
Reusability
We use existing code to create new code on the
top.
7
Encapsulation
We hide implementation details from the outside
world.
8
Is it a silver bullet?
Object-Oriented Paradigm
8
Is it a silver bullet?
Object-Oriented Paradigm
8
Is it a silver bullet?
Object-Oriented Paradigm
Edsger W. Dijkstra
“Object-oriented programming is an
exceptionally bad idea which could
only have originated in California.”
9
Joe Armstrong
“…You wanted a banana but what you got
[with OOP] was a gorilla holding the banana
and the entire jungle”
10
What are the problems?
11
What are the problems?
‣ Limitation of object-oriented
representation of real life processes
11
What are the problems?
‣ Limitation of object-oriented
representation of real life processes
‣ Essential complexity results in strong
coupling between components
11
What are the problems?
‣ Limitation of object-oriented
representation of real life processes
‣ Essential complexity results in strong
coupling between components
‣ Essential complexity results in scattered
implementation of our concerns
11
Текст
Cross-cutting concerns
What they are and why we should think about
them
13
Cross-cutting concerns are
aspects of a program that affect
other concerns.
Cross-cutting concerns - why
they affect our code?
14
Task: Implement an audit system that checks
access permission for each public method over
all classes in our system and then logs this
information into the security journal.
Clean model
15
Authorization control…
16
Authorization control…
16
Logging and audit…
17
Logging and audit…
17
Logging and audit…
17
Error handling…
18
Error handling…
18
Code tangling
19
Code scattering
20
Текст
OOP ways
What do we have in OOP to fight cross-cutting
concerns?
Decorator
Design pattern that allows
behavior to be added to an
individual object, either
statically or dynamically,
without affecting the behavior
of other objects from the
same class.
22
23
23
23
23
Decorator
+ Respects LSP - We can pass an instance of a
decorator everywhere the original object is expected.
+ Keeps SRP for the original class because it doesn’t
contain secondary concerns now
- Too many decorator classes for each combination of
concern+concrete interface
- Secondary concerns (authorization, caching, etc.) are
scattered across all decorators
- Additional overhead for calling original methods
24
Mediator
Defines an object that
incapsulates all logic of
interactions between objects,
giving them the ability to
work without explicit
references to each other
25
26
26
26
27
27
27
Mediator
+ All secondary concerns can be moved to separate
classes without duplication (SRP for secondary
concerns)
+ Keeps SRP for the original class, because it doesn’t
contain secondary concerns now
+ The most flexible way of extending a system
- Requires specific changes in the original class to
perform notification of mediator
- Hard to debug code with complex logic of interaction
because there are no explicit links between objects
28
Текст
Take control of everything
What if we combine all the best features of the
decorator and mediator into the one pattern?
Aspect-Oriented Paradigm
A programming
paradigm that aims to
increase modularity by
allowing the separation
of cross-cutting
concerns
30
Go! AOP Framework
31
Go! AOP Framework
31
‣ Inspired by famous AspectJ and Spring
frameworks
Go! AOP Framework
31
‣ Inspired by famous AspectJ and Spring
frameworks
‣ Over 800 stargazers on Github - thank you!
Go! AOP Framework
31
‣ Inspired by famous AspectJ and Spring
frameworks
‣ Over 800 stargazers on Github - thank you!
‣ Over 200k installations on Packagist
Go! AOP Framework
31
‣ Inspired by famous AspectJ and Spring
frameworks
‣ Over 800 stargazers on Github - thank you!
‣ Over 200k installations on Packagist
‣ PHP5.6, PHP7.0 and Opcache compatible
Go! AOP Framework
31
‣ Inspired by famous AspectJ and Spring
frameworks
‣ Over 800 stargazers on Github - thank you!
‣ Over 200k installations on Packagist
‣ PHP5.6, PHP7.0 and Opcache compatible
‣ There are bridges for SF2, ZF2, Laravel…
Let’s take our clean code…
32
Let’s take our clean code…
32
Let’s take our clean code…
Method execution is an event
32
…and subscribe to our event
33
…and subscribe to our event
33
…and subscribe to our event
Pointcut - describes list of
interesting events
33
…and subscribe to our event
Pointcut - describes list of
interesting events
33
…and subscribe to our event
Pointcut - describes list of
interesting events
Joinpoint - defines an event
object
33
…and subscribe to our event
Pointcut - describes list of
interesting events
Joinpoint - defines an event
object
33
…and subscribe to our event
Pointcut - describes list of
interesting events
Joinpoint - defines an event
object
Advice - event handler
33
How it works
34
All aspects (or advisors) are registered in
the aspect kernel
How it works
35
The special php://filter stream filter is
registered via stream_filter_register()
How it works
36
The composer class loader is replaced
with a weaving proxy
How it works
37
Lexical analysis and parsing of AST is
performed (nikic/PHP-Parser)
How it works
38
Static reflection is created from the AST
(goaop/parser-reflection)
How it works
39
The original class is renamed and replaced with a
new class with additional behavior; stored in the
cache
How it works
39
The original class is renamed and replaced with a
new class with additional behavior; stored in the
cache
How it works
39
The original class is renamed and replaced with a
new class with additional behavior; stored in the
cache
Simple inheritance
How it works
39
The original class is renamed and replaced with a
new class with additional behavior; stored in the
cache
Simple inheritance
How it works
39
The original class is renamed and replaced with a
new class with additional behavior; stored in the
cache
Simple inheritance
Overridden method
Текст
Go! AOP joinpoints
What can be intercepted?
Method interceptors:
41
Method interceptors:
41
Can be a final class or a trait!
Property interceptors:
42
Logic interceptors:
43
AOP
+ Keeps SRP for the original class because it doesn’t
contain secondary concerns now
+ All secondary concerns are stored in separate classes
without duplication (SRP for secondary concerns)
+ Very flexible way of extending our system (like mediator
does)
+ Does not require changes in original classes
- No tools to debug AOP code; no help from IDE
- Overhead for AOP initialization and execution
44
Go! AOP: Debugging with
XDebug
45
Go! AOP: Debugging with
XDebug
45
Go! AOP: Plugin for the
PhpStorm
46
Pointcut syntax highlighting,
completion and analysis
47
Pointcut syntax highlighting,
completion and analysis
47
Navigate to advice/advised
elements
48
Navigate to advice/advised
elements
48
Текст
Circuit breaker
Prevents one failure from reoccurring
continuously
Logic of CircuitBreaker
50
Logic of CircuitBreaker
50
‣ For each public method execution we count
the number of failures in APC/Memcache.
Logic of CircuitBreaker
50
‣ For each public method execution we count
the number of failures in APC/Memcache.
‣ If the number of failures is too high, then we
break the circuit to prevent subsequent failures.
Logic of CircuitBreaker
50
‣ For each public method execution we count
the number of failures in APC/Memcache.
‣ If the number of failures is too high, then we
break the circuit to prevent subsequent failures.
‣ If the circuit is broken, then the original method
body should not be executed for the
configured amount of time.
Logic of CircuitBreaker
50
‣ For each public method execution we count
the number of failures in APC/Memcache.
‣ If the number of failures is too high, then we
break the circuit to prevent subsequent failures.
‣ If the circuit is broken, then the original method
body should not be executed for the
configured amount of time.
‣ https://github.com/ejsmont-artur/php-circuit-
breaker can be used.
Step 1. Define an annotation
51
Step 2. Define an aspect
52
Step 2. Define an aspect
53
Step 2. Define an aspect
53
All methods with «Fuse» annotation
Step 2. Define an aspect
53
All methods with «Fuse» annotation
Step 2. Define an aspect
53
All methods with «Fuse» annotation
Step 2. Define an aspect
53
All methods with «Fuse» annotation
Step 3. Use it in your code
54
Step 3. Use it in your code
54
More examples for AOP
55
More examples for AOP
55
‣ Profiling methods with pinba extension and
Intaro Pinboard
More examples for AOP
55
‣ Profiling methods with pinba extension and
Intaro Pinboard
‣ Feature toggle pattern
More examples for AOP
55
‣ Profiling methods with pinba extension and
Intaro Pinboard
‣ Feature toggle pattern
‣ Authorization control
More examples for AOP
55
‣ Profiling methods with pinba extension and
Intaro Pinboard
‣ Feature toggle pattern
‣ Authorization control
‣ Traditional caching, logging, transaction
control, security audit
More examples for AOP
55
‣ Profiling methods with pinba extension and
Intaro Pinboard
‣ Feature toggle pattern
‣ Authorization control
‣ Traditional caching, logging, transaction
control, security audit
‣ Design by contract programming (Php-Deal
library)
More examples for AOP
55
‣ Profiling methods with pinba extension and
Intaro Pinboard
‣ Feature toggle pattern
‣ Authorization control
‣ Traditional caching, logging, transaction
control, security audit
‣ Design by contract programming (Php-Deal
library)
‣ Aspect-oriented testing (AspectMock)
Conclusion
56
Conclusion
56
‣ OOP is a nice tool for solving accidental
complexity but not for essential complexity.
Conclusion
56
‣ OOP is a nice tool for solving accidental
complexity but not for essential complexity.
‣ Pay attention to code scattering and code
tangling.
Conclusion
56
‣ OOP is a nice tool for solving accidental
complexity but not for essential complexity.
‣ Pay attention to code scattering and code
tangling.
‣ Try to extract secondary concerns into
separate classes via OOP decomposition for
small applications.
Conclusion
56
‣ OOP is a nice tool for solving accidental
complexity but not for essential complexity.
‣ Pay attention to code scattering and code
tangling.
‣ Try to extract secondary concerns into
separate classes via OOP decomposition for
small applications.
‣ Try to use AOP for complex enterprise
applications.
Thank you for the attention!
https://github.com/goaop
https://github.com/lisachenko
https://twitter.com/lisachenko

Solving Cross-Cutting Concerns in PHP - DutchPHP Conference 2016

  • 1.
    Solving Cross-Cutting Concerns inPHP Alexander Lisachenko
  • 2.
  • 3.
    ‣ Head ofSoftware Architecture at Alpari (RU) Forex Broker About me: 2 lisachenko lisachenko
  • 4.
    ‣ Head ofSoftware Architecture at Alpari (RU) Forex Broker ‣ Have worked with computers since 7 years old About me: 2 lisachenko lisachenko
  • 5.
    ‣ Head ofSoftware Architecture at Alpari (RU) Forex Broker ‣ Have worked with computers since 7 years old ‣ Clean code advocate, guru in enterprise architecture About me: 2 lisachenko lisachenko
  • 6.
    ‣ Head ofSoftware Architecture at Alpari (RU) Forex Broker ‣ Have worked with computers since 7 years old ‣ Clean code advocate, guru in enterprise architecture ‣ Author of the aspect-oriented framework Go! AOP 
 http://go.aopphp.com About me: 2 lisachenko lisachenko
  • 7.
  • 8.
    Agenda ‣ Advantages ofObject-Oriented Paradigm 3
  • 9.
    Agenda ‣ Advantages ofObject-Oriented Paradigm ‣ Limitations of OOP and how they affect our application 3
  • 10.
    Agenda ‣ Advantages ofObject-Oriented Paradigm ‣ Limitations of OOP and how they affect our application ‣ Existing object-oriented ways of solving cross-cutting concerns 3
  • 11.
    Agenda ‣ Advantages ofObject-Oriented Paradigm ‣ Limitations of OOP and how they affect our application ‣ Existing object-oriented ways of solving cross-cutting concerns ‣ Pros and cons: the aspect-oriented approach of solving cross-cutting concerns 3
  • 12.
    Agenda ‣ Advantages ofObject-Oriented Paradigm ‣ Limitations of OOP and how they affect our application ‣ Existing object-oriented ways of solving cross-cutting concerns ‣ Pros and cons: the aspect-oriented approach of solving cross-cutting concerns ‣ Examples of using aspects in real life applications 3
  • 13.
  • 14.
    5 Modularity We connect classes,components, bundles, and frameworks.
  • 15.
    6 Reusability We use existingcode to create new code on the top.
  • 16.
    7 Encapsulation We hide implementationdetails from the outside world.
  • 17.
    8 Is it asilver bullet? Object-Oriented Paradigm
  • 18.
    8 Is it asilver bullet? Object-Oriented Paradigm
  • 19.
    8 Is it asilver bullet? Object-Oriented Paradigm
  • 20.
    Edsger W. Dijkstra “Object-orientedprogramming is an exceptionally bad idea which could only have originated in California.” 9
  • 21.
    Joe Armstrong “…You wanteda banana but what you got [with OOP] was a gorilla holding the banana and the entire jungle” 10
  • 22.
    What are theproblems? 11
  • 23.
    What are theproblems? ‣ Limitation of object-oriented representation of real life processes 11
  • 24.
    What are theproblems? ‣ Limitation of object-oriented representation of real life processes ‣ Essential complexity results in strong coupling between components 11
  • 25.
    What are theproblems? ‣ Limitation of object-oriented representation of real life processes ‣ Essential complexity results in strong coupling between components ‣ Essential complexity results in scattered implementation of our concerns 11
  • 26.
    Текст Cross-cutting concerns What theyare and why we should think about them
  • 27.
    13 Cross-cutting concerns are aspectsof a program that affect other concerns.
  • 28.
    Cross-cutting concerns -why they affect our code? 14 Task: Implement an audit system that checks access permission for each public method over all classes in our system and then logs this information into the security journal.
  • 29.
  • 30.
  • 31.
  • 32.
  • 33.
  • 34.
  • 35.
  • 36.
  • 37.
  • 38.
  • 39.
    Текст OOP ways What dowe have in OOP to fight cross-cutting concerns?
  • 40.
    Decorator Design pattern thatallows behavior to be added to an individual object, either statically or dynamically, without affecting the behavior of other objects from the same class. 22
  • 41.
  • 42.
  • 43.
  • 44.
  • 45.
    Decorator + Respects LSP- We can pass an instance of a decorator everywhere the original object is expected. + Keeps SRP for the original class because it doesn’t contain secondary concerns now - Too many decorator classes for each combination of concern+concrete interface - Secondary concerns (authorization, caching, etc.) are scattered across all decorators - Additional overhead for calling original methods 24
  • 46.
    Mediator Defines an objectthat incapsulates all logic of interactions between objects, giving them the ability to work without explicit references to each other 25
  • 47.
  • 48.
  • 49.
  • 50.
  • 51.
  • 52.
  • 53.
    Mediator + All secondaryconcerns can be moved to separate classes without duplication (SRP for secondary concerns) + Keeps SRP for the original class, because it doesn’t contain secondary concerns now + The most flexible way of extending a system - Requires specific changes in the original class to perform notification of mediator - Hard to debug code with complex logic of interaction because there are no explicit links between objects 28
  • 54.
    Текст Take control ofeverything What if we combine all the best features of the decorator and mediator into the one pattern?
  • 55.
    Aspect-Oriented Paradigm A programming paradigmthat aims to increase modularity by allowing the separation of cross-cutting concerns 30
  • 56.
  • 57.
    Go! AOP Framework 31 ‣Inspired by famous AspectJ and Spring frameworks
  • 58.
    Go! AOP Framework 31 ‣Inspired by famous AspectJ and Spring frameworks ‣ Over 800 stargazers on Github - thank you!
  • 59.
    Go! AOP Framework 31 ‣Inspired by famous AspectJ and Spring frameworks ‣ Over 800 stargazers on Github - thank you! ‣ Over 200k installations on Packagist
  • 60.
    Go! AOP Framework 31 ‣Inspired by famous AspectJ and Spring frameworks ‣ Over 800 stargazers on Github - thank you! ‣ Over 200k installations on Packagist ‣ PHP5.6, PHP7.0 and Opcache compatible
  • 61.
    Go! AOP Framework 31 ‣Inspired by famous AspectJ and Spring frameworks ‣ Over 800 stargazers on Github - thank you! ‣ Over 200k installations on Packagist ‣ PHP5.6, PHP7.0 and Opcache compatible ‣ There are bridges for SF2, ZF2, Laravel…
  • 62.
    Let’s take ourclean code… 32
  • 63.
    Let’s take ourclean code… 32
  • 64.
    Let’s take ourclean code… Method execution is an event 32
  • 65.
    …and subscribe toour event 33
  • 66.
    …and subscribe toour event 33
  • 67.
    …and subscribe toour event Pointcut - describes list of interesting events 33
  • 68.
    …and subscribe toour event Pointcut - describes list of interesting events 33
  • 69.
    …and subscribe toour event Pointcut - describes list of interesting events Joinpoint - defines an event object 33
  • 70.
    …and subscribe toour event Pointcut - describes list of interesting events Joinpoint - defines an event object 33
  • 71.
    …and subscribe toour event Pointcut - describes list of interesting events Joinpoint - defines an event object Advice - event handler 33
  • 72.
    How it works 34 Allaspects (or advisors) are registered in the aspect kernel
  • 73.
    How it works 35 Thespecial php://filter stream filter is registered via stream_filter_register()
  • 74.
    How it works 36 Thecomposer class loader is replaced with a weaving proxy
  • 75.
    How it works 37 Lexicalanalysis and parsing of AST is performed (nikic/PHP-Parser)
  • 76.
    How it works 38 Staticreflection is created from the AST (goaop/parser-reflection)
  • 77.
    How it works 39 Theoriginal class is renamed and replaced with a new class with additional behavior; stored in the cache
  • 78.
    How it works 39 Theoriginal class is renamed and replaced with a new class with additional behavior; stored in the cache
  • 79.
    How it works 39 Theoriginal class is renamed and replaced with a new class with additional behavior; stored in the cache Simple inheritance
  • 80.
    How it works 39 Theoriginal class is renamed and replaced with a new class with additional behavior; stored in the cache Simple inheritance
  • 81.
    How it works 39 Theoriginal class is renamed and replaced with a new class with additional behavior; stored in the cache Simple inheritance Overridden method
  • 82.
  • 83.
  • 84.
    Method interceptors: 41 Can bea final class or a trait!
  • 85.
  • 86.
  • 87.
    AOP + Keeps SRPfor the original class because it doesn’t contain secondary concerns now + All secondary concerns are stored in separate classes without duplication (SRP for secondary concerns) + Very flexible way of extending our system (like mediator does) + Does not require changes in original classes - No tools to debug AOP code; no help from IDE - Overhead for AOP initialization and execution 44
  • 88.
    Go! AOP: Debuggingwith XDebug 45
  • 89.
    Go! AOP: Debuggingwith XDebug 45
  • 90.
    Go! AOP: Pluginfor the PhpStorm 46
  • 91.
  • 92.
  • 93.
  • 94.
  • 95.
    Текст Circuit breaker Prevents onefailure from reoccurring continuously
  • 96.
  • 97.
    Logic of CircuitBreaker 50 ‣For each public method execution we count the number of failures in APC/Memcache.
  • 98.
    Logic of CircuitBreaker 50 ‣For each public method execution we count the number of failures in APC/Memcache. ‣ If the number of failures is too high, then we break the circuit to prevent subsequent failures.
  • 99.
    Logic of CircuitBreaker 50 ‣For each public method execution we count the number of failures in APC/Memcache. ‣ If the number of failures is too high, then we break the circuit to prevent subsequent failures. ‣ If the circuit is broken, then the original method body should not be executed for the configured amount of time.
  • 100.
    Logic of CircuitBreaker 50 ‣For each public method execution we count the number of failures in APC/Memcache. ‣ If the number of failures is too high, then we break the circuit to prevent subsequent failures. ‣ If the circuit is broken, then the original method body should not be executed for the configured amount of time. ‣ https://github.com/ejsmont-artur/php-circuit- breaker can be used.
  • 101.
    Step 1. Definean annotation 51
  • 102.
    Step 2. Definean aspect 52
  • 103.
    Step 2. Definean aspect 53
  • 104.
    Step 2. Definean aspect 53 All methods with «Fuse» annotation
  • 105.
    Step 2. Definean aspect 53 All methods with «Fuse» annotation
  • 106.
    Step 2. Definean aspect 53 All methods with «Fuse» annotation
  • 107.
    Step 2. Definean aspect 53 All methods with «Fuse» annotation
  • 108.
    Step 3. Useit in your code 54
  • 109.
    Step 3. Useit in your code 54
  • 110.
  • 111.
    More examples forAOP 55 ‣ Profiling methods with pinba extension and Intaro Pinboard
  • 112.
    More examples forAOP 55 ‣ Profiling methods with pinba extension and Intaro Pinboard ‣ Feature toggle pattern
  • 113.
    More examples forAOP 55 ‣ Profiling methods with pinba extension and Intaro Pinboard ‣ Feature toggle pattern ‣ Authorization control
  • 114.
    More examples forAOP 55 ‣ Profiling methods with pinba extension and Intaro Pinboard ‣ Feature toggle pattern ‣ Authorization control ‣ Traditional caching, logging, transaction control, security audit
  • 115.
    More examples forAOP 55 ‣ Profiling methods with pinba extension and Intaro Pinboard ‣ Feature toggle pattern ‣ Authorization control ‣ Traditional caching, logging, transaction control, security audit ‣ Design by contract programming (Php-Deal library)
  • 116.
    More examples forAOP 55 ‣ Profiling methods with pinba extension and Intaro Pinboard ‣ Feature toggle pattern ‣ Authorization control ‣ Traditional caching, logging, transaction control, security audit ‣ Design by contract programming (Php-Deal library) ‣ Aspect-oriented testing (AspectMock)
  • 117.
  • 118.
    Conclusion 56 ‣ OOP isa nice tool for solving accidental complexity but not for essential complexity.
  • 119.
    Conclusion 56 ‣ OOP isa nice tool for solving accidental complexity but not for essential complexity. ‣ Pay attention to code scattering and code tangling.
  • 120.
    Conclusion 56 ‣ OOP isa nice tool for solving accidental complexity but not for essential complexity. ‣ Pay attention to code scattering and code tangling. ‣ Try to extract secondary concerns into separate classes via OOP decomposition for small applications.
  • 121.
    Conclusion 56 ‣ OOP isa nice tool for solving accidental complexity but not for essential complexity. ‣ Pay attention to code scattering and code tangling. ‣ Try to extract secondary concerns into separate classes via OOP decomposition for small applications. ‣ Try to use AOP for complex enterprise applications.
  • 122.
    Thank you forthe attention! https://github.com/goaop https://github.com/lisachenko https://twitter.com/lisachenko