SlideShare a Scribd company logo
A resource orientated framework
using the DI /AOP/REST Triangle
About Us
• Akihito Koriyama
• A Tokyo based freelance PHP architect
• BEAR.Sunday lead, Aura PHP member
• Richard McIntyre
• Manchester / leeds based freelance PHP
developer
• BEAR.Sunday contributor, Lithium member
About Us
• Akihito Koriyama
• A Tokyo based freelance PHP architect
• BEAR.Sunday lead, Aura PHP member
• Richard McIntyre
• Manchester / Leeds based freelance PHP
developer
• BEAR.Sunday contributor, Lithium member
A resource oriented framework using the DI/AOP/REST triangle
BEAR.Sunday is an application framework.
But it offers no libraries.
(We have good stuff)
instead, it offers three object frameworks.
What is a framework ?
“imposes a set of design constraints on end-user code.”
A resource oriented framework using the DI/AOP/REST triangle
A resource oriented framework using the DI/AOP/REST triangle
3.hypermedia framework
DI
AOP
REST
DI Benefits
• Dependency Inversion Principle
• Clear separation of object instantiation and object
usage
• Object delivery
DIP
• Code should depend on
things that are at the same
or higher level of
abstraction
• High level policy should not
depend on low level details
“The principle of dependency inversion is at the
root of many of the benefits claimed for object-
oriented technology.
Its proper application is necessary for the creation
of reusable frameworks”
Ray.DI
Dependency Injection Framework
/**
* @Inject
*/
public function __construct(RenderInterface $renderer)
{
...
1.annotate at injection point
class RendererModule extends AbstractModule
{
protected function configure()
{
$this->bind('RenderInterface')
->to('HalRenderer')
->in(Scope::SINGLETON);
}
$injector = Inject::create([new RendererModule]];
2 bind abstraction to concretion
3.create an injector
/**
* @Inject
*/
public function __construct(RenderInterface $renderer)
{
...
1.annotate at injection point
class RendererModule extends AbstractModule
{
protected function configure()
{
$this->bind('RenderInterface')
->to('HalRenderer')
->in(Scope::SINGLETON);
}
$injector = Inject::create([new RendererModule]];
2. bind abstraction to concretion
3.create an injector
/**
* @Inject
*/
public function __construct(RenderInterface $renderer)
{
...
1.annotate at injection point
class RendererModule extends AbstractModule
{
protected function configure()
{
$this->bind('RenderInterface')
->to('HalRenderer')
->in(Scope::SINGLETON);
}
$injector = Inject::create([new RendererModule]];
2 bind abstraction to concretion
3.create an injector
$user = $injector->getInstance('UserInterface');
4. Get an object graph from the $injector
User Renderer
Renderer Interface
depends
A
B
procedural
object orietned
compilation
runtime
Implement the structure, not a procedure
class RendererModule extends AbstractModule
{
protected function configure()
{
$this
->bind('RenderInterface')
->to('HalRenderer')
->in(Scope::SINGLETON);
}
}
Only use concrete classes in compilation
Only abstraction in runtime
/**
* @Inject
*/
public function __construct(RenderInterface $renderer)
{
DI Best practice
“Your code should deal directly with the Injector
as little as possible. Instead, you want to bootstrap
your application by injecting one root object.”
Application = one root object
Application class
A resource oriented framework using the DI/AOP/REST triangle
Application is root object
retrieved with injector:
$injector = Inject::create([new AppModule($context)]];
$app = $injector->getInstance(‘AppInterface’);
Application has dependency.
A resource oriented framework using the DI/AOP/REST triangle
Dependencies have other dependencies
Each object either contains or belongs to.
You get a application object graph.
huge, but can be stored one single root value $app
Application can be serialized.
$app can be serialized and stored
Injection is reused beyond requests.
$app
Object
i/f
i/f
Object
i/f i/f
ObjectRouter
Response
JSON
XM
L
1st framework: DI Framework
• annotations based DI framework w/ binding DSL
• compilation / runtime separation
• use only “plug/abstraction” at runtime
• application a single large cached object
• focus on structure not behavior
Aspect Oriented Programing
What is AOP?
Cache
Log
Auth
A programming paradigm that aims to increase modularity
by allowing the separation of cross-cutting concerns
/**
* @Cache
*/
public function onGet($id)
{
// ...
$this->body = $stmt->fetchAll(PDO::FETCH_ASSOC);
return $this;
}
class Post extends AppModel {
public function newest() {
$result = Cache::read('newest_posts', 'longterm');
if (!$result) {
$result = $this->find('all');
Cache::write('newest_posts', $result, 'longterm');
}
return $result;
}
}
MC
I I
AOP
MC
Cache
Cache is called by method invocation,
If the cache is warm the model is never called.
$obj->read(2);
Miss !
Aspects
Core Concern Cross Cutting Concern
Separation
Rock Concert Example
interface MethodInterceptor
{
public function invoke(MethodInvocation $invocation);
}
$invocation->proceed(); // invoked method
$object = $invocation->getThis(); // get source object
$args = $invocation->getArgs(); // get arguments
class Transactional implements MethodInterceptor
{
public function invoke(MethodInvocation $invocation)
{
$object = $invocation->getThis();
$ref = new ReflectionProperty($object, 'db');
$ref->setAccessible(true);
$db = $ref->getValue($object);
$db->beginTransaction();
try {
$invocation->proceed();
$db->commit();
} catch (Exception $e) {
$db->rollback();
}
}
}
`Transactional`interceptor
Core Concern
Cross Cutting Concern
class CacheInterceptor implements MethodInterceptor
{
public function invoke(MethodInvocation $invocation)
{
$obj = $invocation->getThis();
$args = $invocation->getArguments();
$id = get_class($obj) . serialize($args);
$saved = $this->cache->fetch($id);
if ($saved) {
return $saved;
}
$result = $invocation->proceed();
$this->cache->save($id, $result);
return $result;
}
}
`Cache`interceptor
Core Concern
Cross Cutting Concern
Simply annotate,
then create your binding
Bind
Layering by context
• MVC, Is 3 enough ?
APIClient
API LogClient Valid Auth
API Log
@Valid
/admin DELETE
Client Valid Auth
Aspect layering by context
Model
Cache
Form
Transaction
Auth
Validation
<?php
class SandboxResourcePageIndexRay0000000071f9ab280000000033fb446fAop extends
SandboxResourcePageIndex implements RayAopWeavedInterface
{
private $rayAopIntercept = true;
public $rayAopBind;
public function onGet()
{
// native call
if (!isset($this->rayAopBind[__FUNCTION__])) {
return call_user_func_array('parent::' . __FUNCTION__, func_get_args());
}
// proceed source method from interceptor
if (!$this->rayAopIntercept) {
$this->rayAopIntercept = true;
return call_user_func_array('parent::' . __FUNCTION__, func_get_args());
}
// proceed next interceptor
$this->rayAopIntercept = false;
$interceptors = $this->rayAopBind[__FUNCTION__];
$annotation = isset($this->rayAopBind->annotation[__FUNCTION__]) ? $this->rayAopBind
>annotation[__FUNCTION__] : null;
$invocation = new RayAopReflectiveMethodInvocation(array($this, __FUNCTION__),
func_get_args(), $interceptors, $annotation);
return $invocation->proceed();
}
Under the hood: Method interception sub class is created
in order enable this interception and keep type safety.
Runtime injection by aspect
• method / parameter lookup
• test friendly
2nd framework: Aspect Oriented Framework
• AOP alliance standard
• Layering by context
• Type safe
• Runtime injection
A resource oriented framework using the DI/AOP/REST triangle
Hypermedia framework for object as a service
It allows objects to have RESTful web service benefits
such as client-server, uniform interface, statelessness,
resource expression with mutual connectivity and
layered components.
class Author extends ResourceObject
{
public $code = 200;
public $headers = [];
public $body = [];
/**
* @Link(rel="blog", href="app://self/blog/post?author_id={id}")
*/
public function onGet($id)
{
... // change own state
return $this;
}
public function onPost($name)
{
$this->code = 201; // created
return $this;
}
public function onPut($id, $name)
$user = $resource
->get
->uri('app://self/user')
->withQuery(['id' => 1])
->eager
->request();
var_dump($user->body);
// Array
// (
// [name] => John
// [age] => 15
//)
echo $user;
// <div id=”name”>John</div>
// <div id=”age”>15</div>
public function onGet($id)
{
$this[‘name’] = ‘John’;
$this[‘age’] = 15;
return $this;
}
User
Profile
Friend
$order = $resource
->post
->uri('app://self/order')
->withQuery(['drink' => 'latte'])
->eager
->request();
$payment = [
'credit_card_number' => '123456789',
'expires' => '07/07',
'name' => 'Koriym',
'amount' => '4.00'
];
// Now use a hyperlink to pay
$response = $resource->href('pay', $payment);
echo $response->code; // 201
Hypermedia as the Engine of Application State
class Order extends ResourceObject
{
/**
*
* @Link(rel="pay", method="put",
href="app://self/payment{?order_id,card_number,amount}")
*/
public function onPost($drink)
{
// data store here
$this['drink'] = $drink;
$this['order_id'] = $orderId;
// created
$this->code = 201;
return $this;
}
Hypermedia as the Engine of Application State
Order Payment
hyper reference: pay
HyperMedia Driven API
The key of success of web
• URI
• Unified Interface
• Hyperlink
• API is hub
• API is core value
API driven development
DB Mobil
e
Web
API
Cloud
Moc
k
URI
API
API
http://blog.8thlight.com/uncle-bob/2012/08/13/the-clean-architecture.html
Layered Resource
UI
Mobile
Web
Page Resource
App script
App Resource
Entity
A resource oriented framework using the DI/AOP/REST triangle
A resource oriented framework using the DI/AOP/REST triangle
A resource oriented framework using the DI/AOP/REST triangle
A resource oriented framework using the DI/AOP/REST triangle
Performance
• annotation ? dependency injection ?
method interception ? DSL ? named parameter ?
• Fast
• cache all compiled object
• http friendly architecture
Scale
• “model proxy” pattern
• ‘app://self/blog/entry’ can be anything.
• contextual injection makes db scale easy
Hard spot / Soft spot
• DI configure hardspot. per system
• Aop configure softspot, change on request
Connecting frameworks
• DI - object as dependency
• AOP - domain logic to application logic
• Hypermedia - resource to resource
Abstraction frameworks
• DSL
• Annotation
• URI
• Interface
• Aspects
• Hypermedia
A resource oriented framework using the DI/AOP/REST triangle
“Zen” framework
Thanks.
Arigato
http://www.flickr.com/photos/stevehoad/4678289858/
@mackstar@koriym

More Related Content

PDF
Introduction to DI(C)
PDF
Decoupling with Design Patterns and Symfony2 DIC
PDF
Design how your objects talk through mocking
PDF
How I started to love design patterns
PDF
Symfony CoP: Form component
PDF
Min-Maxing Software Costs - Laracon EU 2015
PPTX
Crafting beautiful software
KEY
Zend Framework and the Doctrine2 MongoDB ODM (ZF1)
Introduction to DI(C)
Decoupling with Design Patterns and Symfony2 DIC
Design how your objects talk through mocking
How I started to love design patterns
Symfony CoP: Form component
Min-Maxing Software Costs - Laracon EU 2015
Crafting beautiful software
Zend Framework and the Doctrine2 MongoDB ODM (ZF1)

What's hot (20)

PDF
Min-Maxing Software Costs
ODP
Rich domain model with symfony 2.5 and doctrine 2.5
PDF
Doctrine For Beginners
PDF
Building Lithium Apps
PDF
Design Patterns in PHP5
PDF
Rich Model And Layered Architecture in SF2 Application
PDF
DrupalJam 2018 - Maintaining a Drupal Module: Keep It Small and Simple
ODP
Symfony2, creare bundle e valore per il cliente
PDF
Lithium: The Framework for People Who Hate Frameworks, Tokyo Edition
PDF
How I started to love design patterns
PDF
New Symfony Tips & Tricks (SymfonyCon Paris 2015)
PDF
Symfony tips and tricks
PPTX
Hacking Your Way To Better Security - Dutch PHP Conference 2016
PDF
Be RESTful (Symfony Camp 2008)
PDF
The State of Lithium
PDF
What's New in Drupal 8: Entity Field API
PDF
Silex meets SOAP & REST
PDF
Drupal 8: Entities
PDF
The Zen of Lithium
PDF
Design Patterns avec PHP 5.3, Symfony et Pimple
Min-Maxing Software Costs
Rich domain model with symfony 2.5 and doctrine 2.5
Doctrine For Beginners
Building Lithium Apps
Design Patterns in PHP5
Rich Model And Layered Architecture in SF2 Application
DrupalJam 2018 - Maintaining a Drupal Module: Keep It Small and Simple
Symfony2, creare bundle e valore per il cliente
Lithium: The Framework for People Who Hate Frameworks, Tokyo Edition
How I started to love design patterns
New Symfony Tips & Tricks (SymfonyCon Paris 2015)
Symfony tips and tricks
Hacking Your Way To Better Security - Dutch PHP Conference 2016
Be RESTful (Symfony Camp 2008)
The State of Lithium
What's New in Drupal 8: Entity Field API
Silex meets SOAP & REST
Drupal 8: Entities
The Zen of Lithium
Design Patterns avec PHP 5.3, Symfony et Pimple
Ad

Viewers also liked (16)

PPTX
Cornea
PDF
PHP Coding in BEAR.Sunday
PPT
Microscopic structure of retina dr paresh varsat
PPTX
Dr.s.veni priya 18.2.16 deg cyst tumors
PDF
Diseases of ocular motility with an emphasis on squint
PPTX
Pinguecula y pterigion
PPT
Pterigion
PPTX
Keratoconus
PPTX
Conjuntivitis, pterigion y pinguecula
PPTX
Pterygium and its management
PPTX
Strabismus-Clinical Examinations
PPT
Visual field testing and interpretation
PPTX
Lacrimal apparatus
PPTX
anatomy and physiology of lacrimal apparatus ppt
PPT
Glaucoma & target iop
PPT
Pinguecula - An overview
Cornea
PHP Coding in BEAR.Sunday
Microscopic structure of retina dr paresh varsat
Dr.s.veni priya 18.2.16 deg cyst tumors
Diseases of ocular motility with an emphasis on squint
Pinguecula y pterigion
Pterigion
Keratoconus
Conjuntivitis, pterigion y pinguecula
Pterygium and its management
Strabismus-Clinical Examinations
Visual field testing and interpretation
Lacrimal apparatus
anatomy and physiology of lacrimal apparatus ppt
Glaucoma & target iop
Pinguecula - An overview
Ad

Similar to A resource oriented framework using the DI/AOP/REST triangle (20)

PDF
Dependency Injection
PPTX
Real World Asp.Net WebApi Applications
PDF
Advanced Interfaces and Repositories in Laravel
PDF
Introduction to Zend Framework web services
PDF
Alexander Makarov "Let’s talk about code"
PPTX
Building Large Scale PHP Web Applications with Laravel 4
PDF
Beyond MVC: from Model to Domain
PPT
Easy rest service using PHP reflection api
PDF
Migrating to dependency injection
PPTX
API Platform: The Pragmatic API framework
KEY
Zend framework service
KEY
Zend framework service
PDF
High quality ap is with api platform
PDF
ZFConf 2012: Zend Framework 2, a quick start (Enrico Zimuel)
PDF
Zend Framework 2 quick start
PDF
Code decoupling from Symfony (and others frameworks) - PHP Conference Brasil ...
PDF
PHP: 4 Design Patterns to Make Better Code
PDF
REST easy with API Platform
PPTX
Adding Dependency Injection to Legacy Applications
PDF
What is DDD and how could it help you
Dependency Injection
Real World Asp.Net WebApi Applications
Advanced Interfaces and Repositories in Laravel
Introduction to Zend Framework web services
Alexander Makarov "Let’s talk about code"
Building Large Scale PHP Web Applications with Laravel 4
Beyond MVC: from Model to Domain
Easy rest service using PHP reflection api
Migrating to dependency injection
API Platform: The Pragmatic API framework
Zend framework service
Zend framework service
High quality ap is with api platform
ZFConf 2012: Zend Framework 2, a quick start (Enrico Zimuel)
Zend Framework 2 quick start
Code decoupling from Symfony (and others frameworks) - PHP Conference Brasil ...
PHP: 4 Design Patterns to Make Better Code
REST easy with API Platform
Adding Dependency Injection to Legacy Applications
What is DDD and how could it help you

More from Akihito Koriyama (14)

PDF
PHPカンファレンス関西2014 「全てを結ぶ力」
PDF
BEAR.Sunday 1.X
PDF
BEAR.Sunday $app
KEY
BEAR.Sunday@phpcon2012
KEY
An object graph visualizer for PHP - print_o
PDF
BEAR.Sunday.meetup #0
KEY
BEAR.Sunday Offline Talk
KEY
BEAR.Sunday Note
PDF
PHP: Dis Is It
PDF
The new era of PHP web development.
KEY
BEAR (Suday) design
KEY
KEY
BEAR Architecture
KEY
BEAR v0.9 (Saturday)
PHPカンファレンス関西2014 「全てを結ぶ力」
BEAR.Sunday 1.X
BEAR.Sunday $app
BEAR.Sunday@phpcon2012
An object graph visualizer for PHP - print_o
BEAR.Sunday.meetup #0
BEAR.Sunday Offline Talk
BEAR.Sunday Note
PHP: Dis Is It
The new era of PHP web development.
BEAR (Suday) design
BEAR Architecture
BEAR v0.9 (Saturday)

Recently uploaded (20)

PDF
cuic standard and advanced reporting.pdf
PDF
Advanced methodologies resolving dimensionality complications for autism neur...
PDF
Agricultural_Statistics_at_a_Glance_2022_0.pdf
PPTX
A Presentation on Artificial Intelligence
PDF
The Rise and Fall of 3GPP – Time for a Sabbatical?
PDF
NewMind AI Monthly Chronicles - July 2025
PPTX
KOM of Painting work and Equipment Insulation REV00 update 25-dec.pptx
PPTX
Cloud computing and distributed systems.
PDF
Review of recent advances in non-invasive hemoglobin estimation
PDF
Blue Purple Modern Animated Computer Science Presentation.pdf.pdf
PDF
Machine learning based COVID-19 study performance prediction
PDF
Bridging biosciences and deep learning for revolutionary discoveries: a compr...
PDF
CIFDAQ's Market Insight: SEC Turns Pro Crypto
PDF
Spectral efficient network and resource selection model in 5G networks
PPTX
Digital-Transformation-Roadmap-for-Companies.pptx
PDF
Empathic Computing: Creating Shared Understanding
PDF
Per capita expenditure prediction using model stacking based on satellite ima...
PPTX
Effective Security Operations Center (SOC) A Modern, Strategic, and Threat-In...
PDF
How UI/UX Design Impacts User Retention in Mobile Apps.pdf
PDF
Dropbox Q2 2025 Financial Results & Investor Presentation
cuic standard and advanced reporting.pdf
Advanced methodologies resolving dimensionality complications for autism neur...
Agricultural_Statistics_at_a_Glance_2022_0.pdf
A Presentation on Artificial Intelligence
The Rise and Fall of 3GPP – Time for a Sabbatical?
NewMind AI Monthly Chronicles - July 2025
KOM of Painting work and Equipment Insulation REV00 update 25-dec.pptx
Cloud computing and distributed systems.
Review of recent advances in non-invasive hemoglobin estimation
Blue Purple Modern Animated Computer Science Presentation.pdf.pdf
Machine learning based COVID-19 study performance prediction
Bridging biosciences and deep learning for revolutionary discoveries: a compr...
CIFDAQ's Market Insight: SEC Turns Pro Crypto
Spectral efficient network and resource selection model in 5G networks
Digital-Transformation-Roadmap-for-Companies.pptx
Empathic Computing: Creating Shared Understanding
Per capita expenditure prediction using model stacking based on satellite ima...
Effective Security Operations Center (SOC) A Modern, Strategic, and Threat-In...
How UI/UX Design Impacts User Retention in Mobile Apps.pdf
Dropbox Q2 2025 Financial Results & Investor Presentation

A resource oriented framework using the DI/AOP/REST triangle

  • 1. A resource orientated framework using the DI /AOP/REST Triangle
  • 2. About Us • Akihito Koriyama • A Tokyo based freelance PHP architect • BEAR.Sunday lead, Aura PHP member • Richard McIntyre • Manchester / leeds based freelance PHP developer • BEAR.Sunday contributor, Lithium member
  • 3. About Us • Akihito Koriyama • A Tokyo based freelance PHP architect • BEAR.Sunday lead, Aura PHP member • Richard McIntyre • Manchester / Leeds based freelance PHP developer • BEAR.Sunday contributor, Lithium member
  • 5. BEAR.Sunday is an application framework. But it offers no libraries. (We have good stuff)
  • 6. instead, it offers three object frameworks.
  • 7. What is a framework ?
  • 8. “imposes a set of design constraints on end-user code.”
  • 13. DI Benefits • Dependency Inversion Principle • Clear separation of object instantiation and object usage • Object delivery
  • 14. DIP • Code should depend on things that are at the same or higher level of abstraction • High level policy should not depend on low level details
  • 15. “The principle of dependency inversion is at the root of many of the benefits claimed for object- oriented technology. Its proper application is necessary for the creation of reusable frameworks”
  • 17. /** * @Inject */ public function __construct(RenderInterface $renderer) { ... 1.annotate at injection point class RendererModule extends AbstractModule { protected function configure() { $this->bind('RenderInterface') ->to('HalRenderer') ->in(Scope::SINGLETON); } $injector = Inject::create([new RendererModule]]; 2 bind abstraction to concretion 3.create an injector
  • 18. /** * @Inject */ public function __construct(RenderInterface $renderer) { ... 1.annotate at injection point class RendererModule extends AbstractModule { protected function configure() { $this->bind('RenderInterface') ->to('HalRenderer') ->in(Scope::SINGLETON); } $injector = Inject::create([new RendererModule]]; 2. bind abstraction to concretion 3.create an injector
  • 19. /** * @Inject */ public function __construct(RenderInterface $renderer) { ... 1.annotate at injection point class RendererModule extends AbstractModule { protected function configure() { $this->bind('RenderInterface') ->to('HalRenderer') ->in(Scope::SINGLETON); } $injector = Inject::create([new RendererModule]]; 2 bind abstraction to concretion 3.create an injector
  • 20. $user = $injector->getInstance('UserInterface'); 4. Get an object graph from the $injector User Renderer Renderer Interface depends A B
  • 22. class RendererModule extends AbstractModule { protected function configure() { $this ->bind('RenderInterface') ->to('HalRenderer') ->in(Scope::SINGLETON); } } Only use concrete classes in compilation
  • 23. Only abstraction in runtime /** * @Inject */ public function __construct(RenderInterface $renderer) {
  • 24. DI Best practice “Your code should deal directly with the Injector as little as possible. Instead, you want to bootstrap your application by injecting one root object.”
  • 25. Application = one root object
  • 28. Application is root object retrieved with injector: $injector = Inject::create([new AppModule($context)]]; $app = $injector->getInstance(‘AppInterface’);
  • 31. Dependencies have other dependencies Each object either contains or belongs to.
  • 32. You get a application object graph. huge, but can be stored one single root value $app
  • 33. Application can be serialized. $app can be serialized and stored Injection is reused beyond requests.
  • 34. $app Object i/f i/f Object i/f i/f ObjectRouter Response JSON XM L 1st framework: DI Framework • annotations based DI framework w/ binding DSL • compilation / runtime separation • use only “plug/abstraction” at runtime • application a single large cached object • focus on structure not behavior
  • 36. What is AOP? Cache Log Auth A programming paradigm that aims to increase modularity by allowing the separation of cross-cutting concerns
  • 37. /** * @Cache */ public function onGet($id) { // ... $this->body = $stmt->fetchAll(PDO::FETCH_ASSOC); return $this; } class Post extends AppModel { public function newest() { $result = Cache::read('newest_posts', 'longterm'); if (!$result) { $result = $this->find('all'); Cache::write('newest_posts', $result, 'longterm'); } return $result; } }
  • 39. MC Cache Cache is called by method invocation, If the cache is warm the model is never called. $obj->read(2); Miss !
  • 40. Aspects Core Concern Cross Cutting Concern Separation
  • 42. interface MethodInterceptor { public function invoke(MethodInvocation $invocation); } $invocation->proceed(); // invoked method $object = $invocation->getThis(); // get source object $args = $invocation->getArgs(); // get arguments
  • 43. class Transactional implements MethodInterceptor { public function invoke(MethodInvocation $invocation) { $object = $invocation->getThis(); $ref = new ReflectionProperty($object, 'db'); $ref->setAccessible(true); $db = $ref->getValue($object); $db->beginTransaction(); try { $invocation->proceed(); $db->commit(); } catch (Exception $e) { $db->rollback(); } } } `Transactional`interceptor Core Concern Cross Cutting Concern
  • 44. class CacheInterceptor implements MethodInterceptor { public function invoke(MethodInvocation $invocation) { $obj = $invocation->getThis(); $args = $invocation->getArguments(); $id = get_class($obj) . serialize($args); $saved = $this->cache->fetch($id); if ($saved) { return $saved; } $result = $invocation->proceed(); $this->cache->save($id, $result); return $result; } } `Cache`interceptor Core Concern Cross Cutting Concern
  • 45. Simply annotate, then create your binding Bind
  • 46. Layering by context • MVC, Is 3 enough ?
  • 50. Aspect layering by context Model Cache Form Transaction Auth Validation
  • 51. <?php class SandboxResourcePageIndexRay0000000071f9ab280000000033fb446fAop extends SandboxResourcePageIndex implements RayAopWeavedInterface { private $rayAopIntercept = true; public $rayAopBind; public function onGet() { // native call if (!isset($this->rayAopBind[__FUNCTION__])) { return call_user_func_array('parent::' . __FUNCTION__, func_get_args()); } // proceed source method from interceptor if (!$this->rayAopIntercept) { $this->rayAopIntercept = true; return call_user_func_array('parent::' . __FUNCTION__, func_get_args()); } // proceed next interceptor $this->rayAopIntercept = false; $interceptors = $this->rayAopBind[__FUNCTION__]; $annotation = isset($this->rayAopBind->annotation[__FUNCTION__]) ? $this->rayAopBind >annotation[__FUNCTION__] : null; $invocation = new RayAopReflectiveMethodInvocation(array($this, __FUNCTION__), func_get_args(), $interceptors, $annotation); return $invocation->proceed(); } Under the hood: Method interception sub class is created in order enable this interception and keep type safety.
  • 52. Runtime injection by aspect • method / parameter lookup • test friendly
  • 53. 2nd framework: Aspect Oriented Framework • AOP alliance standard • Layering by context • Type safe • Runtime injection
  • 55. Hypermedia framework for object as a service It allows objects to have RESTful web service benefits such as client-server, uniform interface, statelessness, resource expression with mutual connectivity and layered components.
  • 56. class Author extends ResourceObject { public $code = 200; public $headers = []; public $body = []; /** * @Link(rel="blog", href="app://self/blog/post?author_id={id}") */ public function onGet($id) { ... // change own state return $this; } public function onPost($name) { $this->code = 201; // created return $this; } public function onPut($id, $name)
  • 57. $user = $resource ->get ->uri('app://self/user') ->withQuery(['id' => 1]) ->eager ->request(); var_dump($user->body); // Array // ( // [name] => John // [age] => 15 //) echo $user; // <div id=”name”>John</div> // <div id=”age”>15</div> public function onGet($id) { $this[‘name’] = ‘John’; $this[‘age’] = 15; return $this; } User Profile Friend
  • 58. $order = $resource ->post ->uri('app://self/order') ->withQuery(['drink' => 'latte']) ->eager ->request(); $payment = [ 'credit_card_number' => '123456789', 'expires' => '07/07', 'name' => 'Koriym', 'amount' => '4.00' ]; // Now use a hyperlink to pay $response = $resource->href('pay', $payment); echo $response->code; // 201 Hypermedia as the Engine of Application State
  • 59. class Order extends ResourceObject { /** * * @Link(rel="pay", method="put", href="app://self/payment{?order_id,card_number,amount}") */ public function onPost($drink) { // data store here $this['drink'] = $drink; $this['order_id'] = $orderId; // created $this->code = 201; return $this; } Hypermedia as the Engine of Application State
  • 60. Order Payment hyper reference: pay HyperMedia Driven API
  • 61. The key of success of web • URI • Unified Interface • Hyperlink
  • 62. • API is hub • API is core value API driven development DB Mobil e Web API Cloud Moc k URI API API
  • 69. Performance • annotation ? dependency injection ? method interception ? DSL ? named parameter ? • Fast • cache all compiled object • http friendly architecture
  • 70. Scale • “model proxy” pattern • ‘app://self/blog/entry’ can be anything. • contextual injection makes db scale easy
  • 71. Hard spot / Soft spot • DI configure hardspot. per system • Aop configure softspot, change on request
  • 72. Connecting frameworks • DI - object as dependency • AOP - domain logic to application logic • Hypermedia - resource to resource
  • 73. Abstraction frameworks • DSL • Annotation • URI • Interface • Aspects • Hypermedia