<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">

  <title><![CDATA[Go! Aspect-Oriented Framework]]></title>
  <link href="http://go.aopphp.com/atom.xml" rel="self"/>
  <link href="http://go.aopphp.com/"/>
  <updated>2014-12-06T23:46:13+03:00</updated>
  <id>http://go.aopphp.com/</id>
  <author>
    <name><![CDATA[Lisachenko Alexander]]></name>
    
  </author>
  <generator uri="http://octopress.org/">Octopress</generator>

  
  <entry>
    <title type="html"><![CDATA[Caching like a PRO]]></title>
    <link href="http://go.aopphp.com/blog/2014/10/19/caching-like-a-pro/"/>
    <updated>2014-10-19T20:02:00+03:00</updated>
    <id>http://go.aopphp.com/blog/2014/10/19/caching-like-a-pro</id>
    <content type="html"><![CDATA[<p>As web applications become more large-scaled, the questions of performance optimization are more frequently considered in initial design. One of the optimization techniques used extensively is caching. Cache contains pre-processed data which is ready to be used without redoing the processing. This article shows the possible ways of doing caching in PHP, including aspect-oriented approach.</p>

<p>Caching is probably the most known technique in computer science, it appears everywhere: CPU, disk cache buffers, opcode cache, memcache, SQL cache, etc. Since it is contained everywhere, we can&rsquo;t extract it into a single place to keep it under our control. So cache invalidation is one of the hardest things. There is a good quote:</p>

<blockquote><p>There are only two hard things in Computer Science: cache invalidation and naming things.</p><footer><strong>Phil Karlton</strong></footer></blockquote>


<p>Let&rsquo;s have a look at caching in the PHP.</p>

<!-- more -->


<h3>Caching process</h3>

<p>Ok, what is caching or cache?</p>

<blockquote><p>In computing, a cache is a component that transparently stores data so that future requests for that data can be served faster. The data that is stored within a cache might be values that have been computed earlier or duplicates of original values that are stored elsewhere. If requested data is contained in the cache (cache hit), this request can be served by simply reading the cache, which is comparatively faster. Otherwise (cache miss), the data has to be recomputed or fetched from its original storage location, which is comparatively slower. Hence, the greater the number of requests that can be served from the cache, the faster the overall system performance becomes.</p><footer><strong>Cache (computing)</strong> <cite><a href='http://en.wikipedia.org/wiki/Cache_(computing)'>en.wikipedia.org/wiki/&hellip;</a></cite></footer></blockquote>


<p>So, caching is a technique to optimize the performance of a system by storing data in a fast storage. There is nothing difficult here: just take data from a slow data source and put it into a faster data source. The faster and bigger the cache is, the more performance gain we can receive. A question for self-test: how many types of cache do you know in PHP?</p>

<h3>Caching. Elementary.</h3>

<p>Imagine that you have a code in a service class that returns information about something:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
</pre></td><td class='code'><pre><code class='php'><span class='line'><span class="k">class</span> <span class="nc">ImportantService</span>
</span><span class='line'><span class="p">{</span>
</span><span class='line'><span class="err">    </span><span class="sd">/**</span>
</span><span class='line'><span class="sd">     * Returns information about object by its unique identifier</span>
</span><span class='line'><span class="sd">     *</span>
</span><span class='line'><span class="sd">     * @return object</span>
</span><span class='line'><span class="sd">     */</span>
</span><span class='line'>    <span class="k">public</span> <span class="k">function</span> <span class="nf">getInformation</span><span class="p">(</span><span class="nv">$uniqueIdentifier</span><span class="p">)</span>
</span><span class='line'>    <span class="p">{</span>
</span><span class='line'>        <span class="k">return</span> <span class="nv">$this</span><span class="o">-&gt;</span><span class="na">dataSource</span><span class="o">-&gt;</span><span class="na">getOne</span><span class="p">(</span><span class="nv">$uniqueIdentifier</span><span class="p">);</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>This service and method is pretty clear, but your boss has just discovered that it takes several seconds to query this information and asks you to fix this. What would you do in order to improve the performance of this method? Of course, the easiest way to do this is to write this data into cache and then just check if there is a record in our cache instead of making hard query to a busy data source server.</p>

<p>At elementary level we can do this easy with memcache extension:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
<span class='line-number'>29</span>
<span class='line-number'>30</span>
</pre></td><td class='code'><pre><code class='php'><span class='line'><span class="k">class</span> <span class="nc">ImportantService</span>
</span><span class='line'><span class="p">{</span>
</span><span class='line'>    <span class="k">private</span> <span class="nv">$cache</span> <span class="o">=</span> <span class="k">null</span><span class="p">;</span>
</span><span class='line'>
</span><span class='line'><span class="err">    </span><span class="sd">/**</span>
</span><span class='line'><span class="sd">     * Default constructor</span>
</span><span class='line'><span class="sd">     */</span>
</span><span class='line'>    <span class="k">public</span> <span class="k">function</span> <span class="nf">__construct</span><span class="p">()</span>
</span><span class='line'>    <span class="p">{</span>
</span><span class='line'>        <span class="nv">$this</span><span class="o">-&gt;</span><span class="na">cache</span> <span class="o">=</span> <span class="nv">$memcache</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">Memcache</span><span class="p">();</span>
</span><span class='line'>        <span class="nv">$memcache</span><span class="o">-&gt;</span><span class="na">addServer</span><span class="p">(</span><span class="s1">&#39;memcache.local&#39;</span><span class="p">);</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>
</span><span class='line'><span class="err">    </span><span class="sd">/**</span>
</span><span class='line'><span class="sd">     * Returns information about object by its unique identifier</span>
</span><span class='line'><span class="sd">     *</span>
</span><span class='line'><span class="sd">     * @return object</span>
</span><span class='line'><span class="sd">     */</span>
</span><span class='line'>    <span class="k">public</span> <span class="k">function</span> <span class="nf">getInformation</span><span class="p">(</span><span class="nv">$uniqueIdentifier</span><span class="p">)</span>
</span><span class='line'>    <span class="p">{</span>
</span><span class='line'>        <span class="nv">$result</span> <span class="o">=</span> <span class="nv">$this</span><span class="o">-&gt;</span><span class="na">cache</span><span class="o">-&gt;</span><span class="na">get</span><span class="p">(</span><span class="nv">$uniqueIdentifier</span><span class="p">);</span>
</span><span class='line'>        <span class="k">if</span> <span class="p">(</span><span class="nv">$result</span> <span class="o">===</span> <span class="k">false</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>            <span class="nv">$result</span> <span class="o">=</span> <span class="nv">$this</span><span class="o">-&gt;</span><span class="na">dataSource</span><span class="o">-&gt;</span><span class="na">getOne</span><span class="p">(</span><span class="nv">$uniqueIdentifier</span><span class="p">);</span>
</span><span class='line'>            <span class="nv">$this</span><span class="o">-&gt;</span><span class="na">cache</span><span class="o">-&gt;</span><span class="na">set</span><span class="p">(</span><span class="nv">$uniqueIdentifier</span><span class="p">,</span> <span class="nv">$result</span><span class="p">);</span>
</span><span class='line'>        <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>        <span class="k">return</span> <span class="nv">$result</span><span class="p">;</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>Now we use cache and store results from original data source for future use. On a subsequent query with unique identifier we can take a result from cache and just return it instead of doing hard query. So this code will work faster and this should make your boss happier. However I should put here a warning for beginners not to write code like this. Be more experienced and write code better!</p>

<h3>Caching. Pre-Intermediate.</h3>

<p>What&rsquo;s wrong with the previous example with caching? Ok, there are two issues in it. Firstly, we don&rsquo;t use a <a href="http://en.wikipedia.org/wiki/Dependency_injection">Dependency Injection (DI)</a> to inject instance of cache and we hard-coded cache initialization in constructor. Secondly, we put logic of caching into the original service. This implementation violates <a href="http://en.wikipedia.org/wiki/Single_responsibility_principle">Single Responsibility Principle (SRP)</a> and can cause a lot of problems with testing, as we won&rsquo;t be able to query the information directly from a data source without caching. We may as well violate another principle - <a href="http://en.wikipedia.org/wiki/Don%27t_repeat_yourself">DRY</a>. This may occur if there are several methods in the class that should be cached, and we write extra lines of code in each method:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
</pre></td><td class='code'><pre><code class='php'><span class='line'><span class="nv">$result</span> <span class="o">=</span> <span class="nv">$this</span><span class="o">-&gt;</span><span class="na">cache</span><span class="o">-&gt;</span><span class="na">get</span><span class="p">(</span><span class="nv">$uniqueIdentifier</span><span class="p">);</span>
</span><span class='line'><span class="k">if</span> <span class="p">(</span><span class="nv">$result</span> <span class="o">===</span> <span class="k">false</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>    <span class="nv">$result</span> <span class="o">=</span> <span class="o">...</span>
</span><span class='line'>    <span class="nv">$this</span><span class="o">-&gt;</span><span class="na">cache</span><span class="o">-&gt;</span><span class="na">set</span><span class="p">(</span><span class="nv">$uniqueIdentifier</span><span class="p">,</span> <span class="nv">$result</span><span class="p">);</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'>
</span><span class='line'><span class="k">return</span> <span class="nv">$result</span><span class="p">;</span>
</span></code></pre></td></tr></table></div></figure>


<p>You can notice that we put the same lines of code everywhere where we need to add caching. This is known as cross-cutting concern. Caching is a typical example of it, and traditional object-oriented paradigm offers only few ways to extract this logic into one place. One of them is proxy pattern: define a class with magic <code>__call()</code> method and wrap an object with caching proxy:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
<span class='line-number'>29</span>
<span class='line-number'>30</span>
<span class='line-number'>31</span>
<span class='line-number'>32</span>
<span class='line-number'>33</span>
</pre></td><td class='code'><pre><code class='php'><span class='line'><span class="k">class</span> <span class="nc">CachingProxy</span>
</span><span class='line'><span class="p">{</span>
</span><span class='line'>    <span class="k">private</span> <span class="nv">$cache</span> <span class="o">=</span> <span class="k">null</span><span class="p">;</span>
</span><span class='line'>    <span class="k">private</span> <span class="nv">$instance</span> <span class="o">=</span> <span class="k">null</span><span class="p">;</span>
</span><span class='line'>
</span><span class='line'>    <span class="k">public</span> <span class="k">function</span> <span class="nf">__construct</span><span class="p">(</span><span class="nx">Memcache</span> <span class="nv">$cache</span><span class="p">,</span> <span class="nv">$instance</span><span class="p">)</span>
</span><span class='line'>    <span class="p">{</span>
</span><span class='line'>        <span class="nv">$this</span><span class="o">-&gt;</span><span class="na">cache</span>    <span class="o">=</span> <span class="nv">$cache</span><span class="p">;</span>
</span><span class='line'>        <span class="nv">$this</span><span class="o">-&gt;</span><span class="na">instance</span> <span class="o">=</span> <span class="nv">$instance</span><span class="p">;</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>    <span class="k">public</span> <span class="k">function</span> <span class="nf">__call</span><span class="p">(</span><span class="nv">$method</span><span class="p">,</span> <span class="nv">$arguments</span><span class="p">)</span>
</span><span class='line'>    <span class="p">{</span>
</span><span class='line'>        <span class="k">if</span> <span class="p">(</span><span class="nx">substr</span><span class="p">(</span><span class="nv">$method</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">3</span><span class="p">)</span> <span class="o">!==</span> <span class="s1">&#39;get&#39;</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>            <span class="nv">$result</span> <span class="o">=</span> <span class="nb">call_user_func_array</span><span class="p">(</span><span class="nv">$method</span><span class="p">,</span> <span class="nv">$arguments</span><span class="p">);</span>
</span><span class='line'>        <span class="p">}</span> <span class="k">else</span> <span class="p">{</span>
</span><span class='line'>            <span class="nv">$uniqueId</span> <span class="o">=</span> <span class="nv">$method</span> <span class="o">.</span> <span class="nb">serialize</span><span class="p">(</span><span class="nv">$arguments</span><span class="p">);</span>
</span><span class='line'>            <span class="nv">$result</span> <span class="o">=</span> <span class="nv">$this</span><span class="o">-&gt;</span><span class="na">cache</span><span class="o">-&gt;</span><span class="na">get</span><span class="p">(</span><span class="nv">$uniqueId</span><span class="p">);</span>
</span><span class='line'>            <span class="k">if</span> <span class="p">(</span><span class="nv">$result</span> <span class="o">===</span> <span class="k">false</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>                <span class="nv">$result</span> <span class="o">=</span> <span class="nb">call_user_func_array</span><span class="p">(</span><span class="nv">$method</span><span class="p">,</span> <span class="nv">$arguments</span><span class="p">);</span>
</span><span class='line'>                <span class="nv">$this</span><span class="o">-&gt;</span><span class="na">cache</span><span class="o">-&gt;</span><span class="na">set</span><span class="p">(</span><span class="nv">$uniqueId</span><span class="p">,</span> <span class="nv">$result</span><span class="p">);</span>
</span><span class='line'>            <span class="p">}</span>
</span><span class='line'>        <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>        <span class="k">return</span> <span class="nv">$result</span><span class="p">;</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'>
</span><span class='line'><span class="nv">$service</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">ImportantService</span><span class="p">();</span>
</span><span class='line'><span class="nv">$cachedService</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">CachingProxy</span><span class="p">(</span><span class="nv">$memcacheInstance</span><span class="p">,</span> <span class="nv">$service</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'><span class="nv">$result</span> <span class="o">=</span> <span class="nv">$cachedService</span><span class="o">-&gt;</span><span class="na">getInformation</span><span class="p">(</span><span class="mi">123</span><span class="p">);</span> <span class="c1">// First call goes to a data source</span>
</span><span class='line'><span class="nv">$more</span>   <span class="o">=</span> <span class="nv">$cachedService</span><span class="o">-&gt;</span><span class="na">getInformation</span><span class="p">(</span><span class="mi">123</span><span class="p">);</span> <span class="c1">// From cache now</span>
</span></code></pre></td></tr></table></div></figure>


<p>Much better now! We extracted the logic of caching into a separate class and can wrap any instance. Our original service still has transparent logic and doesn&rsquo;t need any instance of cache to work. But this solution has another two issues. The first issue is that proxy slows down execution of each method due to magic <code>__call()</code> and slow <code>call_user_func_array()</code> function. The second issue is more serious. Proxy violates inheritance and <a href="http://en.wikipedia.org/wiki/Liskov_substitution_principle">Liskov Substitution Principle (LSP)</a>. This means that we can&rsquo;t pass an instance of proxy everywhere where original class is expected:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
</pre></td><td class='code'><pre><code class='php'><span class='line'><span class="k">function</span> <span class="nf">expectsImportantService</span><span class="p">(</span><span class="nx">ImportantService</span> <span class="nv">$service</span><span class="p">)</span>
</span><span class='line'><span class="p">{</span>
</span><span class='line'>    <span class="k">return</span> <span class="nv">$service</span><span class="o">-&gt;</span><span class="na">getInformation</span><span class="p">(</span><span class="mi">123</span><span class="p">);</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'>
</span><span class='line'><span class="nv">$service</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">ImportantService</span><span class="p">();</span>
</span><span class='line'><span class="nx">expectsImportantService</span><span class="p">(</span><span class="nv">$service</span><span class="p">);</span> <span class="c1">// OK</span>
</span><span class='line'>
</span><span class='line'><span class="nv">$cachedService</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">CachingProxy</span><span class="p">(</span><span class="nv">$memcacheInstance</span><span class="p">,</span> <span class="nv">$service</span><span class="p">);</span>
</span><span class='line'><span class="nx">expectsImportantService</span><span class="p">(</span><span class="nv">$cachedService</span><span class="p">);</span> <span class="c1">// Catchable Fatal Error, expecting instance of ImportantService</span>
</span></code></pre></td></tr></table></div></figure>


<p>This example shows that caching proxy is not a perfect solution because it is violating typehints and decreasing performance of application. However, it can be used to extract logic of caching into a single class and to keep original classes clean.</p>

<h3>Caching. Intermediate.</h3>

<p>At this level developers understand that caching logic should be separated from original code and LSP should be used. This is possible with decorator pattern, when caching class extends an original service class and overwrites methods to introduce an additional logic. Usually, it is done automatically with reflection and code generation.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
<span class='line-number'>29</span>
</pre></td><td class='code'><pre><code class='php'><span class='line'><span class="k">class</span> <span class="nc">CachedImportantService</span> <span class="k">extends</span> <span class="nx">ImportantService</span>
</span><span class='line'><span class="p">{</span>
</span><span class='line'>    <span class="k">private</span> <span class="nv">$cache</span> <span class="o">=</span> <span class="k">null</span><span class="p">;</span>
</span><span class='line'>
</span><span class='line'><span class="err">    </span><span class="sd">/**</span>
</span><span class='line'><span class="sd">     * Default constructor</span>
</span><span class='line'><span class="sd">     */</span>
</span><span class='line'>    <span class="k">public</span> <span class="k">function</span> <span class="nf">__construct</span><span class="p">(</span><span class="nv">$cache</span><span class="p">)</span>
</span><span class='line'>    <span class="p">{</span>
</span><span class='line'>        <span class="nv">$this</span><span class="o">-&gt;</span><span class="na">cache</span> <span class="o">=</span> <span class="nv">$cache</span>
</span><span class='line'>        <span class="k">parent</span><span class="o">::</span><span class="na">__construct</span><span class="p">();</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'>
</span><span class='line'><span class="err">    </span><span class="sd">/**</span>
</span><span class='line'><span class="sd">     * Returns information about object by its unique identifier</span>
</span><span class='line'><span class="sd">     *</span>
</span><span class='line'><span class="sd">     * @return object</span>
</span><span class='line'><span class="sd">     */</span>
</span><span class='line'>    <span class="k">public</span> <span class="k">function</span> <span class="nf">getInformation</span><span class="p">(</span><span class="nv">$uniqueIdentifier</span><span class="p">)</span>
</span><span class='line'>    <span class="p">{</span>
</span><span class='line'>        <span class="nv">$result</span> <span class="o">=</span> <span class="nv">$this</span><span class="o">-&gt;</span><span class="na">cache</span><span class="o">-&gt;</span><span class="na">get</span><span class="p">(</span><span class="nv">$uniqueIdentifier</span><span class="p">);</span>
</span><span class='line'>        <span class="k">if</span> <span class="p">(</span><span class="nv">$result</span> <span class="o">===</span> <span class="k">false</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>            <span class="nv">$result</span> <span class="o">=</span> <span class="k">parent</span><span class="o">::</span><span class="na">getInformation</span><span class="p">(</span><span class="nv">$uniqueIdentifier</span><span class="p">);</span> <span class="c1">// call original parent method</span>
</span><span class='line'>            <span class="nv">$this</span><span class="o">-&gt;</span><span class="na">cache</span><span class="o">-&gt;</span><span class="na">set</span><span class="p">(</span><span class="nv">$uniqueIdentifier</span><span class="p">,</span> <span class="nv">$result</span><span class="p">);</span>
</span><span class='line'>        <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>        <span class="k">return</span> <span class="nv">$result</span><span class="p">;</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>This solution requires a lot of code generation and it&rsquo;s still duplicated, because we need to override each method that should be cached with our implementation. It also requires to rewrite the source code or adjust definition of service to use an extended <code>CachedImportantService</code> instead of the original one. But we can use a framework for this, for example, there is a nice one <a href="https://github.com/Ocramius/ProxyManager">Ocramius/ProxyManager</a>.</p>

<p>Nevertheless, decorators and proxies can&rsquo;t be used for static methods. Imagine that we have <code>ImportantService::staticGetInformation()</code> method which is used somewhere in the source code:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
</pre></td><td class='code'><pre><code class='php'><span class='line'><span class="k">class</span> <span class="nc">ImportantService</span>
</span><span class='line'><span class="p">{</span>
</span><span class='line'><span class="err">    </span><span class="sd">/**</span>
</span><span class='line'><span class="sd">     * Returns information about object by its unique identifier</span>
</span><span class='line'><span class="sd">     *</span>
</span><span class='line'><span class="sd">     * @return object</span>
</span><span class='line'><span class="sd">     */</span>
</span><span class='line'>    <span class="k">public</span> <span class="k">static</span> <span class="k">function</span> <span class="nf">getInformation</span><span class="p">(</span><span class="nv">$uniqueIdentifier</span><span class="p">)</span>
</span><span class='line'>    <span class="p">{</span>
</span><span class='line'>        <span class="k">return</span> <span class="nx">self</span><span class="o">::</span><span class="nv">$dataSource</span><span class="o">-&gt;</span><span class="na">getOne</span><span class="p">(</span><span class="nv">$uniqueIdentifier</span><span class="p">);</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'>
</span><span class='line'><span class="k">function</span> <span class="nf">testStaticMethod</span><span class="p">()</span>
</span><span class='line'><span class="p">{</span>
</span><span class='line'>    <span class="k">return</span> <span class="nx">ImportantService</span><span class="o">::</span><span class="na">getInformation</span><span class="p">(</span><span class="mi">123</span><span class="p">);</span> <span class="c1">// no way to cache it or to replace with decorator/proxy</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>So, even advanced proxies can&rsquo;t help us extract caching logic for static methods into the proxy/decorator. They won&rsquo;t work for final classes either, because a final class can&rsquo;t be extended.</p>

<h3>Caching. Advanced</h3>

<p>In this article we compared all the possible ways to cache a result for method. Each of them has its own advantages and issues, because object-oriented paradigm doesn&rsquo;t have any instruments for solving cross-cutting problems. Is there a way to get rid of them? We want to achieve the following things:</p>

<ul>
<li>extract logic of caching into a single class (like with Proxy pattern)</li>
<li>use Liskov Substitution and Open-Closed Principles</li>
<li>have an ability to cache static methods and methods in a final class.</li>
</ul>


<p>Now you are ready for aspect-oriented paradigm. AOP was designed to solve such cross-cutting issues in an elegant way with advices, aspects and joinpoints. It performs weaving of custom logic into original methods without changing the source code. Caching logic that we extracted for proxy earlier in the article is a typical body of advice in AOP. Our manual check for methods starting with &ldquo;get&rdquo; is a definition of pointcut in AOP terms. With AOP we can implement caching as follows:</p>

<ul>
<li>intercepting execution of static and dynamic methods declared as &ldquo;cacheable&rdquo; in all classes,</li>
<li>adding an extra check for presence of value in the cache before executing the original method,</li>
<li>if there isn&rsquo;t any value in the cache, we invoke an original method and store its result in the cache.</li>
</ul>


<p>My preferred way to declare method as &ldquo;cacheable&rdquo; is to use an annotation.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
</pre></td><td class='code'><pre><code class='php'><span class='line'><span class="k">use</span> <span class="nx">Annotation\Cacheable</span><span class="p">;</span>
</span><span class='line'>
</span><span class='line'><span class="k">class</span> <span class="nc">ImportantService</span>
</span><span class='line'><span class="p">{</span>
</span><span class='line'><span class="err">    </span><span class="sd">/**</span>
</span><span class='line'><span class="sd">     * Returns information about object by its unique identifier</span>
</span><span class='line'><span class="sd">     * @Cacheable</span>
</span><span class='line'><span class="sd">     *</span>
</span><span class='line'><span class="sd">     * @return object</span>
</span><span class='line'><span class="sd">     */</span>
</span><span class='line'>    <span class="k">public</span> <span class="k">function</span> <span class="nf">getInformation</span><span class="p">(</span><span class="nv">$uniqueIdentifier</span><span class="p">)</span>
</span><span class='line'>    <span class="p">{</span>
</span><span class='line'>        <span class="k">return</span> <span class="nv">$this</span><span class="o">-&gt;</span><span class="na">dataSource</span><span class="o">-&gt;</span><span class="na">getOne</span><span class="p">(</span><span class="nv">$uniqueIdentifier</span><span class="p">);</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>Then we just need to define an aspect for caching, that will intercept all methods with <code>Cacheable</code> annotation:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
<span class='line-number'>29</span>
<span class='line-number'>30</span>
<span class='line-number'>31</span>
<span class='line-number'>32</span>
<span class='line-number'>33</span>
<span class='line-number'>34</span>
<span class='line-number'>35</span>
<span class='line-number'>36</span>
<span class='line-number'>37</span>
<span class='line-number'>38</span>
<span class='line-number'>39</span>
<span class='line-number'>40</span>
<span class='line-number'>41</span>
</pre></td><td class='code'><pre><code class='php'><span class='line'><span class="k">use</span> <span class="nx">Go\Aop\Aspect</span><span class="p">;</span>
</span><span class='line'><span class="k">use</span> <span class="nx">Go\Aop\Intercept\MethodInvocation</span><span class="p">;</span>
</span><span class='line'><span class="k">use</span> <span class="nx">Go\Lang\Annotation\Around</span><span class="p">;</span>
</span><span class='line'>
</span><span class='line'><span class="sd">/**</span>
</span><span class='line'><span class="sd"> * Caching aspect</span>
</span><span class='line'><span class="sd"> */</span>
</span><span class='line'><span class="k">class</span> <span class="nc">CachingAspect</span> <span class="k">implements</span> <span class="nx">Aspect</span>
</span><span class='line'><span class="p">{</span>
</span><span class='line'>    <span class="k">private</span> <span class="nv">$cache</span> <span class="o">=</span> <span class="k">null</span><span class="p">;</span>
</span><span class='line'>
</span><span class='line'>    <span class="k">public</span> <span class="k">function</span> <span class="nf">__construct</span><span class="p">(</span><span class="nx">Memcache</span> <span class="nv">$cache</span><span class="p">)</span>
</span><span class='line'>    <span class="p">{</span>
</span><span class='line'>        <span class="nv">$this</span><span class="o">-&gt;</span><span class="na">cache</span> <span class="o">=</span> <span class="nv">$cache</span><span class="p">;</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>    <span class="sd">/**</span>
</span><span class='line'><span class="sd">     * This advice intercepts the execution of cacheable methods</span>
</span><span class='line'><span class="sd">     *</span>
</span><span class='line'><span class="sd">     * The logic is pretty simple: we look for the value in the cache and if we have a cache miss</span>
</span><span class='line'><span class="sd">     * we then invoke original method and store its result in the cache.</span>
</span><span class='line'><span class="sd">     *</span>
</span><span class='line'><span class="sd">     * @param MethodInvocation $invocation Invocation</span>
</span><span class='line'><span class="sd">     *</span>
</span><span class='line'><span class="sd">     * @Around(&quot;@annotation(Annotation\Cacheable)&quot;)</span>
</span><span class='line'><span class="sd">     */</span>
</span><span class='line'>    <span class="k">public</span> <span class="k">function</span> <span class="nf">aroundCacheable</span><span class="p">(</span><span class="nx">MethodInvocation</span> <span class="nv">$invocation</span><span class="p">)</span>
</span><span class='line'>    <span class="p">{</span>
</span><span class='line'>        <span class="nv">$obj</span>   <span class="o">=</span> <span class="nv">$invocation</span><span class="o">-&gt;</span><span class="na">getThis</span><span class="p">();</span>
</span><span class='line'>        <span class="nv">$class</span> <span class="o">=</span> <span class="nb">is_object</span><span class="p">(</span><span class="nv">$obj</span><span class="p">)</span> <span class="o">?</span> <span class="nb">get_class</span><span class="p">(</span><span class="nv">$obj</span><span class="p">)</span> <span class="o">:</span> <span class="nv">$obj</span><span class="p">;</span>
</span><span class='line'>        <span class="nv">$key</span>   <span class="o">=</span> <span class="nv">$class</span> <span class="o">.</span> <span class="s1">&#39;:&#39;</span> <span class="o">.</span> <span class="nv">$invocation</span><span class="o">-&gt;</span><span class="na">getMethod</span><span class="p">()</span><span class="o">-&gt;</span><span class="na">name</span><span class="p">;</span>
</span><span class='line'>
</span><span class='line'>        <span class="nv">$result</span> <span class="o">=</span> <span class="nv">$this</span><span class="o">-&gt;</span><span class="na">cache</span><span class="o">-&gt;</span><span class="na">get</span><span class="p">(</span><span class="nv">$key</span><span class="p">);</span>
</span><span class='line'>        <span class="k">if</span> <span class="p">(</span><span class="nv">$result</span> <span class="o">===</span> <span class="k">false</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>            <span class="nv">$result</span> <span class="o">=</span> <span class="nv">$invocation</span><span class="o">-&gt;</span><span class="na">proceed</span><span class="p">();</span>
</span><span class='line'>            <span class="nv">$this</span><span class="o">-&gt;</span><span class="na">cache</span><span class="o">-&gt;</span><span class="na">set</span><span class="p">(</span><span class="nv">$key</span><span class="p">,</span> <span class="nv">$result</span><span class="p">);</span>
</span><span class='line'>        <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>        <span class="k">return</span> <span class="nv">$result</span><span class="p">;</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>This aspect then will be registered in the AOP kernel. AOP engine will analyze each loaded class during autoloading and if a method matches the <code>@Around("@annotation(Annotation\Cacheable)")</code> pointcut then AOP will change it on the fly to include a custom logic of invoking an advice. Class name will be preserved, so AOP can easily cache static methods and even methods in final classes.</p>

<p>AOP allows us to extract caching logic into a single method (called &lsquo;advice&rsquo;), it works like a decorator, so we don&rsquo;t slow down methods that are not cached (compared with proxy pattern), moreover, it doesn&rsquo;t repeat the code several times (DRY) and it&rsquo;s an awesome result.</p>

<p>Many developers have doubts about AOP, annotations and pointcut matching ) It&rsquo;s a typical question, so I want to make some clarifications. First of all, pointcut matching is performed only once, there won&rsquo;t be any extra checks during a normal execution of an application. Modified classes are stored in the cache and are friendly for opcode cachers, this means that the performance will be good. Annotations are parsed only once during pointcut matching and are also cached (in case you want to read some values from an annotation inside an advice). Bootstrap time for framework is about 20ms, this should be fast enough for your typical applications.</p>

<p>Assuming that we use AOP for caching of methods which can take several hundreds ms or even up to several seconds to complete, AOP overhead is minimal (20ms bootstrap and several ms for calling an advice). This approach gives a new instrument for developers, it can solve annoying cross-cutting concerns, like caching with simple aspect. Use it! Enjoy It!</p>

<p>PS. There is a demo site on Heroku with caching example: <a href="http://demo.aopphp.com/?showcase=cacheable">http://demo.aopphp.com/?showcase=cacheable</a> You can try it with enabled/disabled AOP (blue button at top).</p>

<p>PSS. If you&rsquo;re looking for a way to use AOP caching with Laravel, visit an article (Spain): <a href="http://blog.carlosgoce.com/realizando-cache-con-aop-en-laravel-4/">http://blog.carlosgoce.com/realizando-cache-con-aop-en-laravel-4/</a></p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[What is new in version 0.5.0]]></title>
    <link href="http://go.aopphp.com/blog/2014/05/24/what-is-new-in-version-0-dot-5-dot-0/"/>
    <updated>2014-05-24T21:26:00+03:00</updated>
    <id>http://go.aopphp.com/blog/2014/05/24/what-is-new-in-version-0-dot-5-dot-0</id>
    <content type="html"><![CDATA[<p>New versions of frameworks are always exciting because they provide more features and can contain important fixes and changes. Go! AOP evolves too, so I prepared this article for users to underline most important changes.</p>

<!-- more -->


<p></p>

<h3>Support for custom streams and read-only file systems</h3>

<p><a href="https://github.com/lisachenko/go-aop-php/pull/118">lisachenko/go-aop-php#118</a></p>

<p>This feature is one of the most interesting, because it allows to use framework with any stream filters and wrappers, for example with phar archives. It is possible to generate an AOP cache and put it into the phar archive as a standalone read-only application. Possible usages of aspects in the phar archives are logging, dry-run control and much more. Do you bored with implementation of dry-run option for each command? Just give a try for AOP and define an aspect for that!</p>

<h3>Direct advisors</h3>

<p><a href="https://github.com/lisachenko/go-aop-php/pull/142">lisachenko/go-aop-php#142</a></p>

<p>I received a lot of complains about usage of annotations for defining advices instead of pure PHP code. So I decided to give an alternative way for defining advisors with closures:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
</pre></td><td class='code'><pre><code class='php'><span class='line'><span class="k">protected</span> <span class="k">function</span> <span class="nf">configureAop</span><span class="p">(</span><span class="nx">AspectContainer</span> <span class="nv">$container</span><span class="p">)</span>
</span><span class='line'><span class="p">{</span>
</span><span class='line'>    <span class="nv">$container</span><span class="o">-&gt;</span><span class="na">registerAdvisor</span><span class="p">(</span>
</span><span class='line'>        <span class="k">new</span> <span class="nx">DefaultPointcutAdvisor</span><span class="p">(</span>
</span><span class='line'>            <span class="k">new</span> <span class="nx">TrueMethodPointcut</span><span class="p">(),</span>
</span><span class='line'>            <span class="k">new</span> <span class="nx">MethodBeforeInterceptor</span><span class="p">(</span><span class="k">function</span> <span class="p">(</span><span class="nx">MethodInvocation</span> <span class="nv">$invocation</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>                <span class="k">echo</span> <span class="s2">&quot;Hello&quot;</span><span class="p">,</span> <span class="nv">$invocation</span><span class="o">-&gt;</span><span class="na">getMethod</span><span class="p">()</span><span class="o">-&gt;</span><span class="na">name</span><span class="p">;</span>
</span><span class='line'>            <span class="p">})</span>
</span><span class='line'>        <span class="p">),</span>
</span><span class='line'>        <span class="s1">&#39;test&#39;</span>
</span><span class='line'>    <span class="p">);</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>This patch also optimizes injection of advices (interceptors) into the concrete class, so no more slow <code>serialize()/unserialize()</code> functions, they were replaced by <code>var_export()</code> and direct injection. I&rsquo;m also thinking about DSL builders for defining pointcuts in a more natural way:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
</pre></td><td class='code'><pre><code class='php'><span class='line'><span class="k">protected</span> <span class="k">function</span> <span class="nf">configureAop</span><span class="p">(</span><span class="nx">AspectContainer</span> <span class="nv">$container</span><span class="p">)</span>
</span><span class='line'><span class="p">{</span>
</span><span class='line'>    <span class="nv">$builder</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">PointcutBuilder</span><span class="p">(</span><span class="nv">$container</span><span class="p">);</span>
</span><span class='line'>    <span class="nv">$builder</span><span class="o">-&gt;</span><span class="na">before</span><span class="p">(</span><span class="s1">&#39;execution(public **-&gt;get(*)&#39;</span><span class="p">)</span><span class="o">-&gt;</span><span class="na">do</span><span class="p">(</span><span class="k">function</span> <span class="p">(</span><span class="nx">MethodInvocation</span> <span class="nv">$invocation</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>        <span class="k">echo</span> <span class="s2">&quot;Hello&quot;</span><span class="p">,</span> <span class="nv">$invocation</span><span class="o">-&gt;</span><span class="na">getMethod</span><span class="p">()</span><span class="o">-&gt;</span><span class="na">name</span><span class="p">;</span>
</span><span class='line'>    <span class="p">});</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>But this is not included into the current version, please ping me on github if your want it for the next version.</p>

<h3>Annotation class filter</h3>

<p><a href="https://github.com/lisachenko/go-aop-php/pull/129">lisachenko/go-aop-php#128</a></p>

<p>PhpDeal Desing by Contract frameworks requires matching of classes based on presence of annotation in the class docblock. This functionality was missed in the framework. Now it&rsquo;s possible to use special <code>@within(AnnotationClassName)</code> syntax to match classes that have <code>AnnotationClassName</code> annotation.</p>

<p>Here is an example of pointcut that intercepts execution of all public methods in the class marked with <code>Invariant</code> annotation:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
</pre></td><td class='code'><pre><code class='php'><span class='line'>    <span class="sd">/**</span>
</span><span class='line'><span class="sd">     * Verifies invariants for contract class</span>
</span><span class='line'><span class="sd">     *</span>
</span><span class='line'><span class="sd">     * @Around(&quot;@within(PhpDeal\Annotation\Invariant) &amp;&amp; execution(public **-&gt;*(*))&quot;)</span>
</span><span class='line'><span class="sd">     * @param MethodInvocation $invocation</span>
</span><span class='line'><span class="sd">     *</span>
</span><span class='line'><span class="sd">     * @throws ContractViolation</span>
</span><span class='line'><span class="sd">     * @return mixed</span>
</span><span class='line'><span class="sd">     */</span>
</span><span class='line'>    <span class="k">public</span> <span class="k">function</span> <span class="nf">invariantContract</span><span class="p">(</span><span class="nx">MethodInvocation</span> <span class="nv">$invocation</span><span class="p">)</span> <span class="p">{</span><span class="o">...</span><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<h3>Access to a doctrine annotations from the MethodInvocation class</h3>

<p><a href="https://github.com/lisachenko/go-aop-php/issues/66">lisachenko/go-aop-php#66</a></p>

<p>Some aspects can analyze annotation to perform additional steps. Consider the following class where we define a ttl in the annotation for a method:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
</pre></td><td class='code'><pre><code class='php'><span class='line'><span class="k">use</span> <span class="nx">Demo\Annotation\Cacheable</span><span class="p">;</span>
</span><span class='line'>
</span><span class='line'><span class="k">class</span> <span class="nc">General</span>
</span><span class='line'><span class="p">{</span>
</span><span class='line'>    <span class="sd">/**</span>
</span><span class='line'><span class="sd">     * Test cacheable by annotation</span>
</span><span class='line'><span class="sd">     *</span>
</span><span class='line'><span class="sd">     * @Cacheable(time=10)</span>
</span><span class='line'><span class="sd">     * @param float $timeToSleep Amount of time to sleep</span>
</span><span class='line'><span class="sd">     *</span>
</span><span class='line'><span class="sd">     * @return string</span>
</span><span class='line'><span class="sd">     */</span>
</span><span class='line'>    <span class="k">public</span> <span class="k">function</span> <span class="nf">cacheMe</span><span class="p">(</span><span class="nv">$timeToSleep</span><span class="p">)</span>
</span><span class='line'>    <span class="p">{</span>
</span><span class='line'>        <span class="nb">usleep</span><span class="p">(</span><span class="nv">$timeToSleep</span> <span class="o">*</span> <span class="mf">1e6</span><span class="p">);</span>
</span><span class='line'>        <span class="k">return</span> <span class="s1">&#39;Yeah&#39;</span><span class="p">;</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>We can easily define a pointcut and advice that will intercept the execution of methods marked with <code>Cacheable</code> annotation and cache their results in the cache for a specified time. Should be cool, isn&rsquo;t it? Let&rsquo;s do this:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
</pre></td><td class='code'><pre><code class='php'><span class='line'><span class="k">use</span> <span class="nx">Demo\Annotation\Cacheable</span><span class="p">;</span>
</span><span class='line'><span class="k">use</span> <span class="nx">Go\Aop\Aspect</span><span class="p">;</span>
</span><span class='line'><span class="k">use</span> <span class="nx">Go\Aop\Intercept\MethodInvocation</span><span class="p">;</span>
</span><span class='line'><span class="k">use</span> <span class="nx">Go\Lang\Annotation\Around</span><span class="p">;</span>
</span><span class='line'>
</span><span class='line'><span class="k">class</span> <span class="nc">CacheAspect</span> <span class="k">implements</span> <span class="nx">Aspect</span>
</span><span class='line'><span class="p">{</span>
</span><span class='line'>    <span class="sd">/**</span>
</span><span class='line'><span class="sd">     * Cacheable methods</span>
</span><span class='line'><span class="sd">     *</span>
</span><span class='line'><span class="sd">     * @param MethodInvocation $invocation Invocation</span>
</span><span class='line'><span class="sd">     *</span>
</span><span class='line'><span class="sd">     * @Around(&quot;@annotation(Demo\Annotation\Cacheable)&quot;)</span>
</span><span class='line'><span class="sd">     */</span>
</span><span class='line'>    <span class="k">public</span> <span class="k">function</span> <span class="nf">aroundCacheable</span><span class="p">(</span><span class="nx">MethodInvocation</span> <span class="nv">$invocation</span><span class="p">)</span>
</span><span class='line'>    <span class="p">{</span>
</span><span class='line'>        <span class="sd">/** @var Cacheable $cacheable */</span>
</span><span class='line'>        <span class="nv">$cacheable</span> <span class="o">=</span> <span class="nv">$invocation</span><span class="o">-&gt;</span><span class="na">getMethod</span><span class="p">()</span><span class="o">-&gt;</span><span class="na">getAnnotation</span><span class="p">(</span><span class="nx">Cacheable</span><span class="o">::</span><span class="na">class</span><span class="p">);</span>
</span><span class='line'>        <span class="k">echo</span> <span class="nv">$cacheable</span><span class="o">-&gt;</span><span class="na">time</span><span class="p">;</span> <span class="c1">// TTL for the cache</span>
</span><span class='line'>        <span class="k">return</span> <span class="nv">$invocation</span><span class="o">-&gt;</span><span class="na">proceed</span><span class="p">();</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<h3>Simplified pointcut syntax for methods in the same class</h3>

<p><a href="https://github.com/lisachenko/go-aop-php/issues/113">lisachenko/go-aop-php#113</a></p>

<p>Instead of complex pointcut like this:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
</pre></td><td class='code'><pre><code class='php'><span class='line'><span class="nx">execution</span><span class="p">(</span><span class="k">public</span> <span class="o">**</span><span class="nx">\</span><span class="o">*</span><span class="nx">Controller</span><span class="o">-&gt;</span><span class="na">create</span><span class="p">(</span><span class="o">*</span><span class="p">)</span> <span class="p">)</span>
</span><span class='line'><span class="o">||</span> <span class="nx">execution</span><span class="p">(</span><span class="k">public</span> <span class="o">**</span><span class="nx">\</span><span class="o">*</span><span class="nx">Controller</span><span class="o">-&gt;</span><span class="na">get</span><span class="p">(</span><span class="o">*</span><span class="p">)</span> <span class="p">)</span>
</span><span class='line'><span class="o">||</span> <span class="nx">execution</span><span class="p">(</span><span class="k">public</span> <span class="o">**</span><span class="nx">\</span><span class="o">*</span><span class="nx">Controller</span><span class="o">-&gt;</span><span class="na">update</span><span class="p">(</span><span class="o">*</span><span class="p">)</span> <span class="p">)</span>
</span><span class='line'><span class="o">||</span> <span class="nx">execution</span><span class="p">(</span><span class="k">public</span> <span class="o">**</span><span class="nx">\</span><span class="o">*</span><span class="nx">Controller</span><span class="o">-&gt;</span><span class="na">delete</span><span class="p">(</span><span class="o">*</span><span class="p">)</span> <span class="p">)</span>
</span></code></pre></td></tr></table></div></figure>


<p>it is possible to use or&#8217;ed constructions with <code>|</code> sign:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='php'><span class='line'><span class="nx">execution</span><span class="p">(</span><span class="k">public</span> <span class="o">**</span><span class="nx">\</span><span class="o">*</span><span class="nx">Controller</span><span class="o">-&gt;</span><span class="na">create</span><span class="o">|</span><span class="nx">get</span><span class="o">|</span><span class="nx">update</span><span class="o">|</span><span class="nx">delete</span><span class="p">(</span><span class="o">*</span><span class="p">))</span>
</span></code></pre></td></tr></table></div></figure>


<p>Much cleaner and more readable!</p>

<h3>Inheritance analysis during load-time</h3>

<p><a href="https://github.com/lisachenko/go-aop-php/issues/131">lisachenko/go-aop-php#131</a></p>

<p>It is not a secret, that framework performs load-time weaving of aspects during loading the source file into PHP. Before PHP will be able to parse it and load, Go! AOP scans tokens and builds reflection to analyze a pointcuts. At that moment of class loading there is no information about full inheritance of class (interfaces, abstract classes, traits). This was known limitation of framework that it wasn&rsquo;t possible to match parent methods in the children class:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
</pre></td><td class='code'><pre><code class='php'><span class='line'><span class="k">class</span> <span class="nc">Greeting</span>
</span><span class='line'><span class="p">{</span>
</span><span class='line'>    <span class="k">public</span> <span class="nx">hello</span><span class="p">(</span><span class="nv">$name</span><span class="p">)</span>
</span><span class='line'>    <span class="p">{</span>
</span><span class='line'>        <span class="k">echo</span> <span class="s2">&quot;hello </span><span class="si">$name</span><span class="s2">&quot;</span><span class="p">;</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'>
</span><span class='line'><span class="k">class</span> <span class="nc">Example</span> <span class="k">extends</span> <span class="nx">Greeting</span>
</span><span class='line'><span class="p">{</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'>
</span><span class='line'><span class="c1">// pointcut is @Before(&quot;execution(public Example-&gt;*(*))&quot;)</span>
</span><span class='line'>
</span><span class='line'><span class="nv">$e</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">Example</span><span class="p">();</span>
</span><span class='line'><span class="nv">$e</span><span class="o">-&gt;</span><span class="na">hello</span><span class="p">(</span><span class="s2">&quot;User&quot;</span><span class="p">);</span> <span class="c1">// advice is not applied, because method is defined in the Greeting class</span>
</span></code></pre></td></tr></table></div></figure>


<p>After some research I found a way to recursively load parent classes and scan tokens. This is the major change for a dessert, but it can have an impact on the current aspects that uses <code>within</code> or similar pointcuts.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Aspect-Oriented programming with Yii]]></title>
    <link href="http://go.aopphp.com/blog/2013/09/28/aspect-oriented-programming-with-yii/"/>
    <updated>2013-09-28T16:28:00+03:00</updated>
    <id>http://go.aopphp.com/blog/2013/09/28/aspect-oriented-programming-with-yii</id>
    <content type="html"><![CDATA[<p>Aspect-Oriented programming becomes more popular for PHP, but it requires good knowledge of OOP and can be very cumbersome for beginners. So it&rsquo;s important to have a working examples and manuals to have a possibility to run it locally with favorite framework. Go! AOP provides all the necessary functionality for configuration of AOP into any frameworks, but integration process can be very tricky, so configuration is not so easy. In this article we will configure a working example for Yii framework.</p>

<!-- more -->


<p>Let&rsquo;s start! First of all, we need an empty <code>yii-aspect</code> directory for our project:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='bash'><span class='line'>mkdir yii-aspect <span class="o">&amp;&amp;</span> <span class="nb">cd </span>yii-aspect
</span></code></pre></td></tr></table></div></figure>


<p>Next step is to install dependencies: Yii and Go! AOP frameworks. Go! AOP is registered on packagist and can be easily installed with composer:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='bash'><span class='line'>composer require lisachenko/go-aop-php:0.4.*
</span></code></pre></td></tr></table></div></figure>


<p>Latest version of Yii framework (1.1.14) is on <a href="https://packagist.org/packages/yiisoft/yii">packagist</a> too! This means that we can install it without any hacks with local repositories:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='bash'><span class='line'>composer require yiisoft/yii:1.1.*
</span></code></pre></td></tr></table></div></figure>


<p>This is a minimum list of dependencies for our first example. Following step is very easy, thanks to the <code>yiic</code> console command. By default, all binaries are installed into <code>./vendor/bin</code> folder, so <code>yiic</code> console should be there too.</p>

<p>Let&rsquo;s create a web application:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='bash'><span class='line'>yiic webapp app
</span></code></pre></td></tr></table></div></figure>


<p>Yii will generate a directory <code>app</code> with default project structure and files. This project can be opened in the browser, but AOP isn&rsquo;t enabled right now. To enable AOP we should prepare our application to have an ability to use it. To enable AOP we need to update the front controller of our application (<code>./app/index.php</code>) in the following way:</p>

<p>Add this lines to the top of file before original content:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
</pre></td><td class='code'><pre><code class='php'><span class='line'><span class="o">&lt;?</span><span class="nx">php</span>
</span><span class='line'><span class="k">use</span> <span class="nx">Go\Instrument\Transformer\FilterInjectorTransformer</span><span class="p">;</span>
</span><span class='line'>
</span><span class='line'><span class="c1">// Load the composer autoloader</span>
</span><span class='line'><span class="k">include</span> <span class="nx">__DIR__</span> <span class="o">.</span> <span class="s1">&#39;/../vendor/autoload.php&#39;</span><span class="p">;</span>
</span><span class='line'>
</span><span class='line'><span class="c1">// Load AOP kernel</span>
</span><span class='line'><span class="k">include</span> <span class="nx">__DIR__</span> <span class="o">.</span> <span class="s1">&#39;/aspect.php&#39;</span><span class="p">;</span>
</span></code></pre></td></tr></table></div></figure>


<p>And replace initialization of Yii at the bottom of file from <code>require_once($yii)</code> to <code>require_once(FilterInjectorTransformer::rewrite($yii))</code>. This is needed to give a hook for the Go! AOP framework to weave aspects into classes. Aspects are defined as separated classes and included in the <code>./aspect.php</code> file. Let&rsquo;s move to it and to the aspect kernel</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
</pre></td><td class='code'><pre><code class='php'><span class='line'><span class="k">include</span> <span class="nx">__DIR__</span> <span class="o">.</span> <span class="s1">&#39;/protected/extensions/go-aop-php/ApplicationAspectKernel.php&#39;</span><span class="p">;</span>
</span><span class='line'>
</span><span class='line'><span class="c1">// Prevent an error about nesting level</span>
</span><span class='line'><span class="nb">ini_set</span><span class="p">(</span><span class="s1">&#39;xdebug.max_nesting_level&#39;</span><span class="p">,</span> <span class="mi">500</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'><span class="c1">// Initialize an application aspect container</span>
</span><span class='line'><span class="nv">$applicationAspectKernel</span> <span class="o">=</span> <span class="nx">ApplicationAspectKernel</span><span class="o">::</span><span class="na">getInstance</span><span class="p">();</span>
</span><span class='line'><span class="nv">$applicationAspectKernel</span><span class="o">-&gt;</span><span class="na">init</span><span class="p">(</span><span class="k">array</span><span class="p">(</span>
</span><span class='line'>    <span class="s1">&#39;debug&#39;</span> <span class="o">=&gt;</span> <span class="k">true</span><span class="p">,</span>
</span><span class='line'>    <span class="c1">// Application root directory</span>
</span><span class='line'>    <span class="s1">&#39;appDir&#39;</span>   <span class="o">=&gt;</span> <span class="nx">__DIR__</span> <span class="o">.</span> <span class="s1">&#39;/../&#39;</span><span class="p">,</span>
</span><span class='line'>    <span class="c1">// Cache directory</span>
</span><span class='line'>    <span class="s1">&#39;cacheDir&#39;</span> <span class="o">=&gt;</span> <span class="nx">__DIR__</span> <span class="o">.</span> <span class="s1">&#39;./protected/aspect&#39;</span><span class="p">,</span>
</span><span class='line'>    <span class="s1">&#39;excludePaths&#39;</span> <span class="o">=&gt;</span> <span class="k">array</span><span class="p">(</span>
</span><span class='line'>        <span class="nx">__DIR__</span> <span class="o">.</span> <span class="s1">&#39;./protected/aspect&#39;</span>
</span><span class='line'>    <span class="p">)</span>
</span><span class='line'><span class="p">));</span>
</span></code></pre></td></tr></table></div></figure>


<p>This is typical configuration of Go! AOP framework where we can adjust some directories and paths. I think that this config is pretty clear to understand. Only <code>debug</code> parameter is really important. For production mode it should be <code>false</code>, but for development mode it should be enabled to enable better debugging and cache refreshing.</p>

<p>In this file we also include a strange file <code>ApplicationAspectKernel.php</code>. This file contains definition of aspect kernel for our application and it&rsquo;s very simple:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
</pre></td><td class='code'><pre><code class='php'><span class='line'><span class="k">use</span> <span class="nx">Go\Core\AspectKernel</span><span class="p">;</span>
</span><span class='line'><span class="k">use</span> <span class="nx">Go\Core\AspectContainer</span><span class="p">;</span>
</span><span class='line'>
</span><span class='line'><span class="sd">/**</span>
</span><span class='line'><span class="sd"> * Application Aspect Kernel</span>
</span><span class='line'><span class="sd"> */</span>
</span><span class='line'><span class="k">class</span> <span class="nc">ApplicationAspectKernel</span> <span class="k">extends</span> <span class="nx">AspectKernel</span>
</span><span class='line'><span class="p">{</span>
</span><span class='line'>
</span><span class='line'>    <span class="sd">/**</span>
</span><span class='line'><span class="sd">     * Configure an AspectContainer with advisors, aspects and pointcuts</span>
</span><span class='line'><span class="sd">     *</span>
</span><span class='line'><span class="sd">     * @param AspectContainer $container</span>
</span><span class='line'><span class="sd">     *</span>
</span><span class='line'><span class="sd">     * @return void</span>
</span><span class='line'><span class="sd">     */</span>
</span><span class='line'>    <span class="k">protected</span> <span class="k">function</span> <span class="nf">configureAop</span><span class="p">(</span><span class="nx">AspectContainer</span> <span class="nv">$container</span><span class="p">)</span>
</span><span class='line'>    <span class="p">{</span>
</span><span class='line'>        <span class="c1">// todo: register aspects, advisors, pointcuts, etc</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>There is only one method to define: <code>configureAop</code> that is used for AOP configuration. We can create an aspect now and register it in the kernel:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
<span class='line-number'>29</span>
<span class='line-number'>30</span>
<span class='line-number'>31</span>
<span class='line-number'>32</span>
<span class='line-number'>33</span>
<span class='line-number'>34</span>
<span class='line-number'>35</span>
<span class='line-number'>36</span>
<span class='line-number'>37</span>
<span class='line-number'>38</span>
</pre></td><td class='code'><pre><code class='php'><span class='line'><span class="o">&lt;?</span><span class="nx">php</span>
</span><span class='line'><span class="c1">// app/protected/extensions/go-aop-php/TestMonitorAspect.php</span>
</span><span class='line'>
</span><span class='line'><span class="k">namespace</span> <span class="nx">Aspect</span><span class="p">;</span>
</span><span class='line'>
</span><span class='line'><span class="k">use</span> <span class="nx">Go\Aop\Aspect</span><span class="p">;</span>
</span><span class='line'><span class="k">use</span> <span class="nx">Go\Aop\Intercept\FieldAccess</span><span class="p">;</span>
</span><span class='line'><span class="k">use</span> <span class="nx">Go\Aop\Intercept\MethodInvocation</span><span class="p">;</span>
</span><span class='line'><span class="k">use</span> <span class="nx">Go\Lang\Annotation\After</span><span class="p">;</span>
</span><span class='line'><span class="k">use</span> <span class="nx">Go\Lang\Annotation\Before</span><span class="p">;</span>
</span><span class='line'><span class="k">use</span> <span class="nx">Go\Lang\Annotation\Around</span><span class="p">;</span>
</span><span class='line'><span class="k">use</span> <span class="nx">Go\Lang\Annotation\Pointcut</span><span class="p">;</span>
</span><span class='line'>
</span><span class='line'><span class="sd">/**</span>
</span><span class='line'><span class="sd"> * Monitor aspect</span>
</span><span class='line'><span class="sd"> */</span>
</span><span class='line'><span class="k">class</span> <span class="nc">TestMonitorAspect</span> <span class="k">implements</span> <span class="nx">Aspect</span>
</span><span class='line'><span class="p">{</span>
</span><span class='line'>
</span><span class='line'>    <span class="sd">/**</span>
</span><span class='line'><span class="sd">     * Method that will be called before real method</span>
</span><span class='line'><span class="sd">     *</span>
</span><span class='line'><span class="sd">     * @param MethodInvocation $invocation Invocation</span>
</span><span class='line'><span class="sd">     * @Before(&quot;within(**)&quot;)</span>
</span><span class='line'><span class="sd">     */</span>
</span><span class='line'>    <span class="k">public</span> <span class="k">function</span> <span class="nf">beforeMethodExecution</span><span class="p">(</span><span class="nx">MethodInvocation</span> <span class="nv">$invocation</span><span class="p">)</span>
</span><span class='line'>    <span class="p">{</span>
</span><span class='line'>        <span class="nv">$obj</span> <span class="o">=</span> <span class="nv">$invocation</span><span class="o">-&gt;</span><span class="na">getThis</span><span class="p">();</span>
</span><span class='line'>        <span class="k">echo</span> <span class="s1">&#39;Calling Before Interceptor for method: &#39;</span><span class="p">,</span>
</span><span class='line'>        <span class="nb">is_object</span><span class="p">(</span><span class="nv">$obj</span><span class="p">)</span> <span class="o">?</span> <span class="nb">get_class</span><span class="p">(</span><span class="nv">$obj</span><span class="p">)</span> <span class="o">:</span> <span class="nv">$obj</span><span class="p">,</span>
</span><span class='line'>        <span class="nv">$invocation</span><span class="o">-&gt;</span><span class="na">getMethod</span><span class="p">()</span><span class="o">-&gt;</span><span class="na">isStatic</span><span class="p">()</span> <span class="o">?</span> <span class="s1">&#39;::&#39;</span> <span class="o">:</span> <span class="s1">&#39;-&gt;&#39;</span><span class="p">,</span>
</span><span class='line'>        <span class="nv">$invocation</span><span class="o">-&gt;</span><span class="na">getMethod</span><span class="p">()</span><span class="o">-&gt;</span><span class="na">getName</span><span class="p">(),</span>
</span><span class='line'>        <span class="s1">&#39;()&#39;</span><span class="p">,</span>
</span><span class='line'>        <span class="s1">&#39; with arguments: &#39;</span><span class="p">,</span>
</span><span class='line'>        <span class="nb">json_encode</span><span class="p">(</span><span class="nv">$invocation</span><span class="o">-&gt;</span><span class="na">getArguments</span><span class="p">()),</span>
</span><span class='line'>        <span class="s2">&quot;&lt;br&gt;</span><span class="se">\n</span><span class="s2">&quot;</span><span class="p">;</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>&hellip; and registration in the kernel:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
</pre></td><td class='code'><pre><code class='php'><span class='line'><span class="o">&lt;?</span><span class="nx">php</span>
</span><span class='line'><span class="c1">// app/protected/extensions/go-aop-php/ApplicationAspectKernel.php</span>
</span><span class='line'>
</span><span class='line'><span class="k">require_once</span> <span class="s1">&#39;TestMonitorAspect.php&#39;</span><span class="p">;</span>
</span><span class='line'>
</span><span class='line'><span class="k">use</span> <span class="nx">Aspect\TestMonitorAspect</span><span class="p">;</span>
</span><span class='line'><span class="k">use</span> <span class="nx">Go\Core\AspectKernel</span><span class="p">;</span>
</span><span class='line'><span class="k">use</span> <span class="nx">Go\Core\AspectContainer</span><span class="p">;</span>
</span><span class='line'>
</span><span class='line'><span class="sd">/**</span>
</span><span class='line'><span class="sd"> * Application Aspect Kernel</span>
</span><span class='line'><span class="sd"> */</span>
</span><span class='line'><span class="k">class</span> <span class="nc">ApplicationAspectKernel</span> <span class="k">extends</span> <span class="nx">AspectKernel</span>
</span><span class='line'><span class="p">{</span>
</span><span class='line'>
</span><span class='line'>    <span class="sd">/**</span>
</span><span class='line'><span class="sd">     * Configure an AspectContainer with advisors, aspects and pointcuts</span>
</span><span class='line'><span class="sd">     *</span>
</span><span class='line'><span class="sd">     * @param AspectContainer $container</span>
</span><span class='line'><span class="sd">     *</span>
</span><span class='line'><span class="sd">     * @return void</span>
</span><span class='line'><span class="sd">     */</span>
</span><span class='line'>    <span class="k">protected</span> <span class="k">function</span> <span class="nf">configureAop</span><span class="p">(</span><span class="nx">AspectContainer</span> <span class="nv">$container</span><span class="p">)</span>
</span><span class='line'>    <span class="p">{</span>
</span><span class='line'>        <span class="nv">$container</span><span class="o">-&gt;</span><span class="na">registerAspect</span><span class="p">(</span><span class="k">new</span> <span class="nx">TestMonitorAspect</span><span class="p">());</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>That&rsquo;s all )</p>

<blockquote class="twitter-tweet" data-conversation="none"><p>Just have recreated <a href="https://t.co/FqlECETHO7">https://t.co/FqlECETHO7</a> to use latest <a href="https://twitter.com/search?q=%23yii&amp;src=hash">#yii</a> 1.1.x and Go! AOP with <a href="https://twitter.com/search?q=%23composer&amp;src=hash">#composer</a> /cc <a href="https://twitter.com/afdiaz">@afdiaz</a> <a href="https://twitter.com/sam_dark">@sam_dark</a></p>&mdash; Alexander Lisachenko (@lisachenko) <a href="https://twitter.com/lisachenko/statuses/383317369872855040">September 26, 2013</a></blockquote>


<p>Just refresh the page in the browser to see a result. All methods will be intercepted by our advice <code>beforeMethodExecution</code>:</p>

<p><img src="http://go.aopphp.com/images/yii-aop.png" title="Yii with Go! AOP framework" alt="Yii methods interception"></p>

<p>PS. If you want to create an empty project with single line you can run:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='bash'><span class='line'>composer create-project lisachenko/yii-aspect --prefer-source --stability<span class="o">=</span>dev
</span></code></pre></td></tr></table></div></figure>

]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Intercepting execution of system functions in PHP]]></title>
    <link href="http://go.aopphp.com/blog/2013/08/24/intercepting-execution-of-system-functions-in-php/"/>
    <updated>2013-08-24T17:00:00+03:00</updated>
    <id>http://go.aopphp.com/blog/2013/08/24/intercepting-execution-of-system-functions-in-php</id>
    <content type="html"><![CDATA[<p>Intercepting an execution of methods is one of the most common tasks for AOP. In the Java world there are a lot of articles that has a detailed examples for transactional control, logging, authorization, etc. But all AOP stuff in Java is related only to the classes and objects, because functions are not first-class citizens in Java whereas PHP has a good support for functions. By using some tricks we can create a proxies for system functions and add our own interceptors with custom logic. This article will show you how to use AOP techniques with functions in PHP.</p>

<!-- more -->


<p>Ok, let&rsquo;s have some experiments with PHP. Suppose, that we have a nice code that uses the <code>file_get_contents()</code> function to load the content of a file and then prints it to the screen:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
</pre></td><td class='code'><pre><code class='php'><span class='line'><span class="k">namespace</span> <span class="nx">Test</span><span class="p">;</span>
</span><span class='line'>
</span><span class='line'><span class="k">class</span> <span class="nc">FilePrinter</span>
</span><span class='line'><span class="p">{</span>
</span><span class='line'>    <span class="k">public</span> <span class="k">function</span> <span class="nf">show</span><span class="p">(</span><span class="nv">$filename</span><span class="p">)</span>
</span><span class='line'>    <span class="p">{</span>
</span><span class='line'>        <span class="k">echo</span> <span class="s1">&#39;&lt;pre&gt;&#39;</span><span class="p">,</span> <span class="nb">htmlspecialchars</span><span class="p">(</span><span class="nb">file_get_contents</span><span class="p">(</span><span class="nv">$filename</span><span class="p">)),</span> <span class="s1">&#39;&lt;/pre&gt;&#39;</span><span class="p">;</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>Is it possible to test this class and method? Of course, yes! We can create a unit test that will generate a temporary file and then just check that content is correct:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
</pre></td><td class='code'><pre><code class='php'><span class='line'><span class="k">namespace</span> <span class="nx">Test</span><span class="p">;</span>
</span><span class='line'>
</span><span class='line'><span class="k">use</span> <span class="nx">PHPUnit_Framework_TestCase</span> <span class="k">as</span> <span class="nx">TestCase</span><span class="p">;</span>
</span><span class='line'>
</span><span class='line'><span class="k">class</span> <span class="nc">FilePrinterTest</span> <span class="k">extends</span> <span class="nx">TestCase</span>
</span><span class='line'><span class="p">{</span>
</span><span class='line'>    <span class="k">protected</span> <span class="nv">$printer</span><span class="p">;</span>
</span><span class='line'>
</span><span class='line'>    <span class="k">public</span> <span class="k">function</span> <span class="nf">setUp</span><span class="p">()</span>
</span><span class='line'>    <span class="p">{</span>
</span><span class='line'>        <span class="nv">$this</span><span class="o">-&gt;</span><span class="na">printer</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">FilePrinter</span><span class="p">();</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>    <span class="k">public</span> <span class="k">function</span> <span class="nf">testShow</span><span class="p">()</span>
</span><span class='line'>    <span class="p">{</span>
</span><span class='line'>        <span class="nv">$file</span> <span class="o">=</span> <span class="nb">tempnam</span><span class="p">(</span><span class="s2">&quot;/tmp&quot;</span><span class="p">,</span> <span class="s2">&quot;PHP&quot;</span><span class="p">);</span>
</span><span class='line'>        <span class="nb">file_put_contents</span><span class="p">(</span><span class="nv">$file</span><span class="p">,</span> <span class="s1">&#39;test&#39;</span><span class="p">);</span>
</span><span class='line'>        <span class="nb">ob_start</span><span class="p">();</span>
</span><span class='line'>        <span class="nv">$this</span><span class="o">-&gt;</span><span class="na">printer</span><span class="o">-&gt;</span><span class="na">show</span><span class="p">(</span><span class="nv">$file</span><span class="p">);</span>
</span><span class='line'>        <span class="nv">$content</span> <span class="o">=</span> <span class="nb">ob_end_clean</span><span class="p">();</span>
</span><span class='line'>        <span class="nv">$this</span><span class="o">-&gt;</span><span class="na">assertEqual</span><span class="p">(</span><span class="s1">&#39;test&#39;</span><span class="p">,</span> <span class="nv">$content</span><span class="p">);</span>
</span><span class='line'>        <span class="nb">unlink</span><span class="p">(</span><span class="nv">$file</span><span class="p">);</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>Not so cool to use a real filesystem. Real programmers should use <a href="https://github.com/mikey179/vfsStream/wiki">virtual file system</a>! But is it possible to intercept system functions like <code>file_get_contents()</code> in PHP?</p>

<p>I can suppose that most of programmers will argue that it&rsquo;s impossible to intercept system function without extensions such as <a href="https://github.com/mikey179/vfsStream/wiki">runkit</a>. Yes, it&rsquo;s absolutely true that we can not change the function that already loaded into the memory of PHP. However there is a small loophole in the PHP that can be exploited for free.</p>

<h3>Namespace magic</h3>

<p>All modern code is using namespaces to organize the better structure, to encapsulate a classes into a group and to avoid name collisions for functions, classes and constants. There are special <a href="http://php.net/manual/en/language.namespaces.rules.php">namespace resolution rules</a> that are used for resolving relative names to fully-qualified names. Let&rsquo;s have a careful look to the rule number 5:</p>

<blockquote><p>Inside namespace (say A\B), calls to unqualified functions are resolved at run-time. Here is how a call to function foo() is resolved:<br/>1. It looks for a function from the current namespace: A\B\foo().<br/>2. It tries to find and call the global function foo().</p></blockquote>


<p>Wow! Inside namespace calls to unqualified functions are resolved at run-time! This means that we can create a function with the same name as system function in a namespace and it will be used instead of system one. Let&rsquo;s check this fact:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
</pre></td><td class='code'><pre><code class='php'><span class='line'><span class="k">namespace</span> <span class="nx">Test</span><span class="p">;</span>
</span><span class='line'>
</span><span class='line'><span class="k">use</span> <span class="nx">PHPUnit_Framework_TestCase</span> <span class="k">as</span> <span class="nx">TestCase</span><span class="p">;</span>
</span><span class='line'>
</span><span class='line'><span class="k">function</span> <span class="nf">file_get_contents</span><span class="p">(</span><span class="nv">$filename</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>    <span class="k">return</span> <span class="s1">&#39;Wow!&#39;</span><span class="p">;</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'>
</span><span class='line'><span class="k">class</span> <span class="nc">FilePrinterTest</span> <span class="k">extends</span> <span class="nx">TestCase</span>
</span><span class='line'><span class="p">{</span>
</span><span class='line'>    <span class="k">protected</span> <span class="nv">$printer</span><span class="p">;</span>
</span><span class='line'>
</span><span class='line'>    <span class="k">public</span> <span class="k">function</span> <span class="nf">setUp</span><span class="p">()</span>
</span><span class='line'>    <span class="p">{</span>
</span><span class='line'>        <span class="nv">$this</span><span class="o">-&gt;</span><span class="na">printer</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">FilePrinter</span><span class="p">();</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>    <span class="k">public</span> <span class="k">function</span> <span class="nf">testShow</span><span class="p">()</span>
</span><span class='line'>    <span class="p">{</span>
</span><span class='line'>        <span class="nv">$file</span> <span class="o">=</span> <span class="nb">tempnam</span><span class="p">(</span><span class="s2">&quot;/tmp&quot;</span><span class="p">,</span> <span class="s2">&quot;PHP&quot;</span><span class="p">);</span>
</span><span class='line'>        <span class="nb">file_put_contents</span><span class="p">(</span><span class="nv">$file</span><span class="p">,</span> <span class="s1">&#39;test&#39;</span><span class="p">);</span>
</span><span class='line'>        <span class="nb">ob_start</span><span class="p">();</span>
</span><span class='line'>        <span class="nv">$this</span><span class="o">-&gt;</span><span class="na">printer</span><span class="o">-&gt;</span><span class="na">show</span><span class="p">(</span><span class="nv">$file</span><span class="p">);</span>
</span><span class='line'>        <span class="nv">$content</span> <span class="o">=</span> <span class="nb">ob_end_clean</span><span class="p">();</span>
</span><span class='line'>        <span class="nv">$this</span><span class="o">-&gt;</span><span class="na">assertEqual</span><span class="p">(</span><span class="s1">&#39;test&#39;</span><span class="p">,</span> <span class="nv">$content</span><span class="p">);</span>
</span><span class='line'>        <span class="nb">unlink</span><span class="p">(</span><span class="nv">$file</span><span class="p">);</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>Pay an attention that we define the function <code>file_get_contents()</code> in the namespace <code>Test</code>. If we run our test we will see that it is broken, because we expecting &lsquo;test&rsquo; but got &lsquo;Wow!&rsquo;. Very promising ) Small demo is also available at <a href="http://3v4l.org/K1b9k">http://3v4l.org/K1b9k</a></p>

<p>Moreover, if we need to call an original function we can easily do this by using qualified name:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
</pre></td><td class='code'><pre><code class='php'><span class='line'><span class="k">namespace</span> <span class="nx">Test</span><span class="p">;</span>
</span><span class='line'>
</span><span class='line'><span class="k">function</span> <span class="nf">file_get_contents</span><span class="p">(</span><span class="nv">$filename</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>    <span class="k">echo</span> <span class="s1">&#39;Wow!&#39;</span><span class="p">;</span>
</span><span class='line'>    <span class="k">return</span> <span class="nx">\file_get_contents</span><span class="p">(</span><span class="nv">$filename</span><span class="p">);</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<h3>Aspect-oriented programming with functions</h3>

<p>Go! AOP framework has an experimental support for system function interception from the version 0.4.0. This means that there is an ability to create an advice for system functions!</p>

<p>Function interception can be very-very slow, so please do not try to intercept all system functions in all namespaces. However it&rsquo;s so amazing. Let&rsquo;s try:</p>

<ul>
<li>Enable function interception in the kernel by setting &lsquo;interceptFunctions&rsquo; => true for the kernel.</li>
<li>Create an advice within aspect to intercept functions:</li>
</ul>


<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
<span class='line-number'>29</span>
</pre></td><td class='code'><pre><code class='php'><span class='line'><span class="k">use</span> <span class="nx">Go\Aop\Aspect</span><span class="p">;</span>
</span><span class='line'><span class="k">use</span> <span class="nx">Go\Aop\Intercept\FunctionInvocation</span><span class="p">;</span>
</span><span class='line'><span class="k">use</span> <span class="nx">Go\Lang\Annotation\Around</span><span class="p">;</span>
</span><span class='line'>
</span><span class='line'><span class="sd">/**</span>
</span><span class='line'><span class="sd"> * Function interceptor aspect</span>
</span><span class='line'><span class="sd"> */</span>
</span><span class='line'><span class="k">class</span> <span class="nc">FunctionInterceptorAspect</span> <span class="k">implements</span> <span class="nx">Aspect</span>
</span><span class='line'><span class="p">{</span>
</span><span class='line'>
</span><span class='line'>    <span class="sd">/**</span>
</span><span class='line'><span class="sd">     * @param FunctionInvocation $invocation</span>
</span><span class='line'><span class="sd">     *</span>
</span><span class='line'><span class="sd">     * @Around(&quot;execution(Test\*(*))&quot;)</span>
</span><span class='line'><span class="sd">     *</span>
</span><span class='line'><span class="sd">     * @return mixed</span>
</span><span class='line'><span class="sd">     */</span>
</span><span class='line'>    <span class="k">public</span> <span class="k">function</span> <span class="nf">aroundFunction</span><span class="p">(</span><span class="nx">FunctionInvocation</span> <span class="nv">$invocation</span><span class="p">)</span>
</span><span class='line'>    <span class="p">{</span>
</span><span class='line'>        <span class="k">echo</span> <span class="s1">&#39;Calling Around Interceptor for function: &#39;</span><span class="p">,</span>
</span><span class='line'>            <span class="nv">$invocation</span><span class="o">-&gt;</span><span class="na">getFunction</span><span class="p">()</span><span class="o">-&gt;</span><span class="na">getName</span><span class="p">(),</span>
</span><span class='line'>            <span class="s1">&#39;()&#39;</span><span class="p">,</span>
</span><span class='line'>            <span class="s1">&#39; with arguments: &#39;</span><span class="p">,</span>
</span><span class='line'>            <span class="nb">json_encode</span><span class="p">(</span><span class="nv">$invocation</span><span class="o">-&gt;</span><span class="na">getArguments</span><span class="p">()),</span>
</span><span class='line'>            <span class="nx">PHP_EOL</span><span class="p">;</span>
</span><span class='line'>
</span><span class='line'>        <span class="k">return</span> <span class="nv">$invocation</span><span class="o">-&gt;</span><span class="na">proceed</span><span class="p">();</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<ul>
<li>Register this aspect in the kernel</li>
</ul>


<p>Here we define an advice with an around pointcut <code>execution(Test\*(*))</code>. Pointcut can be translated as &ldquo;around execution of any (*) system functions inside the <code>Test</code> namespace&rdquo;. Body of this method is an advice that will be invoked around the original function. So we have a full control over the return value and original invocation by calling <code>$invocation-&gt;proceed()</code> at the end.
Look at the screenshot from ZF2 framework:</p>

<p><img src="http://go.aopphp.com/images/function-aop.png" title="Function interception with Go! AOP framework" alt="ZF2 function interception"></p>

<p>If you want to try this by hand, feel free to install the Go! AOP framework with composer and open the <code>demos/</code> folder in the browser:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='php'><span class='line'><span class="nx">composer</span> <span class="k">require</span> <span class="nx">lisachenko</span><span class="o">/</span><span class="nx">go</span><span class="o">-</span><span class="nx">aop</span><span class="o">-</span><span class="nx">php</span><span class="o">:</span><span class="mf">0.4</span><span class="o">.</span><span class="mi">0</span>
</span></code></pre></td></tr></table></div></figure>


<p>Thank you for attention!</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Implementing logging aspect with Doctrine annotations]]></title>
    <link href="http://go.aopphp.com/blog/2013/07/21/implementing-logging-aspect-with-doctrine-annotations/"/>
    <updated>2013-07-21T22:38:00+03:00</updated>
    <id>http://go.aopphp.com/blog/2013/07/21/implementing-logging-aspect-with-doctrine-annotations</id>
    <content type="html"><![CDATA[<p>Logging is probably the most mentioned sweet example of AOP. Probably because it is the simplest and most straightforward example most people can think of. So I want to show you the easiest ever way to implement logging in PHP with annotations. This article is the second part of my previous article about <a href="http://go.aopphp.com/blog/2013/06/02/application-level-logging-with-aop-and-monolog/">application-level logging with AOP in PHP</a> and if you haven&rsquo;t read it yet please do this before proceeding to this article.</p>

<!-- more -->


<p>It&rsquo;s not a secret that every business application requires logging of different actions in different places of the code. Why we need this logging? Is it possible not to use it? The answer is obvious. No, we can&rsquo;t, we should write logs to be able to analyze them in case something goes wrong. Logs can give us the answers: what happened, when it happened and why it happened.</p>

<p>Let&rsquo;s have a look at a typical class which is doing some important job for us:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
</pre></td><td class='code'><pre><code class='php'><span class='line'><span class="k">class</span> <span class="nc">Account</span>
</span><span class='line'><span class="p">{</span>
</span><span class='line'>    <span class="k">protected</span> <span class="nv">$amount</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
</span><span class='line'>
</span><span class='line'>    <span class="k">public</span> <span class="k">function</span> <span class="nf">depositMoney</span><span class="p">(</span><span class="nv">$amount</span><span class="p">)</span>
</span><span class='line'>    <span class="p">{</span>
</span><span class='line'>        <span class="nv">$this</span><span class="o">-&gt;</span><span class="na">amount</span> <span class="o">+=</span> <span class="nv">$amount</span><span class="p">;</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>    <span class="k">public</span> <span class="k">function</span> <span class="nf">withdrawMoney</span><span class="p">(</span><span class="nv">$amount</span><span class="p">)</span>
</span><span class='line'>    <span class="p">{</span>
</span><span class='line'>        <span class="nv">$this</span><span class="o">-&gt;</span><span class="na">amount</span> <span class="o">-=</span> <span class="nv">$amount</span><span class="p">;</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>Of course, it&rsquo;s the simplest implementation and real class can contain much more lines of code. Suppose that we deployed this code to the production server and after a while our project manager says that sometimes deposit withdrawal is not working. Oops!</p>

<p>Best solution in that case is to add logging to all the important methods to be sure that everything is working as expected. To detect an error we should write log before and after method execution. Then we can look into log and just count pairs &ldquo;before-after&rdquo;. If there isn&rsquo;t &ldquo;after&rdquo; log record then we have an error and corresponding &ldquo;before&rdquo; record will give us an idea why we have this error.</p>

<p>To write the logs we need a logger instance in our class and it&rsquo;s another disadvantage of OOP version of logging. Injecting logger adds a dependency which is not really needed by our class:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
</pre></td><td class='code'><pre><code class='php'><span class='line'><span class="k">class</span> <span class="nc">Account</span>
</span><span class='line'><span class="p">{</span>
</span><span class='line'>    <span class="sd">/**</span>
</span><span class='line'><span class="sd">     * @var LoggerInterface</span>
</span><span class='line'><span class="sd">     */</span>
</span><span class='line'>    <span class="k">protected</span> <span class="nv">$logger</span><span class="p">;</span>
</span><span class='line'>
</span><span class='line'>    <span class="k">public</span> <span class="k">function</span> <span class="nf">__construct</span><span class="p">(</span><span class="nx">LoggerInterface</span> <span class="nv">$logger</span><span class="p">)</span>
</span><span class='line'>    <span class="p">{</span>
</span><span class='line'>        <span class="nv">$this</span><span class="o">-&gt;</span><span class="na">logger</span> <span class="o">=</span> <span class="nv">$logger</span><span class="p">;</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>    <span class="c1">// source code here</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>Cross-cutting concerns such as logging can not be easily extracting on OOP level into the single class and this means that we should add logging to each method:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
<span class='line-number'>29</span>
<span class='line-number'>30</span>
<span class='line-number'>31</span>
<span class='line-number'>32</span>
<span class='line-number'>33</span>
<span class='line-number'>34</span>
<span class='line-number'>35</span>
<span class='line-number'>36</span>
<span class='line-number'>37</span>
<span class='line-number'>38</span>
</pre></td><td class='code'><pre><code class='php'><span class='line'><span class="k">class</span> <span class="nc">Account</span>
</span><span class='line'><span class="p">{</span>
</span><span class='line'>    <span class="k">protected</span> <span class="nv">$amount</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
</span><span class='line'>
</span><span class='line'>    <span class="sd">/**</span>
</span><span class='line'><span class="sd">     * @var LoggerInterface</span>
</span><span class='line'><span class="sd">     */</span>
</span><span class='line'>    <span class="k">protected</span> <span class="nv">$logger</span><span class="p">;</span>
</span><span class='line'>
</span><span class='line'>    <span class="k">public</span> <span class="k">function</span> <span class="nf">__construct</span><span class="p">(</span><span class="nx">LoggerInterface</span> <span class="nv">$logger</span><span class="p">)</span>
</span><span class='line'>    <span class="p">{</span>
</span><span class='line'>        <span class="nv">$this</span><span class="o">-&gt;</span><span class="na">logger</span> <span class="o">=</span> <span class="nv">$logger</span><span class="p">;</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>    <span class="k">public</span> <span class="k">function</span> <span class="nf">depositMoney</span><span class="p">(</span><span class="nv">$amount</span><span class="p">)</span>
</span><span class='line'>    <span class="p">{</span>
</span><span class='line'>        <span class="nv">$this</span><span class="o">-&gt;</span><span class="na">logger</span><span class="o">-&gt;</span><span class="na">info</span><span class="p">(</span><span class="s2">&quot;Preparing to deposit money&quot;</span><span class="p">,</span> <span class="k">array</span><span class="p">(</span><span class="s1">&#39;amount&#39;</span> <span class="o">=&gt;</span> <span class="nv">$amount</span><span class="p">));</span>
</span><span class='line'>        <span class="k">try</span> <span class="p">{</span>
</span><span class='line'>            <span class="nv">$this</span><span class="o">-&gt;</span><span class="na">amount</span> <span class="o">+=</span> <span class="nv">$amount</span><span class="p">;</span>
</span><span class='line'>            <span class="nv">$this</span><span class="o">-&gt;</span><span class="na">logger</span><span class="o">-&gt;</span><span class="na">info</span><span class="p">(</span><span class="s2">&quot;Deposit money successful&quot;</span><span class="p">,</span> <span class="k">array</span><span class="p">(</span><span class="s1">&#39;amount&#39;</span> <span class="o">=&gt;</span> <span class="nv">$amount</span><span class="p">));</span>
</span><span class='line'>        <span class="p">}</span> <span class="k">catch</span> <span class="p">(</span><span class="nx">Exception</span> <span class="nv">$e</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>            <span class="nv">$this</span><span class="o">-&gt;</span><span class="na">logger</span><span class="o">-&gt;</span><span class="na">info</span><span class="p">(</span><span class="s2">&quot;Deposit money error: &quot;</span> <span class="o">.</span> <span class="nv">$e</span><span class="p">,</span> <span class="k">array</span><span class="p">(</span><span class="s1">&#39;amount&#39;</span> <span class="o">=&gt;</span> <span class="nv">$amount</span><span class="p">));</span>
</span><span class='line'>            <span class="k">throw</span> <span class="nv">$e</span><span class="p">;</span>
</span><span class='line'>        <span class="p">}</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>    <span class="k">public</span> <span class="k">function</span> <span class="nf">withdrawMoney</span><span class="p">(</span><span class="nv">$amount</span><span class="p">)</span>
</span><span class='line'>    <span class="p">{</span>
</span><span class='line'>        <span class="nv">$this</span><span class="o">-&gt;</span><span class="na">logger</span><span class="o">-&gt;</span><span class="na">info</span><span class="p">(</span><span class="s2">&quot;Preparing to withdraw money&quot;</span><span class="p">,</span> <span class="k">array</span><span class="p">(</span><span class="s1">&#39;amount&#39;</span> <span class="o">=&gt;</span> <span class="nv">$amount</span><span class="p">));</span>
</span><span class='line'>        <span class="k">try</span> <span class="p">{</span>
</span><span class='line'>            <span class="nv">$this</span><span class="o">-&gt;</span><span class="na">amount</span> <span class="o">-=</span> <span class="nv">$amount</span><span class="p">;</span>
</span><span class='line'>            <span class="nv">$this</span><span class="o">-&gt;</span><span class="na">logger</span><span class="o">-&gt;</span><span class="na">info</span><span class="p">(</span><span class="s2">&quot;Withdraw money successful&quot;</span><span class="p">,</span> <span class="k">array</span><span class="p">(</span><span class="s1">&#39;amount&#39;</span> <span class="o">=&gt;</span> <span class="nv">$amount</span><span class="p">));</span>
</span><span class='line'>        <span class="p">}</span> <span class="k">catch</span> <span class="p">(</span><span class="nx">Exception</span> <span class="nv">$e</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>            <span class="nv">$this</span><span class="o">-&gt;</span><span class="na">logger</span><span class="o">-&gt;</span><span class="na">info</span><span class="p">(</span><span class="s2">&quot;Withdraw money error: &quot;</span> <span class="o">.</span> <span class="nv">$e</span><span class="p">,</span> <span class="k">array</span><span class="p">(</span><span class="s1">&#39;amount&#39;</span> <span class="o">=&gt;</span> <span class="nv">$amount</span><span class="p">));</span>
</span><span class='line'>            <span class="k">throw</span> <span class="nv">$e</span><span class="p">;</span>
</span><span class='line'>        <span class="p">}</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>Wow! Logging is so annoying! Instead of single line of useful code we have 6! For each important method! In my previous article we refactored logging to the aspect class:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
</pre></td><td class='code'><pre><code class='php'><span class='line'><span class="k">use</span> <span class="nx">Go\Aop\Aspect</span><span class="p">;</span>
</span><span class='line'><span class="k">use</span> <span class="nx">Go\Aop\Intercept\MethodInvocation</span><span class="p">;</span>
</span><span class='line'><span class="k">use</span> <span class="nx">Go\Lang\Annotation\After</span><span class="p">;</span>
</span><span class='line'><span class="k">use</span> <span class="nx">Go\Lang\Annotation\Before</span><span class="p">;</span>
</span><span class='line'><span class="k">use</span> <span class="nx">Go\Lang\Annotation\Around</span><span class="p">;</span>
</span><span class='line'>
</span><span class='line'><span class="k">class</span> <span class="nc">LoggingAspect</span> <span class="k">implements</span> <span class="nx">Aspect</span>
</span><span class='line'><span class="p">{</span>
</span><span class='line'>    <span class="sd">/**</span>
</span><span class='line'><span class="sd">     * Instance of logger (injected in constructor or by setter)</span>
</span><span class='line'><span class="sd">     */</span>
</span><span class='line'>    <span class="k">protected</span> <span class="nv">$logger</span><span class="p">;</span>
</span><span class='line'>
</span><span class='line'>    <span class="sd">/**</span>
</span><span class='line'><span class="sd">     * @Before(&quot;within(**)&quot;)</span>
</span><span class='line'><span class="sd">     */</span>
</span><span class='line'>    <span class="k">public</span> <span class="k">function</span> <span class="nf">beforeMethodExecution</span><span class="p">(</span><span class="nx">MethodInvocation</span> <span class="nv">$invocation</span><span class="p">)</span>
</span><span class='line'>    <span class="p">{</span>
</span><span class='line'>        <span class="nv">$this</span><span class="o">-&gt;</span><span class="na">logger</span><span class="o">-&gt;</span><span class="na">info</span><span class="p">(</span>
</span><span class='line'>            <span class="s2">&quot;Executing &quot;</span> <span class="o">.</span> <span class="nv">$invocation</span><span class="o">-&gt;</span><span class="na">getMethod</span><span class="p">()</span><span class="o">-&gt;</span><span class="na">name</span><span class="p">,</span>
</span><span class='line'>            <span class="nv">$invocation</span><span class="o">-&gt;</span><span class="na">getArguments</span><span class="p">()</span>
</span><span class='line'>        <span class="p">);</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>This aspect is cool but it is too global due to the <code>within(**)</code> pointcut that matches all public and protected methods in every class. But what should we do if we want to log only specific methods in the application? We definitely need some markers for loggable methods. In the Java world we can use native annotations to mark the methods, but for PHP there isn&rsquo;t native support for annotations. However, there is a cool <a href="http://docs.doctrine-project.org/projects/doctrine-common/en/latest/reference/annotations.html">Doctrine Annotations</a> library that can be used in our own application to implement doc block annotations.</p>

<p>Let&rsquo;s create an annotation class for @Loggable marker:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
</pre></td><td class='code'><pre><code class='php'><span class='line'><span class="k">namespace</span> <span class="nx">Annotation</span><span class="p">;</span>
</span><span class='line'>
</span><span class='line'><span class="k">use</span> <span class="nx">Doctrine\Common\Annotations\Annotation</span><span class="p">;</span>
</span><span class='line'>
</span><span class='line'><span class="sd">/**</span>
</span><span class='line'><span class="sd"> * Loggable marker</span>
</span><span class='line'><span class="sd"> *</span>
</span><span class='line'><span class="sd"> * @Annotation</span>
</span><span class='line'><span class="sd"> */</span>
</span><span class='line'><span class="k">class</span> <span class="nc">Loggable</span> <span class="k">extends</span> <span class="nx">Annotation</span>
</span><span class='line'><span class="p">{</span>
</span><span class='line'>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>The next step is to register this annotation in the registry of Doctrine (this is only needed if you did not register an autoloader previously):</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
</pre></td><td class='code'><pre><code class='php'><span class='line'><span class="k">use</span> <span class="nx">Doctrine\Common\Annotations\AnnotationRegistry</span><span class="p">;</span>
</span><span class='line'>
</span><span class='line'><span class="nx">AnnotationRegistry</span><span class="o">::</span><span class="na">registerFile</span><span class="p">(</span><span class="nx">__DIR__</span> <span class="o">.</span> <span class="s1">&#39;./Annotation/Loggable.php&#39;</span><span class="p">);</span>
</span></code></pre></td></tr></table></div></figure>


<p>Now we can modify an aspect by writing a pointcut expression that will match only specific methods. A pointcut expression is an expression that specifies where in the code the advice will be applied. With Go! AOP, you can create a pointcut by specifying namespace, class and method attributes among other things. But the easiest way to specify a pointcut for the logging aspect is by matching methods that have a specific <code>Annotation\Loggable</code> annotation marker in the phpDoc-block</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
<span class='line-number'>29</span>
<span class='line-number'>30</span>
<span class='line-number'>31</span>
<span class='line-number'>32</span>
<span class='line-number'>33</span>
<span class='line-number'>34</span>
<span class='line-number'>35</span>
</pre></td><td class='code'><pre><code class='php'><span class='line'><span class="k">use</span> <span class="nx">Go\Aop\Aspect</span><span class="p">;</span>
</span><span class='line'><span class="k">use</span> <span class="nx">Go\Aop\Intercept\MethodInvocation</span><span class="p">;</span>
</span><span class='line'><span class="k">use</span> <span class="nx">Go\Lang\Annotation\Around</span><span class="p">;</span>
</span><span class='line'><span class="k">use</span> <span class="nx">Go\Lang\Annotation\Pointcut</span><span class="p">;</span>
</span><span class='line'>
</span><span class='line'><span class="k">class</span> <span class="nc">LoggingAspect</span> <span class="k">implements</span> <span class="nx">Aspect</span>
</span><span class='line'><span class="p">{</span>
</span><span class='line'>    <span class="sd">/**</span>
</span><span class='line'><span class="sd">     * Instance of logger (injected in constructor or by setter)</span>
</span><span class='line'><span class="sd">     */</span>
</span><span class='line'>    <span class="k">protected</span> <span class="nv">$logger</span><span class="p">;</span>
</span><span class='line'>
</span><span class='line'>    <span class="sd">/**</span>
</span><span class='line'><span class="sd">     * @Pointcut(&quot;@annotation(Annotation\Loggable)&quot;)</span>
</span><span class='line'><span class="sd">     */</span>
</span><span class='line'>    <span class="k">protected</span> <span class="k">function</span> <span class="nf">loggablePointcut</span><span class="p">()</span> <span class="p">{}</span>
</span><span class='line'>
</span><span class='line'>    <span class="sd">/**</span>
</span><span class='line'><span class="sd">     * @Around(&quot;$this-&gt;loggablePointcut&quot;)</span>
</span><span class='line'><span class="sd">     * @return mixed</span>
</span><span class='line'><span class="sd">     */</span>
</span><span class='line'>    <span class="k">public</span> <span class="k">function</span> <span class="nf">aroundLoggable</span><span class="p">(</span><span class="nx">MethodInvocation</span> <span class="nv">$invocation</span><span class="p">)</span>
</span><span class='line'>    <span class="p">{</span>
</span><span class='line'>        <span class="nv">$method</span> <span class="o">=</span> <span class="nv">$invocation</span><span class="o">-&gt;</span><span class="na">getMethod</span><span class="p">()</span><span class="o">-&gt;</span><span class="na">name</span><span class="p">;</span>
</span><span class='line'>        <span class="nv">$this</span><span class="o">-&gt;</span><span class="na">logger</span><span class="o">-&gt;</span><span class="na">info</span><span class="p">(</span><span class="s2">&quot;Entering &quot;</span> <span class="o">.</span> <span class="nv">$method</span><span class="p">,</span> <span class="nv">$invocation</span><span class="o">-&gt;</span><span class="na">getArguments</span><span class="p">());</span>
</span><span class='line'>        <span class="k">try</span> <span class="p">{</span>
</span><span class='line'>            <span class="nv">$result</span> <span class="o">=</span> <span class="nv">$invocation</span><span class="o">-&gt;</span><span class="na">proceed</span><span class="p">();</span>
</span><span class='line'>            <span class="nv">$this</span><span class="o">-&gt;</span><span class="na">logger</span><span class="o">-&gt;</span><span class="na">info</span><span class="p">(</span><span class="s2">&quot;Success: &quot;</span> <span class="o">.</span> <span class="nv">$method</span><span class="p">);</span>
</span><span class='line'>        <span class="p">}</span> <span class="k">catch</span> <span class="p">(</span><span class="nx">Exception</span> <span class="nv">$e</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>            <span class="nv">$this</span><span class="o">-&gt;</span><span class="na">logger</span><span class="o">-&gt;</span><span class="na">error</span><span class="p">(</span><span class="s2">&quot;Error: &quot;</span> <span class="o">.</span> <span class="nv">$method</span> <span class="o">.</span> <span class="s1">&#39; details: &#39;</span> <span class="o">.</span> <span class="nv">$e</span><span class="p">);</span>
</span><span class='line'>            <span class="k">throw</span> <span class="nv">$e</span><span class="p">;</span>
</span><span class='line'>        <span class="p">}</span>
</span><span class='line'>        <span class="k">return</span> <span class="nv">$result</span><span class="p">;</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>Using the annotation means that developers never need to alter the pointcut expression to add or remove methods to the pointcut. A developer only has to add the annotation to a method to have the logging aspect applied. Let&rsquo;s refactor our original class to use only annotation for loggable methods:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
<span class='line-number'>29</span>
<span class='line-number'>30</span>
<span class='line-number'>31</span>
<span class='line-number'>32</span>
</pre></td><td class='code'><pre><code class='php'><span class='line'><span class="k">use</span> <span class="nx">Annotation\Loggable</span><span class="p">;</span>
</span><span class='line'>
</span><span class='line'><span class="k">class</span> <span class="nc">Account</span>
</span><span class='line'><span class="p">{</span>
</span><span class='line'>    <span class="k">protected</span> <span class="nv">$amount</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
</span><span class='line'>
</span><span class='line'>    <span class="sd">/**</span>
</span><span class='line'><span class="sd">     * @var LoggerInterface</span>
</span><span class='line'><span class="sd">     */</span>
</span><span class='line'>    <span class="k">protected</span> <span class="nv">$logger</span><span class="p">;</span>
</span><span class='line'>
</span><span class='line'>    <span class="k">public</span> <span class="k">function</span> <span class="nf">__construct</span><span class="p">(</span><span class="nx">LoggerInterface</span> <span class="nv">$logger</span><span class="p">)</span>
</span><span class='line'>    <span class="p">{</span>
</span><span class='line'>        <span class="nv">$this</span><span class="o">-&gt;</span><span class="na">logger</span> <span class="o">=</span> <span class="nv">$logger</span><span class="p">;</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>    <span class="sd">/**</span>
</span><span class='line'><span class="sd">     * @Loggable</span>
</span><span class='line'><span class="sd">     */</span>
</span><span class='line'>    <span class="k">public</span> <span class="k">function</span> <span class="nf">depositMoney</span><span class="p">(</span><span class="nv">$amount</span><span class="p">)</span>
</span><span class='line'>    <span class="p">{</span>
</span><span class='line'>        <span class="nv">$this</span><span class="o">-&gt;</span><span class="na">amount</span> <span class="o">+=</span> <span class="nv">$amount</span><span class="p">;</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>    <span class="sd">/**</span>
</span><span class='line'><span class="sd">     * @Loggable</span>
</span><span class='line'><span class="sd">     */</span>
</span><span class='line'>    <span class="k">public</span> <span class="k">function</span> <span class="nf">withdrawMoney</span><span class="p">(</span><span class="nv">$amount</span><span class="p">)</span>
</span><span class='line'>    <span class="p">{</span>
</span><span class='line'>        <span class="nv">$this</span><span class="o">-&gt;</span><span class="na">amount</span> <span class="o">-=</span> <span class="nv">$amount</span><span class="p">;</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>We can also remove logger dependency, as there is no need in it any more:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
</pre></td><td class='code'><pre><code class='php'><span class='line'><span class="k">use</span> <span class="nx">Annotation\Loggable</span><span class="p">;</span>
</span><span class='line'>
</span><span class='line'><span class="k">class</span> <span class="nc">Account</span>
</span><span class='line'><span class="p">{</span>
</span><span class='line'>    <span class="k">protected</span> <span class="nv">$amount</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
</span><span class='line'>
</span><span class='line'>    <span class="sd">/**</span>
</span><span class='line'><span class="sd">     * @Loggable</span>
</span><span class='line'><span class="sd">     */</span>
</span><span class='line'>    <span class="k">public</span> <span class="k">function</span> <span class="nf">depositMoney</span><span class="p">(</span><span class="nv">$amount</span><span class="p">)</span>
</span><span class='line'>    <span class="p">{</span>
</span><span class='line'>        <span class="nv">$this</span><span class="o">-&gt;</span><span class="na">amount</span> <span class="o">+=</span> <span class="nv">$amount</span><span class="p">;</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>    <span class="sd">/**</span>
</span><span class='line'><span class="sd">     * @Loggable</span>
</span><span class='line'><span class="sd">     */</span>
</span><span class='line'>    <span class="k">public</span> <span class="k">function</span> <span class="nf">withdrawMoney</span><span class="p">(</span><span class="nv">$amount</span><span class="p">)</span>
</span><span class='line'>    <span class="p">{</span>
</span><span class='line'>        <span class="nv">$this</span><span class="o">-&gt;</span><span class="na">amount</span> <span class="o">-=</span> <span class="nv">$amount</span><span class="p">;</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>We just finished our refactoring to use transparent logging with Go! AOP and Doctrine annotations. By having <code>@Loggable</code> marker we still have a good understanding that this method should be logged and have a nice aspect that do logging in one place.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Application-level logging with AOP and Monolog]]></title>
    <link href="http://go.aopphp.com/blog/2013/06/02/application-level-logging-with-aop-and-monolog/"/>
    <updated>2013-06-02T13:50:00+03:00</updated>
    <id>http://go.aopphp.com/blog/2013/06/02/application-level-logging-with-aop-and-monolog</id>
    <content type="html"><![CDATA[<p>So you got finished with your brand new website. It is completely PHP driven and looks very nice. But are you sure that
everything works perfectly? Under every circumstances?</p>

<p>No. You can never be absolutely sure. That is why you need a log file to see if there where some errors. Well, if you
are the kind of person that doesn’t care if some jerks who behaved wrong on you website get error messages, then you
probably don’t need an error log file.</p>

<!-- more -->


<p>If you decide to to write the logs, then you definitely choose the best tool for this - <a href="https://github.com/Seldaek/monolog">Monolog</a>.
Monolog is used by such frameworks as Symfony2, Silex, Laravel4, PPI and can be easily integrated into custom application.</p>

<p>But even such a great tool like Monolog can not help us with encapsulating the logging into separate class, because
logging is a <a href="http://en.wikipedia.org/wiki/Cross-cutting_concern">cross-cutting concern</a>. This means that logging do not
fit cleanly into object-oriented programming. As a result, the code addressing the logging must be scattered, or duplicated,
across the various related locations, resulting in a loss of modularity.</p>

<p>Aspect-oriented programming aims to encapsulate cross-cutting concerns into aspects to retain modularity.
This allows for the clean isolation and reuse of code addressing the cross-cutting concern. By basing designs on
cross-cutting concerns, software engineering benefits are effected, including modularity and simplified maintenance.
This article will show you how to combine the power of AOP with the ease of use of Monolog to implement application-level
 logging just in few lines.</p>

<h3>Installation</h3>

<p>First of all, we need to install Monolog (if it isn&rsquo;t available). Monolog is available on Packagist (monolog/monolog)
and as such installable via Composer:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='bash'><span class='line'><span class="nv">$ </span>composer require monolog/monolog
</span></code></pre></td></tr></table></div></figure>


<p>If you do not use Composer, you can grab the code of Monolog from GitHub, and use any PSR-0 compatible autoloader
(e.g. the Symfony2 ClassLoader component) to load Monolog classes.</p>

<p>Next tool that we need is <a href="http://go.aopphp.com">Go! Aspect-Oriented Framework</a>. You can find more information about installation
and configuration in the <a href="http://go.aopphp.com/docs/">documentation</a> section.</p>

<p>If you use a Composer, then installation is quite easy:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='bash'><span class='line'><span class="nv">$ </span>composer require lisachenko/go-aop-php
</span></code></pre></td></tr></table></div></figure>


<p>Small configuration is required to prepare the AOP kernel for work. Detailed instructions are
available <a href="http://go.aopphp.com/docs/initial-configuration/">here</a>. After installation and configuration we are ready for the dark power of
AOP</p>

<h3>Implementing logging aspect</h3>

<p>So, what is aspect?</p>

<blockquote><p>In computer science, an aspect of a program is a feature linked to many other parts of the program, but which is not related to the program&#8217;s primary function.</p></blockquote>


<p>Go! framework defines an aspect as a typical class with methods-advices. Each advice contains a specific logic that can be
invoked before, after or around specific part of code in your application. Let&rsquo;s try to describe an advice for logging.</p>

<p>Suppose, that we want to log an execution of methods. We want to write a method name and an arguments before execution of a method.
Typically this is looking like this:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
</pre></td><td class='code'><pre><code class='php'><span class='line'><span class="cp">&lt;?php</span>
</span><span class='line'><span class="k">class</span> <span class="nc">Example</span>
</span><span class='line'><span class="p">{</span>
</span><span class='line'>    <span class="sd">/**</span>
</span><span class='line'><span class="sd">     * Instance of logger (injected in constructor or by setter)</span>
</span><span class='line'><span class="sd">     */</span>
</span><span class='line'>    <span class="k">protected</span> <span class="nv">$logger</span><span class="p">;</span>
</span><span class='line'>
</span><span class='line'><span class="err">    </span><span class="k">public</span> <span class="k">function</span> <span class="nf">test</span><span class="p">(</span><span class="nv">$arg1</span><span class="p">,</span> <span class="nv">$arg2</span><span class="p">)</span>
</span><span class='line'>    <span class="p">{</span>
</span><span class='line'>        <span class="nv">$this</span><span class="o">-&gt;</span><span class="na">logger</span><span class="o">-&gt;</span><span class="na">info</span><span class="p">(</span><span class="s2">&quot;Executing &quot;</span> <span class="o">.</span> <span class="nx">__METHOD__</span><span class="p">,</span> <span class="nb">func_get_args</span><span class="p">());</span>
</span><span class='line'>        <span class="c1">// ... logic of method here</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>    <span class="k">public</span> <span class="k">function</span> <span class="nf">anotherTest</span><span class="p">(</span><span class="nv">$arg1</span><span class="p">)</span>
</span><span class='line'>    <span class="p">{</span>
</span><span class='line'>        <span class="nv">$this</span><span class="o">-&gt;</span><span class="na">logger</span><span class="o">-&gt;</span><span class="na">info</span><span class="p">(</span><span class="s2">&quot;Executing &quot;</span> <span class="o">.</span> <span class="nx">__METHOD__</span><span class="p">,</span> <span class="nb">func_get_args</span><span class="p">());</span>
</span><span class='line'>        <span class="c1">// ... logic of method here</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>We can notice that the code addressing the logging is scattered and duplicated. To solve this issue we can extract this code into the separate &ldquo;before&rdquo; advice:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
</pre></td><td class='code'><pre><code class='php'><span class='line'><span class="cp">&lt;?php</span>
</span><span class='line'><span class="k">use</span> <span class="nx">Go\Aop\Aspect</span><span class="p">;</span>
</span><span class='line'>
</span><span class='line'><span class="k">class</span> <span class="nc">LoggingAspect</span> <span class="k">implements</span> <span class="nx">Aspect</span>
</span><span class='line'><span class="p">{</span>
</span><span class='line'>    <span class="sd">/**</span>
</span><span class='line'><span class="sd">     * Instance of logger (injected in constructor or by setter)</span>
</span><span class='line'><span class="sd">     */</span>
</span><span class='line'>    <span class="k">protected</span> <span class="nv">$logger</span><span class="p">;</span>
</span><span class='line'>
</span><span class='line'>    <span class="k">public</span> <span class="k">function</span> <span class="nf">beforeMethodExecution</span><span class="p">()</span>
</span><span class='line'>    <span class="p">{</span>
</span><span class='line'>        <span class="nv">$this</span><span class="o">-&gt;</span><span class="na">logger</span><span class="o">-&gt;</span><span class="na">info</span><span class="p">(</span><span class="s2">&quot;Executing &quot;</span> <span class="o">.</span> <span class="nx">__METHOD__</span><span class="p">,</span> <span class="nb">func_get_args</span><span class="p">());</span>
</span><span class='line'>        <span class="c1">// return the control to original code</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>Ok, we have extracted the advice itself, but how we get a method name and arguments? Go! framework contains a specific class, that implements <code>MethodInvocation</code> interface. This interface gives an information about joinpoint by providing an access to the reflection object. Each advice is receiving an instance of this class as an argument:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
</pre></td><td class='code'><pre><code class='php'><span class='line'><span class="cp">&lt;?php</span>
</span><span class='line'><span class="k">use</span> <span class="nx">Go\Aop\Aspect</span><span class="p">;</span>
</span><span class='line'><span class="k">use</span> <span class="nx">Go\Aop\Intercept\MethodInvocation</span><span class="p">;</span>
</span><span class='line'>
</span><span class='line'><span class="k">class</span> <span class="nc">LoggingAspect</span> <span class="k">implements</span> <span class="nx">Aspect</span>
</span><span class='line'><span class="p">{</span>
</span><span class='line'>    <span class="sd">/**</span>
</span><span class='line'><span class="sd">     * Instance of logger (injected in constructor or by setter)</span>
</span><span class='line'><span class="sd">     */</span>
</span><span class='line'>    <span class="k">protected</span> <span class="nv">$logger</span><span class="p">;</span>
</span><span class='line'>
</span><span class='line'>    <span class="k">public</span> <span class="k">function</span> <span class="nf">beforeMethodExecution</span><span class="p">(</span><span class="nx">MethodInvocation</span> <span class="nv">$invocation</span><span class="p">)</span>
</span><span class='line'>    <span class="p">{</span>
</span><span class='line'>        <span class="nv">$this</span><span class="o">-&gt;</span><span class="na">logger</span><span class="o">-&gt;</span><span class="na">info</span><span class="p">(</span><span class="s2">&quot;Executing &quot;</span> <span class="o">.</span> <span class="nv">$invocation</span><span class="o">-&gt;</span><span class="na">getMethod</span><span class="p">()</span><span class="o">-&gt;</span><span class="na">name</span><span class="p">,</span> <span class="nv">$invocation</span><span class="o">-&gt;</span><span class="na">getArguments</span><span class="p">());</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>There is one more question to solve: &ldquo;how to specify concrete methods?&rdquo;. This is known as a pointcut - the term given to the point of execution in the application at which cross-cutting concern needs to be applied.</p>

<p>Go! framework uses annotations for defining pointcuts. Pointcut syntax is like an SQL for the source code. To intercept each public and protected method in the class we can use &ldquo;within&rdquo; pointcut:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
</pre></td><td class='code'><pre><code class='php'><span class='line'><span class="cp">&lt;?php</span>
</span><span class='line'><span class="k">use</span> <span class="nx">Go\Aop\Aspect</span><span class="p">;</span>
</span><span class='line'><span class="k">use</span> <span class="nx">Go\Aop\Intercept\MethodInvocation</span><span class="p">;</span>
</span><span class='line'><span class="k">use</span> <span class="nx">Go\Lang\Annotation\After</span><span class="p">;</span>
</span><span class='line'><span class="k">use</span> <span class="nx">Go\Lang\Annotation\Before</span><span class="p">;</span>
</span><span class='line'><span class="k">use</span> <span class="nx">Go\Lang\Annotation\Around</span><span class="p">;</span>
</span><span class='line'>
</span><span class='line'><span class="k">class</span> <span class="nc">LoggingAspect</span> <span class="k">implements</span> <span class="nx">Aspect</span>
</span><span class='line'><span class="p">{</span>
</span><span class='line'>    <span class="sd">/**</span>
</span><span class='line'><span class="sd">     * Instance of logger (injected in constructor or by setter)</span>
</span><span class='line'><span class="sd">     */</span>
</span><span class='line'>    <span class="k">protected</span> <span class="nv">$logger</span><span class="p">;</span>
</span><span class='line'>
</span><span class='line'>    <span class="sd">/**</span>
</span><span class='line'><span class="sd">     * @Before(&quot;within(**)&quot;)</span>
</span><span class='line'><span class="sd">     */</span>
</span><span class='line'>    <span class="k">public</span> <span class="k">function</span> <span class="nf">beforeMethodExecution</span><span class="p">(</span><span class="nx">MethodInvocation</span> <span class="nv">$invocation</span><span class="p">)</span>
</span><span class='line'>    <span class="p">{</span>
</span><span class='line'>        <span class="nv">$this</span><span class="o">-&gt;</span><span class="na">logger</span><span class="o">-&gt;</span><span class="na">info</span><span class="p">(</span><span class="s2">&quot;Executing &quot;</span> <span class="o">.</span> <span class="nv">$invocation</span><span class="o">-&gt;</span><span class="na">getMethod</span><span class="p">()</span><span class="o">-&gt;</span><span class="na">name</span><span class="p">,</span> <span class="nv">$invocation</span><span class="o">-&gt;</span><span class="na">getArguments</span><span class="p">());</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>Pointcut syntax allows many constructions, for example: &ldquo;within(My\Super\Class)&rdquo;, &ldquo;execution(public ClassName-><em>(</em>))&rdquo;, &ldquo;@annotation(Annotation\Class\Name)&rdquo; and more. You can play with pointcuts to look at result )</p>

<p>To register the aspect just add an instance of it in the <code>configureAop()</code> method of the kernel:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
</pre></td><td class='code'><pre><code class='php'><span class='line'><span class="cp">&lt;?php</span>
</span><span class='line'><span class="c1">// app/ApplicationAspectKernel.php</span>
</span><span class='line'>
</span><span class='line'><span class="k">use</span> <span class="nx">LoggingAspect</span><span class="p">;</span>
</span><span class='line'>
</span><span class='line'><span class="c1">//...</span>
</span><span class='line'>
</span><span class='line'>    <span class="k">protected</span> <span class="k">function</span> <span class="nf">configureAop</span><span class="p">(</span><span class="nx">AspectContainer</span> <span class="nv">$container</span><span class="p">)</span>
</span><span class='line'>    <span class="p">{</span>
</span><span class='line'>        <span class="nv">$container</span><span class="o">-&gt;</span><span class="na">registerAspect</span><span class="p">(</span><span class="k">new</span> <span class="nx">LoggingAspect</span><span class="p">());</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'>
</span><span class='line'><span class="c1">//...</span>
</span></code></pre></td></tr></table></div></figure>


<p>If you don&rsquo;t know how to inject a logger, you can try to initialize it in the aspect constructor:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
<span class='line-number'>29</span>
<span class='line-number'>30</span>
<span class='line-number'>31</span>
<span class='line-number'>32</span>
</pre></td><td class='code'><pre><code class='php'><span class='line'><span class="cp">&lt;?php</span>
</span><span class='line'><span class="k">use</span> <span class="nx">Go\Aop\Aspect</span><span class="p">;</span>
</span><span class='line'><span class="k">use</span> <span class="nx">Go\Aop\Intercept\MethodInvocation</span><span class="p">;</span>
</span><span class='line'><span class="k">use</span> <span class="nx">Go\Lang\Annotation\After</span><span class="p">;</span>
</span><span class='line'><span class="k">use</span> <span class="nx">Go\Lang\Annotation\Before</span><span class="p">;</span>
</span><span class='line'><span class="k">use</span> <span class="nx">Go\Lang\Annotation\Around</span><span class="p">;</span>
</span><span class='line'>
</span><span class='line'><span class="k">use</span> <span class="nx">Monolog</span><span class="p">;</span>
</span><span class='line'>
</span><span class='line'><span class="sd">/**</span>
</span><span class='line'><span class="sd"> * Logging aspect</span>
</span><span class='line'><span class="sd"> */</span>
</span><span class='line'><span class="k">class</span> <span class="nc">LoggingAspect</span> <span class="k">implements</span> <span class="nx">Aspect</span>
</span><span class='line'><span class="p">{</span>
</span><span class='line'>    <span class="k">protected</span> <span class="nv">$logger</span><span class="p">;</span>
</span><span class='line'>
</span><span class='line'>    <span class="k">public</span> <span class="k">function</span> <span class="nf">__construct</span><span class="p">()</span>
</span><span class='line'>    <span class="p">{</span>
</span><span class='line'>        <span class="nv">$this</span><span class="o">-&gt;</span><span class="na">logger</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">Monolog\Logger</span><span class="p">(</span><span class="s1">&#39;test&#39;</span><span class="p">);</span>
</span><span class='line'>        <span class="nv">$this</span><span class="o">-&gt;</span><span class="na">logger</span><span class="o">-&gt;</span><span class="na">pushHandler</span><span class="p">(</span><span class="k">new</span> <span class="nx">Monolog\Handler\StreamHandler</span><span class="p">(</span><span class="s1">&#39;php://output&#39;</span><span class="p">));</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>    <span class="sd">/**</span>
</span><span class='line'><span class="sd">     * @Before(&quot;within(**)&quot;)</span>
</span><span class='line'><span class="sd">     */</span>
</span><span class='line'>    <span class="k">public</span> <span class="k">function</span> <span class="nf">beforeMethodExecution</span><span class="p">(</span><span class="nx">MethodInvocation</span> <span class="nv">$invocation</span><span class="p">)</span>
</span><span class='line'>    <span class="p">{</span>
</span><span class='line'>        <span class="nv">$obj</span>   <span class="o">=</span> <span class="nv">$invocation</span><span class="o">-&gt;</span><span class="na">getThis</span><span class="p">();</span>
</span><span class='line'>        <span class="nv">$class</span> <span class="o">=</span> <span class="nv">$obj</span> <span class="o">===</span> <span class="p">(</span><span class="nx">object</span><span class="p">)</span><span class="nv">$obj</span> <span class="o">?</span> <span class="nb">get_class</span><span class="p">(</span><span class="nv">$obj</span><span class="p">)</span> <span class="o">:</span> <span class="nv">$obj</span><span class="p">;</span>
</span><span class='line'>        <span class="nv">$this</span><span class="o">-&gt;</span><span class="na">logger</span><span class="o">-&gt;</span><span class="na">info</span><span class="p">(</span><span class="s2">&quot;Executing &quot;</span> <span class="o">.</span> <span class="nv">$class</span><span class="o">.</span><span class="s1">&#39;-&gt;&#39;</span><span class="o">.</span><span class="nv">$invocation</span><span class="o">-&gt;</span><span class="na">getMethod</span><span class="p">()</span><span class="o">-&gt;</span><span class="na">name</span><span class="p">,</span> <span class="nv">$invocation</span><span class="o">-&gt;</span><span class="na">getArguments</span><span class="p">());</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>If you run an application you can get an output like this (example for a Go! <a href="https://github.com/lisachenko/go-aop-php/blob/master/demos/life.php">demo</a>):</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
</pre></td><td class='code'><pre><code class='php'><span class='line'><span class="x">Want to eat something, let&#39;s have a breakfast!&lt;br&gt;</span>
</span><span class='line'><span class="x">[2013-06-02 11:50:14] test.INFO: Executing Example\Human-&gt;eat [] []</span>
</span><span class='line'><span class="x">[2013-06-02 11:50:14] test.INFO: Executing Example\Human-&gt;washUp [] []</span>
</span><span class='line'><span class="x">Washing up...&lt;br&gt;</span>
</span><span class='line'><span class="x">Eating...&lt;br&gt;</span>
</span><span class='line'><span class="x">[2013-06-02 11:50:14] test.INFO: Executing Example\Human-&gt;cleanTeeth [] []</span>
</span><span class='line'><span class="x">Cleaning teeth...&lt;br&gt;</span>
</span><span class='line'><span class="x">I should work to earn some money&lt;br&gt;</span>
</span><span class='line'><span class="x">[2013-06-02 11:50:14] test.INFO: Executing Example\Human-&gt;work [] []</span>
</span><span class='line'><span class="x">Working...&lt;br&gt;</span>
</span><span class='line'><span class="x">It was a nice day, go to bed&lt;br&gt;</span>
</span><span class='line'><span class="x">[2013-06-02 11:50:14] test.INFO: Executing Example\Human-&gt;cleanTeeth [] []</span>
</span><span class='line'><span class="x">Cleaning teeth...&lt;br&gt;</span>
</span><span class='line'><span class="x">[2013-06-02 11:50:14] test.INFO: Executing Example\Human-&gt;sleep [] []</span>
</span><span class='line'><span class="x">Go to sleep...&lt;br&gt;</span>
</span><span class='line'><span class="x">[2013-06-02 11:50:14] test.INFO: Executing Example\User-&gt;setName [&quot;test&quot;] []</span>
</span><span class='line'><span class="x">[2013-06-02 11:50:14] test.INFO: Executing Example\User-&gt;setSurname [&quot;a&quot;] []</span>
</span><span class='line'><span class="x">[2013-06-02 11:50:14] test.INFO: Executing Example\User-&gt;setPassword [&quot;root&quot;] []</span>
</span></code></pre></td></tr></table></div></figure>


<p>So, we have implemented logging without changes in the original source code! Have a nice experiments!</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Implementing reusable fluent interface pattern in PHP with AOP]]></title>
    <link href="http://go.aopphp.com/blog/2013/03/19/implementing-fluent-interface-pattern-in-php/"/>
    <updated>2013-03-19T22:44:00+03:00</updated>
    <id>http://go.aopphp.com/blog/2013/03/19/implementing-fluent-interface-pattern-in-php</id>
    <content type="html"><![CDATA[<p>During software development one of the most important goals is the readability of source code. There are special
techniques and tips that help us to improve the readability of source code. One of the techniques of improving the
source code readability is using of fluent interfaces. Let&rsquo;s discuss it in this article.</p>

<!-- more -->


<h3>Evolution. From simple to complex.</h3>

<p>Every programmer starts with the language by writing a trivial &ldquo;Hello, world!&rdquo;. After that, it takes several years to
learn the language and to make clumsy attempts to write his own ORM / CMS / Framework (underline one or several). I
think that everyone has the code which is better to hide. But without understanding of simple things you will not be
able to understand the complex ones, so let&rsquo;s start with a simple example and get to the implementation of the &ldquo;fluent&rdquo;
interface as a separate class using AOP. Those who know this pattern can safely move on to the last part of the article,
where you can get excellent food for thoughts.</p>

<p>Let&rsquo;s start!</p>

<p>Let&rsquo;s take a simple user entity, which has the following properties: name, last name and the password:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
</pre></td><td class='code'><pre><code class='php'><span class='line'><span class="cp">&lt;?php</span>
</span><span class='line'><span class="k">class</span> <span class="nc">User</span>
</span><span class='line'><span class="p">{</span>
</span><span class='line'><span class="err">    </span><span class="k">public</span> <span class="nv">$name</span><span class="p">;</span>
</span><span class='line'><span class="err">    </span><span class="k">public</span> <span class="nv">$surname</span><span class="p">;</span>
</span><span class='line'><span class="err">    </span><span class="k">public</span> <span class="nv">$password</span><span class="p">;</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>An excellent class that is easy to use:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
</pre></td><td class='code'><pre><code class='php'><span class='line'><span class="cp">&lt;?php</span>
</span><span class='line'><span class="nv">$user</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">User</span><span class="p">;</span>
</span><span class='line'>
</span><span class='line'><span class="nv">$user</span><span class="o">-&gt;</span><span class="na">name</span> <span class="o">=</span> <span class="s1">&#39;John&#39;</span><span class="p">;</span>
</span><span class='line'><span class="nv">$user</span><span class="o">-&gt;</span><span class="na">surname</span> <span class="o">=</span> <span class="s1">&#39;Doe&#39;</span><span class="p">;</span>
</span><span class='line'><span class="nv">$user</span><span class="o">-&gt;</span><span class="na">password</span> <span class="o">=</span> <span class="s1">&#39;root&#39;</span><span class="p">;</span>
</span></code></pre></td></tr></table></div></figure>


<p>It is easy to notice that we have no validation and somebody can set a blank password, which is not very good. In
addition, it would be nice to know that the field values are immutable. These several considerations lead us to the
idea that properties should be protected or private and access to them should be carried out with a pair of getter / setter.</p>

<p>Suit the action to the word:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
</pre></td><td class='code'><pre><code class='php'><span class='line'><span class="cp">&lt;?php</span>
</span><span class='line'><span class="k">class</span> <span class="nc">User</span>
</span><span class='line'><span class="p">{</span>
</span><span class='line'>    <span class="k">protected</span> <span class="nv">$name</span><span class="p">;</span>
</span><span class='line'>    <span class="k">protected</span> <span class="nv">$surname</span><span class="p">;</span>
</span><span class='line'>    <span class="k">protected</span> <span class="nv">$password</span><span class="p">;</span>
</span><span class='line'>
</span><span class='line'>    <span class="k">public</span> <span class="k">function</span> <span class="nf">setName</span><span class="p">(</span><span class="nv">$name</span><span class="p">)</span>
</span><span class='line'>    <span class="p">{</span>
</span><span class='line'>        <span class="nv">$this</span><span class="o">-&gt;</span><span class="na">name</span> <span class="o">=</span> <span class="nv">$name</span><span class="p">;</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>    <span class="k">public</span> <span class="k">function</span> <span class="nf">setSurname</span><span class="p">(</span><span class="nv">$surname</span><span class="p">)</span>
</span><span class='line'>    <span class="p">{</span>
</span><span class='line'>        <span class="nv">$this</span><span class="o">-&gt;</span><span class="na">surname</span> <span class="o">=</span> <span class="nv">$surname</span><span class="p">;</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>    <span class="k">public</span> <span class="k">function</span> <span class="nf">setPassword</span><span class="p">(</span><span class="nv">$password</span><span class="p">)</span>
</span><span class='line'>    <span class="p">{</span>
</span><span class='line'>        <span class="k">if</span> <span class="p">(</span><span class="o">!</span><span class="nv">$password</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>            <span class="k">throw</span> <span class="k">new</span> <span class="nx">InvalidArgumentException</span><span class="p">(</span><span class="s2">&quot;Password shouldn&#39;t be empty&quot;</span><span class="p">);</span>
</span><span class='line'>        <span class="p">}</span>
</span><span class='line'>        <span class="nv">$this</span><span class="o">-&gt;</span><span class="na">password</span> <span class="o">=</span> <span class="nv">$password</span><span class="p">;</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>For the new class the configuration has changed a little and now we are using setters:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
</pre></td><td class='code'><pre><code class='php'><span class='line'><span class="cp">&lt;?php</span>
</span><span class='line'><span class="nv">$user</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">User</span><span class="p">;</span>
</span><span class='line'>
</span><span class='line'><span class="nv">$user</span><span class="o">-&gt;</span><span class="na">setName</span><span class="p">(</span><span class="s1">&#39;John&#39;</span><span class="p">);</span>
</span><span class='line'><span class="nv">$user</span><span class="o">-&gt;</span><span class="na">setSurname</span><span class="p">(</span><span class="s1">&#39;Doe&#39;</span><span class="p">);</span>
</span><span class='line'><span class="nv">$user</span><span class="o">-&gt;</span><span class="na">setPassword</span><span class="p">(</span><span class="s1">&#39;root&#39;</span><span class="p">);</span>
</span></code></pre></td></tr></table></div></figure>


<p>Not a big deal, right? But what if we need to set up 20 properties? 30 properties? This code will be flooded with setter
calls and $user variable references. If the variable name will be $superImportantUser then readability of the source
code deteriorates further. What can be done to get rid of the copy of the code?</p>

<h3>Fluent interface to the rescue!</h3>

<p>So, we came to the Fluent Interface pattern, which was coined by Eric Evans and Martin Fowler to increase readability of
source code by simplifying multiple calls to the same object. It is implemented by a chain of methods, transmitting the
calling context to the following method in the chain. The context is the return value of the method and this value can
be any object, including the current one.</p>

<p>To implement a fluent interface, we need all the methods-setters to return the current object:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
</pre></td><td class='code'><pre><code class='php'><span class='line'><span class="cp">&lt;?php</span>
</span><span class='line'><span class="k">class</span> <span class="nc">User</span>
</span><span class='line'><span class="p">{</span>
</span><span class='line'>    <span class="k">protected</span> <span class="nv">$name</span><span class="p">;</span>
</span><span class='line'>    <span class="k">protected</span> <span class="nv">$surname</span><span class="p">;</span>
</span><span class='line'>    <span class="k">protected</span> <span class="nv">$password</span><span class="p">;</span>
</span><span class='line'>
</span><span class='line'>    <span class="k">public</span> <span class="k">function</span> <span class="nf">setName</span><span class="p">(</span><span class="nv">$name</span><span class="p">)</span>
</span><span class='line'>    <span class="p">{</span>
</span><span class='line'>        <span class="nv">$this</span><span class="o">-&gt;</span><span class="na">name</span> <span class="o">=</span> <span class="nv">$name</span><span class="p">;</span>
</span><span class='line'>        <span class="k">return</span> <span class="nv">$this</span><span class="p">;</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>    <span class="k">public</span> <span class="k">function</span> <span class="nf">setSurname</span><span class="p">(</span><span class="nv">$surname</span><span class="p">)</span>
</span><span class='line'>    <span class="p">{</span>
</span><span class='line'>        <span class="nv">$this</span><span class="o">-&gt;</span><span class="na">surname</span> <span class="o">=</span> <span class="nv">$surname</span><span class="p">;</span>
</span><span class='line'>        <span class="k">return</span> <span class="nv">$this</span><span class="p">;</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>    <span class="k">public</span> <span class="k">function</span> <span class="nf">setPassword</span><span class="p">(</span><span class="nv">$password</span><span class="p">)</span>
</span><span class='line'>    <span class="p">{</span>
</span><span class='line'>        <span class="k">if</span> <span class="p">(</span><span class="o">!</span><span class="nv">$password</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>            <span class="k">throw</span> <span class="k">new</span> <span class="nx">InvalidArgumentException</span><span class="p">(</span><span class="s2">&quot;Password shouldn&#39;t be empty&quot;</span><span class="p">);</span>
</span><span class='line'>        <span class="p">}</span>
</span><span class='line'>        <span class="nv">$this</span><span class="o">-&gt;</span><span class="na">password</span> <span class="o">=</span> <span class="nv">$password</span><span class="p">;</span>
</span><span class='line'>        <span class="k">return</span> <span class="nv">$this</span><span class="p">;</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>This approach will allow us to make the call chain:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
</pre></td><td class='code'><pre><code class='php'><span class='line'><span class="cp">&lt;?php</span>
</span><span class='line'><span class="nv">$user</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">User</span><span class="p">;</span>
</span><span class='line'><span class="nv">$user</span><span class="o">-&gt;</span><span class="na">setName</span><span class="p">(</span><span class="s1">&#39;John&#39;</span><span class="p">)</span><span class="o">-&gt;</span><span class="na">setSurname</span><span class="p">(</span><span class="s1">&#39;Doe&#39;</span><span class="p">)</span><span class="o">-&gt;</span><span class="na">setPassword</span><span class="p">(</span><span class="s1">&#39;root&#39;</span><span class="p">);</span>
</span></code></pre></td></tr></table></div></figure>


<p>As you can see, the configuration of the object now takes up less space and is much easier to read. We achieved our
goal! At this point, many developers will ask: &ldquo;So what?&rdquo; Ok, then try to answer the question: &ldquo;What&rsquo;s wrong with fluent
interface in this way?&rdquo; before reading the next section.</p>

<h3>So what&rsquo;s bad in it?</h3>

<p>Perhaps you&rsquo;ve failed to find an answer and you&rsquo;ve decided to read further? ) Well, I can reassure you that it&rsquo;s all
fine with fluent interface in OOP. However, if you think about it, you can find out that it can&rsquo;t be implemented as a
separate class, interface or trait. So it can&rsquo;t be reused. This results in the fact that we have to put down &ldquo;return
$this&rdquo; at the end of each method to implement fluent interface. If we have a couple dozen classes with a couple dozen
methods that we want to do &ldquo;fluent&rdquo; then we have to manually deal with this unpleasant operation.
This is the classic crosscutting.</p>

<h3>Let&rsquo;s make it in a separate class</h3>

<p>Since we have a crosscutting, we must rise to the level above OOP to describe this pattern. Specification is pretty
simple: when calling public methods in a class, original object should be returned as the result of the method
invocation. Of course, we do not want unexpected effects, so let&rsquo;s be clear: methods should be public setters starting
with &ldquo;set&rdquo; and they should be inside classes that implement FluentInterface marker only . Let&rsquo;s describe this with AOP
and Go! AOP library.</p>

<p>First of all, our marker interface:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
</pre></td><td class='code'><pre><code class='php'><span class='line'><span class="cp">&lt;?php</span>
</span><span class='line'><span class="sd">/**</span>
</span><span class='line'><span class="sd"> * Fluent interface marker</span>
</span><span class='line'><span class="sd"> */</span>
</span><span class='line'><span class="k">interface</span> <span class="nx">FluentInterface</span>
</span><span class='line'><span class="p">{</span>
</span><span class='line'>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>Fluent interface implementation in the form of advice within aspect:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
</pre></td><td class='code'><pre><code class='php'><span class='line'><span class="cp">&lt;?php</span>
</span><span class='line'><span class="k">use</span> <span class="nx">Go\Aop\Aspect</span><span class="p">;</span>
</span><span class='line'><span class="k">use</span> <span class="nx">Go\Aop\Intercept\MethodInvocation</span><span class="p">;</span>
</span><span class='line'><span class="k">use</span> <span class="nx">Go\Lang\Annotation\Around</span><span class="p">;</span>
</span><span class='line'>
</span><span class='line'><span class="k">class</span> <span class="nc">FluentInterfaceAspect</span> <span class="k">implements</span> <span class="nx">Aspect</span>
</span><span class='line'><span class="p">{</span>
</span><span class='line'>    <span class="sd">/**</span>
</span><span class='line'><span class="sd">     * Fluent interface advice</span>
</span><span class='line'><span class="sd">     *</span>
</span><span class='line'><span class="sd">     * @Around(&quot;within(FluentInterface+) &amp;&amp; execution(public **-&gt;set*(*))&quot;)</span>
</span><span class='line'><span class="sd">     *</span>
</span><span class='line'><span class="sd">     * @param MethodInvocation $invocation</span>
</span><span class='line'><span class="sd">     * @return mixed|null|object</span>
</span><span class='line'><span class="sd">     */</span>
</span><span class='line'>    <span class="k">protected</span> <span class="k">function</span> <span class="nf">aroundMethodExecution</span><span class="p">(</span><span class="nx">MethodInvocation</span> <span class="nv">$invocation</span><span class="p">)</span>
</span><span class='line'>    <span class="p">{</span>
</span><span class='line'>        <span class="nv">$result</span> <span class="o">=</span> <span class="nv">$invocation</span><span class="o">-&gt;</span><span class="na">proceed</span><span class="p">();</span>
</span><span class='line'>        <span class="k">return</span> <span class="nv">$result</span><span class="o">!==</span><span class="k">null</span> <span class="o">?</span> <span class="nv">$result</span> <span class="o">:</span> <span class="nv">$invocation</span><span class="o">-&gt;</span><span class="na">getThis</span><span class="p">();</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>Just a quick explanation - &ldquo;Around&rdquo; advice sets the hook &ldquo;around&rdquo; the original method and is fully responsible for
whether the original method will be called or not, and is responsible for the result that will be returned. In the
advice, we call original method (setter invocation) and if it doesn&rsquo;t return anything we just return the original
object $invocation->getThis(). That is all ) That is a useful pattern implementation just in a few lines of code. Using
the fluent interface is now easy and sexy :)</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
</pre></td><td class='code'><pre><code class='php'><span class='line'><span class="cp">&lt;?php</span>
</span><span class='line'><span class="k">class</span> <span class="nc">User</span> <span class="k">implements</span> <span class="nx">FluentInterface</span>
</span><span class='line'><span class="p">{</span>
</span><span class='line'>    <span class="k">protected</span> <span class="nv">$name</span><span class="p">;</span>
</span><span class='line'>    <span class="k">protected</span> <span class="nv">$surname</span><span class="p">;</span>
</span><span class='line'>    <span class="k">protected</span> <span class="nv">$password</span><span class="p">;</span>
</span><span class='line'>
</span><span class='line'>    <span class="k">public</span> <span class="k">function</span> <span class="nf">setName</span><span class="p">(</span><span class="nv">$name</span><span class="p">)</span>
</span><span class='line'>    <span class="p">{</span>
</span><span class='line'>        <span class="nv">$this</span><span class="o">-&gt;</span><span class="na">name</span> <span class="o">=</span> <span class="nv">$name</span><span class="p">;</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>    <span class="k">public</span> <span class="k">function</span> <span class="nf">setSurname</span><span class="p">(</span><span class="nv">$surname</span><span class="p">)</span>
</span><span class='line'>    <span class="p">{</span>
</span><span class='line'>        <span class="nv">$this</span><span class="o">-&gt;</span><span class="na">surname</span> <span class="o">=</span> <span class="nv">$surname</span><span class="p">;</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>    <span class="k">public</span> <span class="k">function</span> <span class="nf">setPassword</span><span class="p">(</span><span class="nv">$password</span><span class="p">)</span>
</span><span class='line'>    <span class="p">{</span>
</span><span class='line'>        <span class="k">if</span> <span class="p">(</span><span class="o">!</span><span class="nv">$password</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>            <span class="k">throw</span> <span class="k">new</span> <span class="nx">InvalidArgumentException</span><span class="p">(</span><span class="s2">&quot;Password shouldn&#39;t be empty&quot;</span><span class="p">);</span>
</span><span class='line'>        <span class="p">}</span>
</span><span class='line'>        <span class="nv">$this</span><span class="o">-&gt;</span><span class="na">password</span> <span class="o">=</span> <span class="nv">$password</span><span class="p">;</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>And usage:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
</pre></td><td class='code'><pre><code class='php'><span class='line'><span class="cp">&lt;?php</span>
</span><span class='line'><span class="nv">$user</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">User</span><span class="p">;</span>
</span><span class='line'><span class="nv">$user</span><span class="o">-&gt;</span><span class="na">setName</span><span class="p">(</span><span class="s1">&#39;John&#39;</span><span class="p">)</span><span class="o">-&gt;</span><span class="na">setSurname</span><span class="p">(</span><span class="s1">&#39;Doe&#39;</span><span class="p">)</span><span class="o">-&gt;</span><span class="na">setPassword</span><span class="p">(</span><span class="s1">&#39;root&#39;</span><span class="p">);</span>
</span></code></pre></td></tr></table></div></figure>


<p>No more copying &ldquo;return $this&rdquo; for hundreds of methods, only pure source code, intuitive FluentInterface and
implementation of FluentInterface in the form of a simple aspect.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Aspect-Oriented Framework for PHP]]></title>
    <link href="http://go.aopphp.com/blog/2013/02/11/aspect-oriented-framework-for-php/"/>
    <updated>2013-02-11T22:55:00+03:00</updated>
    <id>http://go.aopphp.com/blog/2013/02/11/aspect-oriented-framework-for-php</id>
    <content type="html"><![CDATA[<p>Go! is a PHP 5.4 framework based on OOP and AOP paradigms and designed by Lisachenko Alexander.
It allows developers to add support of AOP to every PHP application.</p>

<p>Go! doesn&rsquo;t require any PECL-extentions, it neither uses any dark magic of Runkit nor evals, the library doesn&rsquo;t use DI-containers.
The code with weaved aspects is fully readable and native, it can be easily debugged with XDebug.
You can debug either classes or aspects.
The main advantage of Go! is that potentially it can be installed in every PHP-application,
because you don&rsquo;t have to change the application source code at all.
As an example, with the help of 10-20 lines of code we can intercept all the public, protected and static methods in all the classes
of application and display the name and the arguments of each method during its execution.</p>

<h2>What is AOP?</h2>

<p><a href="http://en.wikipedia.org/wiki/Aspect-oriented_programming">AOP (Aspect-Oriented Programming)</a> is an approach to cross-cutting concerns, where the concerns are designed and implemented
in a &ldquo;modular&rdquo; way (that is, with appropriate encapsulation, lack of duplication, etc.), then integrated into all the relevant
execution points in a succinct and robust way, e.g. through declarative or programmatic means.</p>

<p>In AOP terms, the execution points are called join points, a particular set of them is called a pointcut and the new
behavior that is executed before, after, or &ldquo;around&rdquo; a join point is called advice. You can read more about AOP in
<a href="http://go.aopphp.com/docs/introduction/">Introduction</a> section.</p>

<p>PHP traits can be used to implement some aspect-like functionality.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[SymfonyCampUA-2012 presentation]]></title>
    <link href="http://go.aopphp.com/blog/2012/12/02/symfonycampua-2012-presentation-about-weaving-of-aspects-with-go-aop-library/"/>
    <updated>2012-12-02T00:00:00+03:00</updated>
    <id>http://go.aopphp.com/blog/2012/12/02/symfonycampua-2012-presentation-about-weaving-of-aspects-with-go-aop-library</id>
    <content type="html"><![CDATA[<iframe src="http://www.slideshare.net/slideshow/embed_code/15487433?rel=0" width="597" height="486" frameborder="0" marginwidth="0" marginheight="0" scrolling="no" style="border:1px solid #CCC;border-width:1px 1px 0;margin-bottom:5px" allowfullscreen webkitallowfullscreen mozallowfullscreen>
</iframe>

]]></content>
  </entry>
  
</feed>
