<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: alexdodonov</title>
    <description>The latest articles on DEV Community by alexdodonov (@alexdodonov).</description>
    <link>https://dev.to/alexdodonov</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F330982%2Ff26ac4da-f89b-4ad6-8edb-29706862450b.png</url>
      <title>DEV Community: alexdodonov</title>
      <link>https://dev.to/alexdodonov</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/alexdodonov"/>
    <language>en</language>
    <item>
      <title>New achivements of Mezon PHP Framework - August 2022</title>
      <dc:creator>alexdodonov</dc:creator>
      <pubDate>Wed, 10 Aug 2022 16:43:00 +0000</pubDate>
      <link>https://dev.to/alexdodonov/new-achivements-of-mezon-php-framework-august-2022-bfe</link>
      <guid>https://dev.to/alexdodonov/new-achivements-of-mezon-php-framework-august-2022-bfe</guid>
      <description>&lt;p&gt;Hi! Today I'am going to continue posting news about &lt;a href="https://github.com/alexdodonov/mezon"&gt;Mezon Framework&lt;/a&gt; improvements.&lt;/p&gt;

&lt;h2&gt;
  
  
  Mezon Router bugfix
&lt;/h2&gt;

&lt;p&gt;In &lt;a href="https://github.com/alexdodonov/mezon-router"&gt;1.5.x&lt;/a&gt; version the bug was fixed for routers wich return &lt;code&gt;false&lt;/code&gt;. In previous versions of router &lt;code&gt;false&lt;/code&gt; value was traited like 'Route handler was not foud' what was obviously buggy behaviour.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="nv"&gt;$router&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;$this&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;getRouter&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="nv"&gt;$router&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;addRoute&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'/catalog/[a:cat_id]/'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="p"&gt;():&lt;/span&gt; &lt;span class="kt"&gt;bool&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="c1"&gt;// test body&lt;/span&gt;
&lt;span class="nv"&gt;$result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;$router&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;callRoute&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'/catalog/foo/'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Earlier this code caused exception but now is working fine.&lt;/p&gt;

&lt;h2&gt;
  
  
  Mezon Router refactoring
&lt;/h2&gt;

&lt;p&gt;Lots of duplicate code was removed.&lt;/p&gt;

&lt;h2&gt;
  
  
  Non-ASCII parameters were implemented in the Mezon Router
&lt;/h2&gt;

&lt;p&gt;Non-ASCII parameters were implemented as was requested in &lt;a href="https://github.com/alexdodonov/mezon-router/issues/35"&gt;this issue&lt;/a&gt;. Now this code works fine:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="nv"&gt;$router&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;$this&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;getRouter&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="nc"&gt;RouterUnitTestUtils&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;setRequestMethod&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'GET'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="nv"&gt;$router&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;addRoute&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
     &lt;span class="s1"&gt;'кириллический-урл/[s:non-ascii-param]'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
     &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="nv"&gt;$route&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;array&lt;/span&gt; &lt;span class="nv"&gt;$params&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
          &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nv"&gt;$params&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'non-ascii-param'&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
     &lt;span class="p"&gt;},&lt;/span&gt;
&lt;span class="s1"&gt;'GET'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="nb"&gt;var_dump&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$router&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;callRoute&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;urlencode&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'кириллический-урл/ни разу не ASCII - 日本語'&lt;/span&gt;&lt;span class="p"&gt;)));&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  The bug in the Mezon Template Engine was fixed
&lt;/h2&gt;

&lt;p&gt;1 bug in the &lt;a href="https://github.com/alexdodonov/mezon-template-engine"&gt;Mezon Template Engine&lt;/a&gt; was fixed. I already don't remember what it was about. Just be sure - now it is less buggy )&lt;/p&gt;

</description>
      <category>php</category>
      <category>mezon</category>
      <category>api</category>
      <category>framework</category>
    </item>
    <item>
      <title>New achivements of Mezon PHP Framework</title>
      <dc:creator>alexdodonov</dc:creator>
      <pubDate>Thu, 16 Jun 2022 05:49:17 +0000</pubDate>
      <link>https://dev.to/alexdodonov/new-achivements-of-mezon-php-framework-4g3h</link>
      <guid>https://dev.to/alexdodonov/new-achivements-of-mezon-php-framework-4g3h</guid>
      <description>&lt;p&gt;Hi all! Today I want to try a new format with Mezon Framework news. May be it will be more interesting for you.&lt;/p&gt;

&lt;h2&gt;
  
  
  Replacing Laravel with Mezon Router
&lt;/h2&gt;

&lt;p&gt;It was quite surprising for me but some people use Mezon Router to replace Laravel’s one. &lt;a href="https://github.com/alexdodonov/mezon-router/issues/18#issuecomment-1012926779"&gt;Here is the proof&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You can also refer to it if you need migration tips.&lt;/p&gt;

&lt;h2&gt;
  
  
  Non-ASCII routes in Mezon Router
&lt;/h2&gt;

&lt;p&gt;Another news for my router. New feature was implemented after the issue was &lt;a href="https://github.com/alexdodonov/mezon-router/issues/33"&gt;submitted&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;If you need new featured in the router or in other packages of the Mezon Framework – please feel free to submit them )&lt;/p&gt;

&lt;p&gt;But as we are speaking about non-ASCII routes let’s look at the simple example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="nv"&gt;$router&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;addGetRoute&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'кириллический-урл'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;...&lt;/span&gt;&lt;span class="n"&gt;callback&lt;/span&gt;&lt;span class="mf"&gt;...&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;No changes in your code required. You can use non-ASCII routes as common routes.&lt;/p&gt;

&lt;h2&gt;
  
  
  Plugin manager
&lt;/h2&gt;

&lt;p&gt;Here I want to make a simple announce – right now I do small plugin manager wich can made web applications more  granular. &lt;br&gt;
&lt;a href="https://twitter.com/mezonphp"&gt;Subscribe for updates )&lt;/a&gt;&lt;/p&gt;

</description>
      <category>php</category>
      <category>router</category>
      <category>mezon</category>
      <category>framework</category>
    </item>
    <item>
      <title>PHP Framework for creating mockable code</title>
      <dc:creator>alexdodonov</dc:creator>
      <pubDate>Tue, 31 May 2022 05:50:34 +0000</pubDate>
      <link>https://dev.to/alexdodonov/php-framework-for-creating-mockable-code-5d9d</link>
      <guid>https://dev.to/alexdodonov/php-framework-for-creating-mockable-code-5d9d</guid>
      <description>&lt;h3&gt;
  
  
  Intro
&lt;/h3&gt;

&lt;p&gt;This class provides abstractions from basic infrastructure things wich can make you unit-testing harder. For example:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;console output&lt;/li&gt;
&lt;li&gt;file system operations&lt;/li&gt;
&lt;li&gt;GD library&lt;/li&gt;
&lt;li&gt;redirections&lt;/li&gt;
&lt;li&gt;sessions&lt;/li&gt;
&lt;li&gt;system methods&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you will write your code using this framework then your unit-tests will be much easier to write and support. And as aconsequence - your code will be more stable.&lt;/p&gt;

&lt;h2&gt;
  
  
  Basic concepts
&lt;/h2&gt;

&lt;p&gt;Each abstraction can be setup to use either native function calls (such as file_get_contents) or mockups.&lt;/p&gt;

&lt;p&gt;Mockuped calls can be used in your unit-tests. And native calls will be executed in production.&lt;/p&gt;

&lt;p&gt;Let's see some real code examples:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="c1"&gt;// here we setup mock calls&lt;/span&gt;
&lt;span class="err"&gt;\&lt;/span&gt;&lt;span class="nc"&gt;Mezon\Conf\Conf&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;setConfigStringValue&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'fs/layer'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'mock'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="c1"&gt;// here we setup that mock will return true if the we check that this directory exists&lt;/span&gt;
&lt;span class="err"&gt;\&lt;/span&gt;&lt;span class="nc"&gt;Mezon\Fs\Layer&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nv"&gt;$createdDirectories&lt;/span&gt;&lt;span class="p"&gt;[]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
    &lt;span class="s1"&gt;'path'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s1"&gt;'path-to-existing-directory'&lt;/span&gt;
&lt;span class="p"&gt;];&lt;/span&gt;

&lt;span class="c1"&gt;// here we will get true&lt;/span&gt;
&lt;span class="nb"&gt;var_dump&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="err"&gt;\&lt;/span&gt;&lt;span class="nc"&gt;Mezon\Fs\Layer&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;directoryExists&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'path-to-existing-directory'&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;

&lt;span class="c1"&gt;// and here we will get false&lt;/span&gt;
&lt;span class="nb"&gt;var_dump&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="err"&gt;\&lt;/span&gt;&lt;span class="nc"&gt;Mezon\Fs\Layer&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;directoryExists&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'path-to-unexisting-directory'&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In both calls &lt;code&gt;Mezon\Fs\Layer::directoryExists&lt;/code&gt; no real call of method &lt;code&gt;file_exists&lt;/code&gt; was performed.&lt;/p&gt;

&lt;p&gt;No let's see what abstractions we have&lt;/p&gt;

&lt;h2&gt;
  
  
  Console layer
&lt;/h2&gt;

&lt;p&gt;Class &lt;code&gt;Mezon\Console\Layer&lt;/code&gt; provides abstractions for working winth console&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="c1"&gt;// here we setup mock calls&lt;/span&gt;
&lt;span class="nc"&gt;Conf&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;setConfigStringValue&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'console/layer'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'mock'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="c1"&gt;// setup values wich will be returned by the method Mezon\Console\Layer::readline()&lt;/span&gt;
&lt;span class="err"&gt;\&lt;/span&gt;&lt;span class="nc"&gt;Mezon\Console\Layer&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nv"&gt;$readlines&lt;/span&gt;&lt;span class="p"&gt;[]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'line 1'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="err"&gt;\&lt;/span&gt;&lt;span class="nc"&gt;Mezon\Console\Layer&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nv"&gt;$readlines&lt;/span&gt;&lt;span class="p"&gt;[]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'line 2'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="c1"&gt;// read lines&lt;/span&gt;
&lt;span class="c1"&gt;// note that native php method `readline` will noe be called&lt;/span&gt;
&lt;span class="c1"&gt;// just returning value of the Mezon\Console\Layer::$readlines array&lt;/span&gt;
&lt;span class="k"&gt;echo&lt;/span&gt; &lt;span class="err"&gt;\&lt;/span&gt;&lt;span class="nc"&gt;Mezon\Console\Layer&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nb"&gt;readline&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt; &lt;span class="c1"&gt;// ouputs 'line 1'&lt;/span&gt;
&lt;span class="k"&gt;echo&lt;/span&gt; &lt;span class="err"&gt;\&lt;/span&gt;&lt;span class="nc"&gt;Mezon\Console\Layer&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nb"&gt;readline&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt; &lt;span class="c1"&gt;// ouputs 'line 2'&lt;/span&gt;

&lt;span class="c1"&gt;// here we setup native php methods calls&lt;/span&gt;
&lt;span class="nc"&gt;Conf&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;setConfigStringValue&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'console/layer'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'real'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="k"&gt;echo&lt;/span&gt; &lt;span class="err"&gt;\&lt;/span&gt;&lt;span class="nc"&gt;Mezon\Console\Layer&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nb"&gt;readline&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt; &lt;span class="c1"&gt;// outputs string wich you will input in the console&lt;/span&gt;
&lt;span class="c1"&gt;// because in this line real method `readline` will be called&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  File system layer
&lt;/h2&gt;

&lt;p&gt;This package also have abstractions for file systems routine:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="c1"&gt;// here we setup mock calls&lt;/span&gt;
&lt;span class="nc"&gt;Conf&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;setConfigStringValue&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'fs/layer'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'mock'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="c1"&gt;// writing file&lt;/span&gt;
&lt;span class="err"&gt;\&lt;/span&gt;&lt;span class="nc"&gt;Mezon\Fs\Layer&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;filePutContents&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'file-path'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'data'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="no"&gt;FILE_APPEND&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="c1"&gt;// ^^^ but in this call all file content will be stored into memory, not on disk&lt;/span&gt;
&lt;span class="c1"&gt;// on production this call works like file_put_contents&lt;/span&gt;

&lt;span class="c1"&gt;// creating directory&lt;/span&gt;
&lt;span class="err"&gt;\&lt;/span&gt;&lt;span class="nc"&gt;Mezon\Fs\Layer&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;createDirectory&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'new-dir'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="c1"&gt;// ^^^ real directory also is not created&lt;/span&gt;

&lt;span class="c1"&gt;// checking if the directory exists&lt;/span&gt;
&lt;span class="k"&gt;echo&lt;/span&gt; &lt;span class="err"&gt;\&lt;/span&gt;&lt;span class="nc"&gt;Mezon\Fs\Layer&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;directoryExists&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'new-dir'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// we shall see 'true', because we have called \Mezon\Fs\Layer::createDirectory('new-dir');&lt;/span&gt;
&lt;span class="k"&gt;echo&lt;/span&gt; &lt;span class="err"&gt;\&lt;/span&gt;&lt;span class="nc"&gt;Mezon\Fs\Layer&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;directoryExists&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'unexisting-dir'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// we shall see 'false'&lt;/span&gt;

&lt;span class="c1"&gt;// checking if the file exists&lt;/span&gt;
&lt;span class="k"&gt;echo&lt;/span&gt; &lt;span class="err"&gt;\&lt;/span&gt;&lt;span class="nc"&gt;Mezon\Fs\Layer&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;fileExists&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'file-path'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// we shall see 'true', because we have called \Mezon\Fs\Layer::filePutContents('file-path', 'data', FILE_APPEND)&lt;/span&gt;
&lt;span class="k"&gt;echo&lt;/span&gt; &lt;span class="err"&gt;\&lt;/span&gt;&lt;span class="nc"&gt;Mezon\Fs\Layer&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;fileExists&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'unexisting-file-path'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// we shall see 'false'&lt;/span&gt;

&lt;span class="c1"&gt;// getting file contents&lt;/span&gt;
&lt;span class="k"&gt;echo&lt;/span&gt; &lt;span class="err"&gt;\&lt;/span&gt;&lt;span class="nc"&gt;Mezon\Fs\Layer&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;fileGutContents&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'file-path'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// we shall see 'data', because we have already called \Mezon\Fs\Layer::filePutContents('file-path', 'data', FILE_APPEND)&lt;/span&gt;
&lt;span class="k"&gt;echo&lt;/span&gt; &lt;span class="err"&gt;\&lt;/span&gt;&lt;span class="nc"&gt;Mezon\Fs\Layer&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;fileGutContents&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'unexisting-file-path'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// we shall see 'false'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  In-memory file system
&lt;/h2&gt;

&lt;p&gt;Almost all methods from &lt;code&gt;\Mezon\Fs\Layer&lt;/code&gt; in mock mode use &lt;code&gt;\Mezon\Fs\InMemory&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="c1"&gt;// writing data in memory file system&lt;/span&gt;
&lt;span class="err"&gt;\&lt;/span&gt;&lt;span class="nc"&gt;Mezon\Fs\InMemory&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;filePutContents&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'file-path'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'data'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="c1"&gt;// reading data from inmemory file system&lt;/span&gt;
&lt;span class="k"&gt;echo&lt;/span&gt; &lt;span class="err"&gt;\&lt;/span&gt;&lt;span class="nc"&gt;Mezon\Fs\InMemory&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;fileGetContents&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'file-path'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="c1"&gt;// checking that file esists&lt;/span&gt;
&lt;span class="k"&gt;echo&lt;/span&gt; &lt;span class="err"&gt;\&lt;/span&gt;&lt;span class="nc"&gt;Mezon\Fs\InMemory&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;fileExists&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'file-path'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// outputs 'true'&lt;/span&gt;
&lt;span class="k"&gt;echo&lt;/span&gt; &lt;span class="err"&gt;\&lt;/span&gt;&lt;span class="nc"&gt;Mezon\Fs\InMemory&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;fileExists&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'unexisting-file'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// outputs 'false'&lt;/span&gt;

&lt;span class="c1"&gt;// preload file in FS&lt;/span&gt;
&lt;span class="c1"&gt;// this method reads real file from your FS and uploads it into inmemory FS&lt;/span&gt;
&lt;span class="err"&gt;\&lt;/span&gt;&lt;span class="nc"&gt;Mezon\Fs\InMemory&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;preloadFile&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'real-file-path'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  GD mocks
&lt;/h2&gt;

&lt;p&gt;We also have mocks for some GD functions. Basically for those ones wich work with file system.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="nc"&gt;Conf&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;setConfigStringValue&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'gd/layer'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'mock'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="c1"&gt;// here we are trying to get file with this path from \Mezon\FS\InMemory&lt;/span&gt;
&lt;span class="nb"&gt;var_dump&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="err"&gt;\&lt;/span&gt;&lt;span class="nc"&gt;Mezon\GD\Layer&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nb"&gt;getImageSize&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'path-to-image'&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;

&lt;span class="c1"&gt;// reading image from file&lt;/span&gt;
&lt;span class="nv"&gt;$resource&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="err"&gt;\&lt;/span&gt;&lt;span class="nc"&gt;Mezon\GD\Layer&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nb"&gt;imageCreateFromBmp&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'path-to-image-file'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nv"&gt;$resource&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="err"&gt;\&lt;/span&gt;&lt;span class="nc"&gt;Mezon\GD\Layer&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nb"&gt;imageCreateFromGif&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'path-to-image-file'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nv"&gt;$resource&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="err"&gt;\&lt;/span&gt;&lt;span class="nc"&gt;Mezon\GD\Layer&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nb"&gt;imageCreateFromJpeg&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'path-to-image-file'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nv"&gt;$resource&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="err"&gt;\&lt;/span&gt;&lt;span class="nc"&gt;Mezon\GD\Layer&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nb"&gt;imageCreateFromPng&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'path-to-image-file'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nv"&gt;$resource&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="err"&gt;\&lt;/span&gt;&lt;span class="nc"&gt;Mezon\GD\Layer&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nb"&gt;imageCreateFromWebp&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'path-to-image-file'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="c1"&gt;// store images into file. In mock mode all data is stored into in-memory FS - \Mezon\FS\InMemory&lt;/span&gt;
&lt;span class="err"&gt;\&lt;/span&gt;&lt;span class="nc"&gt;Mezon\GD\Layer&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nb"&gt;imageBmp&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$resource&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'path-to-file'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="err"&gt;\&lt;/span&gt;&lt;span class="nc"&gt;Mezon\GD\Layer&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nb"&gt;imageGif&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$resource&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'path-to-file'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="err"&gt;\&lt;/span&gt;&lt;span class="nc"&gt;Mezon\GD\Layer&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nb"&gt;imageJpeg&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$resource&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'path-to-file'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="err"&gt;\&lt;/span&gt;&lt;span class="nc"&gt;Mezon\GD\Layer&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nb"&gt;imagePng&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$resource&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'path-to-file'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="err"&gt;\&lt;/span&gt;&lt;span class="nc"&gt;Mezon\GD\Layer&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nb"&gt;imageWebp&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$resource&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'path-to-file'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Redirection mocks
&lt;/h2&gt;

&lt;p&gt;You can mock redirects:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="nc"&gt;Conf&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;setConfigStringValue&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'redirect/layer'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'mock'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="c1"&gt;// in real mode this call method header('Location: ...') will be called&lt;/span&gt;
&lt;span class="c1"&gt;// in mock mode no redirection will be performed and redirect URL will be stored&lt;/span&gt;
&lt;span class="c1"&gt;// in the \Mezon\Redirect\Layer::$lastRedirectionUrl&lt;/span&gt;
&lt;span class="c1"&gt;// and \Mezon\Redirect\Layer::$redirectWasPerformed will be set to 'true'&lt;/span&gt;
&lt;span class="err"&gt;\&lt;/span&gt;&lt;span class="nc"&gt;Mezon\Redirect\Layer&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;redirectTo&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'./url'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Session mocks
&lt;/h2&gt;

&lt;p&gt;You can also mock session methods:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="nc"&gt;Conf&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;setConfigStringValue&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'session/layer'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'mock'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="c1"&gt;// method returns 'session-name' if it is used as mock mode&lt;/span&gt;
&lt;span class="c1"&gt;// and return result of session_name() if it is used in real model&lt;/span&gt;
&lt;span class="err"&gt;\&lt;/span&gt;&lt;span class="nc"&gt;Mezon\Session\Layer&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;sessionName&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

&lt;span class="c1"&gt;// setting cookie &lt;/span&gt;
&lt;span class="err"&gt;\&lt;/span&gt;&lt;span class="nc"&gt;Mezon\Session\Layer&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nb"&gt;setCookie&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="n"&gt;string&lt;/span&gt; &lt;span class="nv"&gt;$name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;string&lt;/span&gt; &lt;span class="nv"&gt;$value&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;""&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;int&lt;/span&gt; &lt;span class="nv"&gt;$expires&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;string&lt;/span&gt; &lt;span class="nv"&gt;$path&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;""&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;string&lt;/span&gt; &lt;span class="nv"&gt;$domain&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;""&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;bool&lt;/span&gt; &lt;span class="nv"&gt;$secure&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;bool&lt;/span&gt; &lt;span class="nv"&gt;$httponly&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="c1"&gt;// getting session id or setting it&lt;/span&gt;
&lt;span class="err"&gt;\&lt;/span&gt;&lt;span class="nc"&gt;Mezon\Session\Layer&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;sessionId&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;string&lt;/span&gt; &lt;span class="nv"&gt;$id&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;''&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="n"&gt;string&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="c1"&gt;// saving session data and closing session&lt;/span&gt;
&lt;span class="err"&gt;\&lt;/span&gt;&lt;span class="nc"&gt;Mezon\Session\Layer&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;sessionWriteClose&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  System methods mocks
&lt;/h2&gt;

&lt;p&gt;You can also mock some system methods calls. Like &lt;code&gt;die&lt;/code&gt; for example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="nc"&gt;Conf&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;setConfigStringValue&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'system/layer'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'mock'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="c1"&gt;// in mock mode field $dieWasCalled will be set to 'true'&lt;/span&gt;
&lt;span class="c1"&gt;// in real mode built-in PHP method 'die' will be called&lt;/span&gt;
&lt;span class="err"&gt;\&lt;/span&gt;&lt;span class="nc"&gt;Mezon\System\Layer&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="k"&gt;die&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  What's next?
&lt;/h2&gt;

&lt;p&gt;More articles can be found in my Twitter&lt;/p&gt;

&lt;h2&gt;
  
  
  What is mezon/infrastructure-layer?
&lt;/h2&gt;

&lt;p&gt;mezon/infrastructure-layer now is:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;framework for creating easy mockable code with 100% code coverage&lt;/li&gt;
&lt;li&gt;mezon/infrastructure-layer is a part of the &lt;a href="https://github.com/alexdodonov/mezon"&gt;Mezon Project&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;repo on github.com: &lt;a href="https://github.com/alexdodonov/mezon-infrastructure-layer"&gt;https://github.com/alexdodonov/mezon-infrastructure-layer&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;It will be great if you will contribute something to this project. Documentation, &lt;a href="https://github.com/alexdodonov/mezon-infrastructure-layer/issues"&gt;sharing the project in your social media, bug fixing, refactoring, or even submitting issue with question or feature request&lt;/a&gt;. Thanks anyway )&lt;/strong&gt;
&lt;/h2&gt;

</description>
      <category>php</category>
      <category>mezon</category>
      <category>unittests</category>
      <category>unittestin</category>
    </item>
    <item>
      <title>My practices of writing Unit-tests</title>
      <dc:creator>alexdodonov</dc:creator>
      <pubDate>Wed, 02 Feb 2022 17:41:39 +0000</pubDate>
      <link>https://dev.to/alexdodonov/my-practices-of-writing-unit-tests-4k69</link>
      <guid>https://dev.to/alexdodonov/my-practices-of-writing-unit-tests-4k69</guid>
      <description>&lt;p&gt;For my whole life I have written about 2700 unit tests. For example &lt;a href="https://github.com/alexdodonov/mezon"&gt;here&lt;/a&gt; are about 1300 unit-tests and code coverage is almost 100%.&lt;/p&gt;

&lt;p&gt;I am not the most skillfull person but I have some tricks wich helpms to write more tests and easier maintain them. Hope they will be usefull for you.&lt;/p&gt;

&lt;p&gt;Examples will be written for PHPUnit and PHP but you can implement all advices for any other unit-testing framework for any language you want.&lt;/p&gt;

&lt;h2&gt;
  
  
  Strict structure for all unit-tests
&lt;/h2&gt;

&lt;p&gt;All my tests have absolutely the same structure (excepti for tests wich test exception )) ) and it looks like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="c1"&gt;// setup&lt;/span&gt;
&lt;span class="n"&gt;here&lt;/span&gt; &lt;span class="n"&gt;we&lt;/span&gt; &lt;span class="n"&gt;have&lt;/span&gt; &lt;span class="n"&gt;setup&lt;/span&gt; &lt;span class="n"&gt;commands&lt;/span&gt;

&lt;span class="c1"&gt;// test body&lt;/span&gt;
&lt;span class="n"&gt;here&lt;/span&gt; &lt;span class="n"&gt;we&lt;/span&gt; &lt;span class="n"&gt;call&lt;/span&gt; &lt;span class="n"&gt;testing&lt;/span&gt; &lt;span class="n"&gt;method&lt;/span&gt;

&lt;span class="c1"&gt;// assertions&lt;/span&gt;
&lt;span class="n"&gt;here&lt;/span&gt; &lt;span class="n"&gt;we&lt;/span&gt; &lt;span class="n"&gt;validate&lt;/span&gt; &lt;span class="n"&gt;the&lt;/span&gt; &lt;span class="n"&gt;result&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And here is some real life example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="cd"&gt;/**
 * Testing method addPostRoute
 */&lt;/span&gt;
&lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;testAddPostRoute&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;// setup&lt;/span&gt;
    &lt;span class="nv"&gt;$router&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;$this&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;getRouter&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    &lt;span class="nv"&gt;$route&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'route'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nc"&gt;RouterUnitTestUtils&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;setRequestMethod&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'POST'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="c1"&gt;// test body&lt;/span&gt;
    &lt;span class="nv"&gt;$router&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;addPostRoute&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$route&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;$this&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'actionRoute'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="c1"&gt;// assertions&lt;/span&gt;
    &lt;span class="nv"&gt;$this&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;assertEquals&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;$router&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;callRoute&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$route&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Here strict structure of unit-test will help you easyly understand what is happening. And also prevents your tests from becoming a mess.&lt;/p&gt;

&lt;p&gt;In some cases unit-test's structure can be a little different, but it consists of the same three parts: setup, test body and assertions. Just look at hte example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="cd"&gt;/**
 * Testing exception while getting existing file
 */&lt;/span&gt;
&lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;testExceptionWhileGettingFileContent&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;// assertions&lt;/span&gt;
    &lt;span class="nv"&gt;$this&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;expectException&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="err"&gt;\&lt;/span&gt;&lt;span class="nc"&gt;Exception&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;class&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="nv"&gt;$this&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;expectExceptionCode&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="nv"&gt;$this&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;expectExceptionMessage&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'File unexisting does not exists'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="c1"&gt;// setup&lt;/span&gt;
    &lt;span class="nc"&gt;InMemory&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;clearFs&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

    &lt;span class="c1"&gt;// test body&lt;/span&gt;
    &lt;span class="nc"&gt;Layer&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;existingFileGetContents&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'unexisting'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This trick can be used for Selenium tests also, but it can be modified like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="c1"&gt;// prepare test data&lt;/span&gt;

&lt;span class="c1"&gt;// move our web app to the necessary state&lt;/span&gt;

&lt;span class="c1"&gt;// test body&lt;/span&gt;

&lt;span class="c1"&gt;// assertions&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Here "move our web app to the necessary state" are steps wich need to be perfomed before testing functionality. For example you want to display data grid. So your selenium test will look like this (in pseudo code):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;// prepare &lt;span class="nb"&gt;test &lt;/span&gt;data
create records &lt;span class="k"&gt;for &lt;/span&gt;the grid
create testing user
grant permissions &lt;span class="k"&gt;for &lt;/span&gt;him

// move our web app to the necessary state
login with the created user
open menu

// &lt;span class="nb"&gt;test &lt;/span&gt;body
click on the &lt;span class="nb"&gt;link &lt;/span&gt;&lt;span class="k"&gt;in &lt;/span&gt;the menu to open testing grid

// assertions
verify that all created records are displayed
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That's all for now. Hope this article will be usefull for you. If so - please press "STAR" for my &lt;a href="https://github.com/alexdodonov/mezon"&gt;project&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>phpunit</category>
      <category>unittesting</category>
      <category>php</category>
      <category>testing</category>
    </item>
    <item>
      <title>Mezon HTML Template Engine</title>
      <dc:creator>alexdodonov</dc:creator>
      <pubDate>Wed, 26 Jan 2022 05:55:43 +0000</pubDate>
      <link>https://dev.to/alexdodonov/mezon-html-template-engine-4api</link>
      <guid>https://dev.to/alexdodonov/mezon-html-template-engine-4api</guid>
      <description>&lt;p&gt;This class provides routine for HTML pages generation. Works fast and quite simple in use.&lt;/p&gt;

&lt;p&gt;It is a part of &lt;a href="https://github.com/alexdodonov/mezon"&gt;Mezon Framework&lt;/a&gt; and used in the &lt;a href="https://github.com/alexdodonov/mezon-common-application"&gt;Application class&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/alexdodonov/mezon-html-template"&gt;Link to repository&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  Learn more
&lt;/h1&gt;

&lt;p&gt;More information can be found here:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://twitter.com/mezonphp"&gt;Twitter&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://dev.to/alexdodonov"&gt;dev.to&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  I'll be very glad if you'll press "STAR" button )
&lt;/h1&gt;

&lt;p&gt;&lt;strong&gt;It will be great if you will contribute something to &lt;a href="https://github.com/alexdodonov/mezon-common-application"&gt;this project&lt;/a&gt;. Documentation, sharing the project in your social media, bug fixing, refactoring, or even submitting issue with question or feature request. Thanks anyway )&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Installation
&lt;/h2&gt;

&lt;p&gt;Just type&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;composer require mezon/html-template
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Usage
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Paths to template files
&lt;/h3&gt;

&lt;p&gt;First of all you need to create object.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="kn"&gt;use&lt;/span&gt; &lt;span class="nc"&gt;Mezon\HtmlTemplate\HtmlTemplate&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="nv"&gt;$template&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;HtmlTemplate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'./main-template/'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This code assumes that you have all template resources in the directory &lt;code&gt;./main-template/&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;But you can also specify a list of paths, and while template compilation they all will be scanned for template files.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="nv"&gt;$template&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;HtmlTemplate&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="s1"&gt;'./main-template/'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'./extra-files/res/'&lt;/span&gt;&lt;span class="p"&gt;]);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;No need to specify all paths in the constructor. You can do it later with methods:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="nv"&gt;$template&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;HtmlTemplate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'./main-template/'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nv"&gt;$template&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;addPaths&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="s1"&gt;'./path1'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'./path2'&lt;/span&gt;&lt;span class="p"&gt;]);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;But be carefull if you have static files with the same names on different paths. While compilation the file on the latest added path will be used. It was done so to create a sort of overriding mechanism for template resources.&lt;/p&gt;

&lt;p&gt;Or you can completely reset all paths:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="nv"&gt;$template&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;setPaths&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="s1"&gt;'./path1'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'./path2'&lt;/span&gt;&lt;span class="p"&gt;]);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And view a list of paths:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="nb"&gt;var_dump&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$template&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;getPaths&lt;/span&gt;&lt;span class="p"&gt;());&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Setup layout
&lt;/h3&gt;

&lt;p&gt;You can have different layouts for your pages:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="nv"&gt;$template&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;HtmlTemplate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;%&lt;/span&gt;&lt;span class="n"&gt;template&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;sources&lt;/span&gt;&lt;span class="o"&gt;%&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'index'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="c1"&gt;// or 'form' instead of 'index', or '404', or '403' etc.&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Layout will let you to define different templates for your different purposes.&lt;/p&gt;

&lt;p&gt;You can create in your template as much layouts as you need. Just add files:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;%template-sources%/Res/Templates/infex.html
%template-sources%/Res/Templates/form.html
%template-sources%/Res/Templates/404.html
%template-sources%/Res/Templates/403.html
// and so on
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Setup blocks
&lt;/h3&gt;

&lt;p&gt;After the layout was setup you can pass blocks to the template.&lt;/p&gt;

&lt;p&gt;It will allow you to put different content in your layout.&lt;/p&gt;

&lt;p&gt;For example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="nv"&gt;$template&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;addBlock&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'hello-world'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That means that &lt;code&gt;HtmlTemplate&lt;/code&gt; class will get the file &lt;code&gt;%template-sources%/Res/Blocks/%block-name%.tpl&lt;/code&gt; and put instead the placeholder &lt;code&gt;{%block-name%}&lt;/code&gt; within your layout.&lt;/p&gt;

&lt;p&gt;But you can place the block in any placeholder you need:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="nc"&gt;HtmlTemplate&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;setPageVarFromBlock&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;string&lt;/span&gt; &lt;span class="nv"&gt;$var&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;string&lt;/span&gt; &lt;span class="nv"&gt;$blockName&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="c1"&gt;// here is $var is the name if your placeholder within the layout&lt;/span&gt;
&lt;span class="c1"&gt;// and $blockName is %template-sources%/Res/Blocks/$blockName.tpl&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If you have &lt;code&gt;$var=foo&lt;/code&gt; then your placeholder must be {foo}&lt;/p&gt;

&lt;h3&gt;
  
  
  Setting vars
&lt;/h3&gt;

&lt;p&gt;You can also pass almost any data to the template&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="c1"&gt;// here is $value is a scalar value or object wich implements __toString method&lt;/span&gt;
&lt;span class="c1"&gt;// and $var is a name of your placeholder within the layout&lt;/span&gt;
&lt;span class="nf"&gt;setPageVar&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;string&lt;/span&gt; &lt;span class="nv"&gt;$var&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;$value&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="n"&gt;void&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="c1"&gt;// this method can be used if you need to place file's $path content in your layout&lt;/span&gt;
&lt;span class="nf"&gt;setPageVarFromFile&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;string&lt;/span&gt; &lt;span class="nv"&gt;$var&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;string&lt;/span&gt; &lt;span class="nv"&gt;$path&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="n"&gt;void&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="c1"&gt;// you can set multyple vars with one call&lt;/span&gt;
&lt;span class="c1"&gt;// here $vars is an assoc array&lt;/span&gt;
&lt;span class="nf"&gt;setPageVars&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;array&lt;/span&gt; &lt;span class="nv"&gt;$vars&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="n"&gt;void&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Compile template
&lt;/h3&gt;

&lt;p&gt;Just call&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="nf"&gt;compile&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="n"&gt;string&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The method will return a compiled page wich you can send to user of your application.&lt;/p&gt;

</description>
      <category>php</category>
      <category>html</category>
      <category>template</category>
      <category>engine</category>
    </item>
    <item>
      <title>How to work with configs in Mezon Framework</title>
      <dc:creator>alexdodonov</dc:creator>
      <pubDate>Mon, 17 Jan 2022 10:17:02 +0000</pubDate>
      <link>https://dev.to/alexdodonov/how-to-work-with-configs-in-mezon-framework-1e74</link>
      <guid>https://dev.to/alexdodonov/how-to-work-with-configs-in-mezon-framework-1e74</guid>
      <description>&lt;p&gt;&lt;a href=""&gt;Mezon&lt;/a&gt; has it's own routine for working with configs. It can be accesed with a set of functions, wich are described below.&lt;/p&gt;

&lt;p&gt;This is the way how to start using it in your project:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;composer require mezon/conf
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Or get it directly from &lt;a href="https://github.com/alexdodonov/mezon-conf"&gt;repo&lt;/a&gt;;&lt;/p&gt;

&lt;p&gt;Getting access to the key in config can be done with &lt;code&gt;Conf::getValue($route, $defaultValue = false)&lt;/code&gt; function. It returns config value with route $route and return $defaultValue if this key was not found. For example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="nv"&gt;$value&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Conf&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;getValue&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'res/images/favicon'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'http://yoursite.com/res/images/favicon.ico'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Setting values for the config key can be done by calling &lt;code&gt;Conf::setConfigValue($route, $value)&lt;/code&gt; or &lt;code&gt;Conf::addConfigValue($route, $value)&lt;/code&gt; function. The main difference between these two functions is that the first one sets scalar key, and the second one adds element to the array in config. Here is small example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="nc"&gt;Conf&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;setConfigValue&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'res/value'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'Value!'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nb"&gt;var_dump&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;Conf&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;getValue&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'res/value'&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt; &lt;span class="c1"&gt;// displays 'Value!' string&lt;/span&gt;

&lt;span class="nc"&gt;Conf&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;addConfigValue&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'res/value'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'Value 1!'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nc"&gt;Conf&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;addConfigValue&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'res/value'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'Value 2!'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nb"&gt;var_dump&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;Conf&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;getValue&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'res/value'&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt; &lt;span class="c1"&gt;// displays array( [0] =&amp;gt; 'Value 1!' , [1] =&amp;gt; 'Value 2!' )&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You also can use typed versions of these methods:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="nc"&gt;Conf&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;getValueAsArray&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mf"&gt;...&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nc"&gt;Conf&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;getValueAsObject&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mf"&gt;...&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nc"&gt;Conf&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;getValueAsString&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mf"&gt;...&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="nc"&gt;Conf&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;setConfigArrayValue&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mf"&gt;...&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nc"&gt;Conf&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;setConfigObjectValue&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mf"&gt;...&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nc"&gt;Conf&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;setConfigStringValue&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mf"&gt;...&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You can set multyple values to the config:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="c1"&gt;// here $settings is an associative array&lt;/span&gt;
&lt;span class="nc"&gt;Conf&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;setConfigValues&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;array&lt;/span&gt; &lt;span class="nv"&gt;$settings&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Or you can read config from JSON:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="nc"&gt;Conf&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;loadConfigFromJson&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;string&lt;/span&gt; &lt;span class="nv"&gt;$pathToConfig&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If you are not shure that the key exists, then you can check it:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="nc"&gt;Conf&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;setConfigValue&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'res/value'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'Value!'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="nb"&gt;var_dump&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;Conf&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;configKeyExists&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'res'&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt; &lt;span class="c1"&gt;// true&lt;/span&gt;
&lt;span class="nb"&gt;var_dump&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;Conf&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;configKeyExists&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'res2'&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt; &lt;span class="c1"&gt;// false&lt;/span&gt;
&lt;span class="nb"&gt;var_dump&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;Conf&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;configKeyExists&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'res/value'&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt; &lt;span class="c1"&gt;// true&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You can also able to delete config key&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="nc"&gt;Conf&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;setConfigValue&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'res/value'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'Value!'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nc"&gt;Conf&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;deleteConfigValue&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'res/value'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nb"&gt;var_dump&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;Conf&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;configKeyExists&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'res/value'&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt; &lt;span class="c1"&gt;// false&lt;/span&gt;
&lt;span class="nb"&gt;var_dump&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;Conf&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;configKeyExists&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'res'&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt; &lt;span class="c1"&gt;// also false&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Or clear the entire config:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="nc"&gt;Conf&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;clear&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That's all you need to know about config read/write.&lt;/p&gt;

&lt;h2&gt;
  
  
  Learn more
&lt;/h2&gt;

&lt;p&gt;More information can be found here:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://twitter.com/mezonphp"&gt;Twitter&lt;/a&gt;&lt;br&gt;
&lt;a href="https://github.com/alexdodonov/mezon"&gt;Mezon Framework&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;It will be great if you will contribute something to &lt;a href="https://github.com/alexdodonov/mezon-conf"&gt;this project&lt;/a&gt;. Documentation, sharing the project in your social media, bug fixing, refactoring, or even submitting issue with question or feature request. Thanks anyway )&lt;/p&gt;

</description>
      <category>config</category>
      <category>mezon</category>
      <category>php</category>
      <category>ini</category>
    </item>
    <item>
      <title>Mezon PHP Framework : results of the 2021 year</title>
      <dc:creator>alexdodonov</dc:creator>
      <pubDate>Thu, 06 Jan 2022 09:52:28 +0000</pubDate>
      <link>https://dev.to/alexdodonov/mezon-php-framework-results-of-the-2021-year-cfk</link>
      <guid>https://dev.to/alexdodonov/mezon-php-framework-results-of-the-2021-year-cfk</guid>
      <description>&lt;p&gt;Hi all! New Year and Christmas have passed and now is a good time to remind all achivements within the &lt;a href="https://github.com/alexdodonov/mezon"&gt;Mezon PHP Project&lt;/a&gt; and think what to do in 2022.&lt;/p&gt;

&lt;p&gt;Let's start!&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Mezon PHP Framework have gathered about 100 more stars (spread on different packages) on github.com Hope next year will give us at least 150 new stars.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Unit-test were improved and made more stable. Now we have 1220 unit-tests wich gives us 98% of code coverage.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Mutation testing was implemented. MSI is rather low (about 57%), but it will grow.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;One new developer have joined the project and now he develops &lt;a href="https://github.com/alexdodonov/mezon-cli"&gt;Mezon CLI tool&lt;/a&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Here is the TOP-10 of articles from this blog:&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://dev.to/alexdodonov/new-php-router-wich-is-30-to-50-times-faster-then-laravel-router-2o97"&gt;New PHP router wich is 30 to 50 times faster then Laravel router&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/alexdodonov/new-php-framework-for-creating-microservices-3ljo"&gt;New PHP framework for creating microservices&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/alexdodonov/new-php-router-wich-is-7-to-15-times-faster-then-symfony-router-2o5c"&gt;New PHP router wich is 7 to 15 times faster then Symfony router&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/alexdodonov/new-php-router-is-25-times-faster-then-klein-router-4ap0"&gt;New php router is 25 times faster then Klein router&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/alexdodonov/real-life-comparison-of-symfony-router-and-mezon-router-1hb5"&gt;Real life comparison of Symfony router and Mezon router&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/alexdodonov/mezon-php-router-is-up-to-82-times-fatser-then-bramus-router-4obn"&gt;Mezon PHP Router is up to 82 times fatser then Bramus Router&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/alexdodonov/new-benchmark-shows-that-mezon-php-router-is-up-to-60-times-faster-then-slim-one-130o"&gt;New benchmark shows that Mezon PHP Router is up to 60 times faster then Slim one&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/alexdodonov/pop3-php-client-c5h"&gt;POP3 PHP Client&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/alexdodonov/benchmark-of-php-altorouter-3k12"&gt;Benchmark of PHP Altorouter&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/alexdodonov/psr-7-routes-processing-in-mezon-router-3gi4"&gt;PSR-7 routes processing in Mezon Router&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;And what is next?&lt;/p&gt;

&lt;p&gt;First of all - &lt;strong&gt;I want to find a couple of new developers for this project. If you want to join the project - just contact with me.&lt;/strong&gt; You can choose any package of &lt;a href="https://github.com/alexdodonov?tab=repositories"&gt;these ones&lt;/a&gt;. You can implement new featuers, write unit-tests or update documentation. Any help will be appreciated )&lt;/p&gt;

&lt;p&gt;And certanly me and the team will implement new features and new code wich you can use in your PHP projects )&lt;/p&gt;

&lt;p&gt;Good luck in a new 2022 )&lt;/p&gt;

</description>
      <category>php</category>
      <category>framework</category>
      <category>microservices</category>
      <category>router</category>
    </item>
    <item>
      <title>Mezon Html Report generator</title>
      <dc:creator>alexdodonov</dc:creator>
      <pubDate>Mon, 22 Nov 2021 16:27:46 +0000</pubDate>
      <link>https://dev.to/alexdodonov/mezon-html-report-generator-dc5</link>
      <guid>https://dev.to/alexdodonov/mezon-html-report-generator-dc5</guid>
      <description>&lt;p&gt;Hi! Let me introduce eport generator wich I have created for personal use.&lt;/p&gt;

&lt;p&gt;To be honest I don't like create reports. It took soooooooo mcuh time. But this class now allows me to do it much faster.&lt;/p&gt;

&lt;h2&gt;
  
  
  Pros and cons
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://github.com/alexdodonov/mezon-html-report"&gt;Mezon HTML report generator&lt;/a&gt; allows you to create reports in a simple and pretty way. This tool also shortens time wich you spend on coding.&lt;/p&gt;

&lt;p&gt;This package is a part of &lt;a href="https://github.com/alexdodonov/mezon"&gt;Mezon Framework&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Installation
&lt;/h2&gt;

&lt;p&gt;Just type:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;composer require mezon/html-report
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Usage
&lt;/h2&gt;

&lt;p&gt;Lets start from creating object of the report generator:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="nv"&gt;$report&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Html&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And since that moment we can add elements to the head or body:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="c1"&gt;// not that stylesheets are not validated, it is totally on your side&lt;/span&gt;
&lt;span class="nv"&gt;$report&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;head&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;style&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;selector&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'p'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;css&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'color'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'red'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nv"&gt;$report&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;head&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;style&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;selector&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'div'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;css&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'color'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'green'&lt;/span&gt;&lt;span class="p"&gt;);;&lt;/span&gt;

&lt;span class="nv"&gt;$report&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;body&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;p&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'Hello!'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nv"&gt;$report&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;body&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;div&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'World!'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="c1"&gt;// here we get HTML code in the variable $result&lt;/span&gt;
&lt;span class="nv"&gt;$result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;$report&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;compile&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  More complex examples
&lt;/h2&gt;

&lt;p&gt;This example shows that every call creates new tag (except html and body). So if you want to add multyple tags then you need to store tag into variable:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="nv"&gt;$table&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;$report&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;table&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="nv"&gt;$row&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;$table&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;tr&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

&lt;span class="nv"&gt;$row&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;td&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;innerHtml&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'#1'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nv"&gt;$row&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;td&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;innerHtml&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'Legolas'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="nv"&gt;$row&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;td&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;innerHtml&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'#2'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nv"&gt;$row&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;td&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;innerHtml&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'Frodo'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="nv"&gt;$row&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;td&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;innerHtml&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'#3'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nv"&gt;$row&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;td&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;innerHtml&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'Aragorn'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Supported tags
&lt;/h2&gt;

&lt;p&gt;For now you can use following tags:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;body&lt;/li&gt;
&lt;li&gt;div&lt;/li&gt;
&lt;li&gt;h1&lt;/li&gt;
&lt;li&gt;h2&lt;/li&gt;
&lt;li&gt;h3&lt;/li&gt;
&lt;li&gt;h4&lt;/li&gt;
&lt;li&gt;h5&lt;/li&gt;
&lt;li&gt;head&lt;/li&gt;
&lt;li&gt;p&lt;/li&gt;
&lt;li&gt;strong&lt;/li&gt;
&lt;li&gt;style&lt;/li&gt;
&lt;li&gt;table&lt;/li&gt;
&lt;li&gt;td&lt;/li&gt;
&lt;li&gt;tr&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Inner HTML
&lt;/h2&gt;

&lt;p&gt;If you need more tags, you can use innerHtml like in the example below:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="nv"&gt;$report&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;body&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;innerHtml&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'&amp;lt;script&amp;gt;alert(1);&amp;lt;/scrip&amp;gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Learn more
&lt;/h2&gt;

&lt;p&gt;More information can be found here:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://twitter.com/mezonphp"&gt;Twitter&lt;/a&gt;&lt;br&gt;
&lt;a href="https://github.com/alexdodonov/mezon"&gt;Mezon Framework&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;It will be great if you will contribute something to &lt;a href="https://github.com/alexdodonov/mezon-html-report"&gt;this project&lt;/a&gt;. Documentation, sharing the project in your social media, bug fixing, refactoring, or even submitting issue with question or feature request. Thanks anyway )&lt;/p&gt;

</description>
      <category>php</category>
      <category>report</category>
      <category>html</category>
      <category>generator</category>
    </item>
    <item>
      <title>How to create simple microservice using Mezon Framework</title>
      <dc:creator>alexdodonov</dc:creator>
      <pubDate>Tue, 26 Oct 2021 17:24:47 +0000</pubDate>
      <link>https://dev.to/alexdodonov/how-to-create-simple-microservice-using-mezon-framework-55m</link>
      <guid>https://dev.to/alexdodonov/how-to-create-simple-microservice-using-mezon-framework-55m</guid>
      <description>&lt;p&gt;Hi! In this article I shall show you how to create simple micro service with &lt;a href="https://github.com/alexdodonov/mezon-service"&gt;Mezon Framework&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;To be honest it is quite simple. First of all you need to create htaccess (if your are using Apache, or just skip this step otherwise):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# use mod_rewrite for pretty URL support&lt;/span&gt;
RewriteEngine on

RewriteRule ^&lt;span class="o"&gt;(&lt;/span&gt;.&lt;span class="k"&gt;*&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;.html&lt;span class="nv"&gt;$ $1&lt;/span&gt;.html &lt;span class="o"&gt;[&lt;/span&gt;L]
RewriteRule ^&lt;span class="o"&gt;(&lt;/span&gt;.&lt;span class="k"&gt;*&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;.png&lt;span class="nv"&gt;$ $1&lt;/span&gt;.png &lt;span class="o"&gt;[&lt;/span&gt;L]

RewriteRule ^cron/&lt;span class="o"&gt;(&lt;/span&gt;.&lt;span class="k"&gt;*&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;cron/&lt;span class="nv"&gt;$1&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;L]
RewriteRule ^include/&lt;span class="o"&gt;(&lt;/span&gt;.&lt;span class="k"&gt;*&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;include/&lt;span class="nv"&gt;$1&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;L]
RewriteRule ^Res/&lt;span class="o"&gt;(&lt;/span&gt;.&lt;span class="k"&gt;*&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;Res/&lt;span class="nv"&gt;$1&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;L]
RewriteRule ^vendor/&lt;span class="o"&gt;(&lt;/span&gt;.&lt;span class="k"&gt;*&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;vendor/&lt;span class="nv"&gt;$1&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;L]

RewriteRule ^data/files/&lt;span class="o"&gt;(&lt;/span&gt;.&lt;span class="k"&gt;*&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;data/files/&lt;span class="nv"&gt;$1&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;L]

RewriteRule ^Res/Images/&lt;span class="o"&gt;(&lt;/span&gt;.&lt;span class="k"&gt;*&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;Res/Images/&lt;span class="nv"&gt;$1&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;L]
RewriteRule ^&lt;span class="o"&gt;([&lt;/span&gt;a-z0-9A-Z_&lt;span class="se"&gt;\/\.\-\@&lt;/span&gt;%&lt;span class="se"&gt;\ &lt;/span&gt;:,]+&lt;span class="o"&gt;)&lt;/span&gt;/?&lt;span class="o"&gt;(&lt;/span&gt;.&lt;span class="k"&gt;*&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;index.php?r&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;$1&lt;/span&gt;&amp;amp;%&lt;span class="o"&gt;{&lt;/span&gt;QUERY_STRING&lt;span class="o"&gt;}&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;L]
RewriteRule ^/?&lt;span class="o"&gt;(&lt;/span&gt;.&lt;span class="k"&gt;*&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;index.php?r&lt;span class="o"&gt;=&lt;/span&gt;index&amp;amp;%&lt;span class="o"&gt;{&lt;/span&gt;QUERY_STRING&lt;span class="o"&gt;}&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;L]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Next run:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;composer require mezon/service
composer require mezon/service-logic
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then create simple class for business logic implementation:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="cp"&gt;&amp;lt;?php&lt;/span&gt;
&lt;span class="kn"&gt;namespace&lt;/span&gt; &lt;span class="nn"&gt;Lambda&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kn"&gt;use&lt;/span&gt; &lt;span class="nc"&gt;Mezon\Service\ServiceBaseLogic&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Logic&lt;/span&gt; &lt;span class="kd"&gt;extends&lt;/span&gt; &lt;span class="nc"&gt;ServiceBaseLogic&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;

    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;helloWorld&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="s1"&gt;'Hello world!'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then we need to asseble our service in index.php:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="c1"&gt;// here we use MockProvider for no authentication or authorization&lt;/span&gt;
&lt;span class="nv"&gt;$securityProvider&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;MockProvider&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

&lt;span class="c1"&gt;// here we decide to use REST transport&lt;/span&gt;
&lt;span class="nv"&gt;$serviceTransport&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;ServiceRestTransport&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$securityProvider&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="c1"&gt;// here we create object of the business logic&lt;/span&gt;
&lt;span class="nv"&gt;$serviceLogic&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Logic&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$serviceTransport&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;getParamsFetcher&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt; &lt;span class="nv"&gt;$serviceTransport&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;getSecurityProvider&lt;/span&gt;&lt;span class="p"&gt;());&lt;/span&gt;

&lt;span class="c1"&gt;// setup transport and set that we need to use `helloWorld` method for router '/hello-world/' and GET method&lt;/span&gt;
&lt;span class="nv"&gt;$serviceTransport&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;setServiceLogic&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$serviceLogic&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nv"&gt;$serviceTransport&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;getRouter&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;addGetRoute&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'/hello-world/'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;$serviceLogic&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'helloWorld'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="c1"&gt;// create service object ...&lt;/span&gt;
&lt;span class="nv"&gt;$service&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;ServiceBase&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$serviceTransport&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="c1"&gt;// ... and then simply run service&lt;/span&gt;
&lt;span class="nv"&gt;$service&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;run&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Pretty simple yeah? )&lt;/p&gt;

&lt;p&gt;Do you have any proposals how to improve Mezon Framework? Then use &lt;a href="https://github.com/alexdodonov/mezon-service"&gt;GitHub&lt;/a&gt; to submit your feature request.&lt;/p&gt;

</description>
      <category>lambda</category>
      <category>mezon</category>
      <category>microservices</category>
      <category>rest</category>
    </item>
    <item>
      <title>CRUD model class</title>
      <dc:creator>alexdodonov</dc:creator>
      <pubDate>Tue, 27 Jul 2021 04:58:17 +0000</pubDate>
      <link>https://dev.to/alexdodonov/crud-model-class-5an1</link>
      <guid>https://dev.to/alexdodonov/crud-model-class-5an1</guid>
      <description>&lt;h1&gt;
  
  
  CRUD model
&lt;/h1&gt;

&lt;p&gt;This model will help you to create CRUD models for your entitites, and provides you a huge set of methods after a simpe setup.&lt;/p&gt;

&lt;h2&gt;
  
  
  Installation
&lt;/h2&gt;

&lt;p&gt;Just print in console&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;composer require mezon/crud-service-model
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And that's all )&lt;/p&gt;

&lt;h2&gt;
  
  
  First steps
&lt;/h2&gt;

&lt;p&gt;Let's define a new class for your DB entity:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;EntityModel&lt;/span&gt; &lt;span class="kd"&gt;extends&lt;/span&gt; &lt;span class="nc"&gt;CrudServiceModel&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="cd"&gt;/**
     * Constructor
     */&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;__construct&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;parent&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;__construct&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'*'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'entity_table_name'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In this exact line of code:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="k"&gt;parent&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;__construct&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'*'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'entity_table_name'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;We have specified that we need &lt;code&gt;'*'&lt;/code&gt; (all fields) from the table with name &lt;code&gt;'entity_table_name'&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;If you need only some fields from your database, just list them in the first parameter:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="k"&gt;parent&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;__construct&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'id,field1,field2,field3'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'entity_table_name'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And when you have done this, you will get the following methods.&lt;/p&gt;

&lt;p&gt;But before using these methods note that you will need to meet the requirements for some naming conventions.&lt;/p&gt;

&lt;p&gt;Field with the primary key must be named as &lt;code&gt;id&lt;/code&gt;. I shall add setting to use another name.&lt;/p&gt;

&lt;p&gt;Some methods reqire field &lt;code&gt;creation_date&lt;/code&gt; for fetching new records for example.&lt;/p&gt;

&lt;p&gt;You may add to the table field &lt;code&gt;domain_id&lt;/code&gt; for implementing multy instancing out of the box.&lt;/p&gt;

&lt;p&gt;Now lets look at available methods:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Method fetches all new records since the $date&lt;/span&gt;
&lt;span class="c1"&gt;// For example $model-&amp;gt;newRecordsSince($domainId, '2021-01-01');&lt;/span&gt;
&lt;span class="nf"&gt;newRecordsSince&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$domainId&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;string&lt;/span&gt; &lt;span class="nv"&gt;$date&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="k"&gt;array&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Method calculates count of records fetched by filter&lt;/span&gt;
&lt;span class="c1"&gt;// For example $model-&amp;gt;recordsCount(false, ['field1 = 1', 'field2 = 2']);&lt;/span&gt;
&lt;span class="nf"&gt;recordsCount&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$domainId&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;array&lt;/span&gt; &lt;span class="nv"&gt;$where&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'1=1'&lt;/span&gt;&lt;span class="p"&gt;]);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Method returns data as is without any transformations&lt;/span&gt;
&lt;span class="nf"&gt;getSimpleRecords&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$domainId&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;int&lt;/span&gt; &lt;span class="nv"&gt;$from&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;int&lt;/span&gt; &lt;span class="nv"&gt;$limit&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;array&lt;/span&gt; &lt;span class="nv"&gt;$where&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;array&lt;/span&gt; &lt;span class="nv"&gt;$order&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[])&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="k"&gt;array&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Method returns records wich are transformed by method getRecordsTransformer wuch &lt;/span&gt;
&lt;span class="c1"&gt;// you can override in your subclass&lt;/span&gt;
&lt;span class="nf"&gt;getRecords&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$domainId&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;int&lt;/span&gt; &lt;span class="nv"&gt;$from&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;int&lt;/span&gt; &lt;span class="nv"&gt;$limit&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;array&lt;/span&gt; &lt;span class="nv"&gt;$where&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'1=1'&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="k"&gt;array&lt;/span&gt; &lt;span class="nv"&gt;$order&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[])&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="k"&gt;array&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Method returns the last $count records filtered by where&lt;/span&gt;
&lt;span class="nf"&gt;lastRecords&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$domainId&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;$count&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;$where&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="k"&gt;array&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Method returns records by their ids&lt;/span&gt;
&lt;span class="nf"&gt;fetchRecordsByIds&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$domainId&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;string&lt;/span&gt; &lt;span class="nv"&gt;$ids&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="k"&gt;array&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Method calculates count of records grouped by fieldName and filtered by where&lt;/span&gt;
&lt;span class="nf"&gt;recordsCountByField&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$domainId&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;string&lt;/span&gt; &lt;span class="nv"&gt;$fieldName&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;array&lt;/span&gt; &lt;span class="nv"&gt;$where&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="k"&gt;array&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Method updates records with values record&lt;/span&gt;
&lt;span class="nf"&gt;updateBasicFields&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$domainId&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;array&lt;/span&gt; &lt;span class="nv"&gt;$record&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;array&lt;/span&gt; &lt;span class="nv"&gt;$where&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="k"&gt;array&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Method inserts record record&lt;/span&gt;
&lt;span class="nf"&gt;insertBasicFields&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;array&lt;/span&gt; &lt;span class="nv"&gt;$record&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;$domainId&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="k"&gt;array&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Method deletes all records filtered by where&lt;/span&gt;
&lt;span class="nf"&gt;deleteFiltered&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$domainId&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;array&lt;/span&gt; &lt;span class="nv"&gt;$where&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="n"&gt;int&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h1&gt;
  
  
  It will be great if you will contribute something to this project. Documentation, sharing the project in your social media, bug fixing, refactoring, or even &lt;strong&gt;&lt;a href="https://github.com/alexdodonov/mezon-crud-service"&gt;submitting issue with question or feature request&lt;/a&gt;&lt;/strong&gt;. Thanks anyway )
&lt;/h1&gt;

</description>
      <category>php</category>
      <category>mezon</category>
      <category>crud</category>
      <category>microservices</category>
    </item>
    <item>
      <title>New benchmark: Mezon Router is up to 235 times faster than Macaw Router</title>
      <dc:creator>alexdodonov</dc:creator>
      <pubDate>Mon, 26 Jul 2021 09:13:52 +0000</pubDate>
      <link>https://dev.to/alexdodonov/new-benchmark-mezon-router-is-up-to-235-times-faster-than-macaw-router-1a0b</link>
      <guid>https://dev.to/alexdodonov/new-benchmark-mezon-router-is-up-to-235-times-faster-than-macaw-router-1a0b</guid>
      <description>&lt;p&gt;Hi all! Today we have one more benchmark.&lt;/p&gt;

&lt;p&gt;As usual we have two cases:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;http server accepts request, launches php script, which handles this request, and then all script data is removed from memory. All following requests are processed in the same way. In this case very critical to launch script as soon as possible and we do not have time for long pre-compilations and preparations. Because all of it will be lost after the script will finish working;&lt;/li&gt;
&lt;li&gt;php script is launching, initiating all internal components (and router is one of them) and then starting processing requests. This case can be organized via for example react-php. It differs from the previous case because we can spend reasonable time to pre-compile routes for faster processing.&lt;/li&gt;
&lt;/ol&gt;

&lt;h1&gt;
  
  
  The first case
&lt;/h1&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="c1"&gt;// static routes&lt;/span&gt;
&lt;span class="nv"&gt;$_SERVER&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'REQUEST_METHOD'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'GET'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="nv"&gt;$_SERVER&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'REQUEST_URI'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'/static/0'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="nc"&gt;RouteGenerator&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;generateMacawStaticRoutes&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1000&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nc"&gt;Macaw&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;dispatch&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

&lt;span class="nv"&gt;$_SERVER&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'REQUEST_METHOD'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'GET'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="nv"&gt;$_SERVER&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'REQUEST_URI'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'/static/99'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="nc"&gt;RouteGenerator&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;generateMacawStaticRoutes&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1000&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nc"&gt;Macaw&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;dispatch&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

&lt;span class="nv"&gt;$_SERVER&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'REQUEST_METHOD'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'GET'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="nv"&gt;$_SERVER&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'REQUEST_URI'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'/static/199'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="nc"&gt;RouteGenerator&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;generateMacawStaticRoutes&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1000&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nc"&gt;Macaw&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;dispatch&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="c1"&gt;// and so on up to /static/999 route&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="c1"&gt;// non static routes&lt;/span&gt;
&lt;span class="nv"&gt;$_SERVER&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'REQUEST_METHOD'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'GET'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="nv"&gt;$_SERVER&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'REQUEST_URI'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'/param/0/1'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="nc"&gt;RouteGenerator&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;generateMacawNonStaticRoutes&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1000&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nc"&gt;Macaw&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;dispatch&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

&lt;span class="nv"&gt;$_SERVER&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'REQUEST_METHOD'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'GET'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="nv"&gt;$_SERVER&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'REQUEST_URI'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'/param/99/1'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="nc"&gt;RouteGenerator&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;generateMacawNonStaticRoutes&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1000&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nc"&gt;Macaw&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;dispatch&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

&lt;span class="nv"&gt;$_SERVER&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'REQUEST_METHOD'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'GET'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="nv"&gt;$_SERVER&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'REQUEST_URI'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'/param/199/1'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="nc"&gt;RouteGenerator&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;generateMacawNonStaticRoutes&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1000&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nc"&gt;Macaw&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;dispatch&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="c1"&gt;// and so on up to /param/999/1 route&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h1&gt;
  
  
  The second case
&lt;/h1&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="c1"&gt;// static routes&lt;/span&gt;
&lt;span class="nv"&gt;$_SERVER&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'REQUEST_METHOD'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'GET'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="nv"&gt;$_SERVER&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'REQUEST_URI'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'/static/0'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="nc"&gt;RouteGenerator&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;generateMacawStaticRoutes&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1000&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nc"&gt;Macaw&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;dispatch&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

&lt;span class="nv"&gt;$_SERVER&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'REQUEST_METHOD'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'GET'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="nv"&gt;$_SERVER&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'REQUEST_URI'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'/static/99'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="nc"&gt;Macaw&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;dispatch&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

&lt;span class="nv"&gt;$_SERVER&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'REQUEST_METHOD'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'GET'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="nv"&gt;$_SERVER&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'REQUEST_URI'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'/static/199'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="nc"&gt;Macaw&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;dispatch&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="c1"&gt;// and so on up to /static/999 route&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="c1"&gt;// non static routes&lt;/span&gt;
&lt;span class="nv"&gt;$_SERVER&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'REQUEST_METHOD'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'GET'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="nv"&gt;$_SERVER&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'REQUEST_URI'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'/param/0/1'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="nc"&gt;RouteGenerator&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;generateMacawNonStaticRoutes&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1000&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nc"&gt;Macaw&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;dispatch&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

&lt;span class="nv"&gt;$_SERVER&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'REQUEST_METHOD'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'GET'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="nv"&gt;$_SERVER&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'REQUEST_URI'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'/param/99/1'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="nc"&gt;Macaw&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;dispatch&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

&lt;span class="nv"&gt;$_SERVER&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'REQUEST_METHOD'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'GET'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="nv"&gt;$_SERVER&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'REQUEST_URI'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'/param/199/1'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="nc"&gt;Macaw&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;dispatch&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="c1"&gt;// and so on up to /param/1/999 route&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h1&gt;
  
  
  OK What do we have?
&lt;/h1&gt;

&lt;h2&gt;
  
  
  The first case + static routes
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;+------------------------------------+-------------+-----+------+-----+--------------+---------------+---------------+---------------+---------------+-------------+--------+---------+
| benchmark                          | subject     | set | revs | its | mem_peak     | best          | mean          | mode          | worst         | stdev       | rstdev | diff    |
+------------------------------------+-------------+-----+------+-----+--------------+---------------+---------------+---------------+---------------+-------------+--------+---------+
| CoffeeSingleRequestStaticBench     | benchStatic | 0   | 10   | 10  | 4,421,792b   | 42,887.400μs  | 44,110.520μs  | 44,006.318μs  | 45,896.700μs  | 731.456μs   | 1.66%  | 26.88x  |
| DVKSingleRequestStaticBench        | benchStatic | 0   | 10   | 10  | 4,878,600b   | 26,610.800μs  | 27,311.260μs  | 27,157.306μs  | 28,591.400μs  | 545.456μs   | 2.00%  | 16.64x  |
| HoaSingleRequestStaticBench        | benchStatic | 0   | 10   | 10  | 5,398,504b   | 46,112.900μs  | 47,123.440μs  | 46,722.304μs  | 48,868.700μs  | 786.022μs   | 1.67%  | 28.71x  |
| IBSingleRequestStaticBench         | benchStatic | 0   | 10   | 10  | 5,120,480b   | 130,339.600μs | 133,999.070μs | 131,788.961μs | 139,483.100μs | 3,237.588μs | 2.42%  | 81.65x  |
| JoomlaSingleRequestStaticBench     | benchStatic | 0   | 10   | 10  | 4,404,816b   | 29,574.900μs  | 31,202.060μs  | 31,060.434μs  | 34,093.400μs  | 1,140.019μs | 3.65%  | 19.01x  |
| LeafSingleRequestStaticBench       | benchStatic | 0   | 10   | 10  | 152,268,656b | 31,250.000μs  | 32,078.900μs  | 31,882.215μs  | 33,418.200μs  | 590.913μs   | 1.84%  | 19.55x  |
| MacawSingleRequestStaticBench      | benchStatic | 0   | 10   | 10  | 4,404,816b   | 15,953.600μs  | 17,173.270μs  | 17,431.719μs  | 17,989.500μs  | 634.877μs   | 3.70%  | 10.46x  |
| MezonSingleRequestStaticBench      | benchStatic | 0   | 10   | 10  | 4,405,224b   | 9,269.200μs   | 10,218.480μs  | 10,358.104μs  | 10,789.500μs  | 429.245μs   | 4.20%  | 6.23x   |
| MiladSingleRequestStaticBench      | benchStatic | 0   | 10   | 10  | 35,134,736b  | 32,030.300μs  | 32,779.910μs  | 32,257.182μs  | 33,930.900μs  | 718.028μs   | 2.19%  | 19.97x  |
| PeceeSingleRequestStaticBench      | benchStatic | 0   | 10   | 10  | 8,570,512b   | 39,446.800μs  | 41,928.180μs  | 40,962.929μs  | 50,059.700μs  | 2,936.226μs | 7.00%  | 25.55x  |
| PowerSingleRequestStaticBench      | benchStatic | 0   | 10   | 10  | 5,347,688b   | 21,038.100μs  | 22,333.040μs  | 22,047.192μs  | 23,902.800μs  | 838.572μs   | 3.75%  | 13.61x  |
| SteampixelSingleRequestStaticBench | benchStatic | 0   | 10   | 10  | 4,404,848b   | 214,769.600μs | 219,732.850μs | 218,472.236μs | 227,553.700μs | 3,569.859μs | 1.62%  | 133.90x |
| TetoSingleRequestStaticBench       | benchStatic | 0   | 10   | 10  | 6,765,328b   | 42,704.200μs  | 46,040.130μs  | 43,741.671μs  | 65,754.100μs  | 6,685.943μs | 14.52% | 28.05x  |
| ToroSingleRequestStaticBench       | benchStatic | 0   | 10   | 10  | 4,404,816b   | 1,520.800μs   | 1,641.080μs   | 1,648.426μs   | 1,815.900μs   | 91.010μs    | 5.55%  | 1.00x   |
| ZaphpaSingleRequestStaticBench     | benchStatic | 0   | 10   | 10  | 4,922,128b   | 34,852.900μs  | 36,750.860μs  | 36,017.122μs  | 42,579.100μs  | 2,086.035μs | 5.68%  | 22.39x  |
+------------------------------------+-------------+-----+------+-----+--------------+---------------+---------------+---------------+---------------+-------------+--------+---------+
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  The first case + non-static routes
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;+-----------------------------------+------------+-----+------+-----+--------------+---------------+---------------+---------------+---------------+--------------+--------+--------+
| benchmark                         | subject    | set | revs | its | mem_peak     | best          | mean          | mode          | worst         | stdev        | rstdev | diff   |
+-----------------------------------+------------+-----+------+-----+--------------+---------------+---------------+---------------+---------------+--------------+--------+--------+
| CoffeeSingleRequestParamBench     | benchParam | 0   | 10   | 10  | 5,388,832b   | 57,210.900μs  | 58,142.010μs  | 57,612.744μs  | 59,372.400μs  | 752.514μs    | 1.29%  | 2.54x  |
| DVKSingleRequestParamBench        | benchParam | 0   | 10   | 10  | 4,870,984b   | 30,440.400μs  | 33,219.850μs  | 32,300.568μs  | 39,669.000μs  | 2,454.361μs  | 7.39%  | 1.45x  |
| HoaSingleRequestParamBench        | benchParam | 0   | 10   | 10  | 5,600,184b   | 49,161.600μs  | 52,082.390μs  | 50,409.781μs  | 64,347.800μs  | 4,331.550μs  | 8.32%  | 2.28x  |
| IBSingleRequestParamBench         | benchParam | 0   | 10   | 10  | 5,241,200b   | 155,206.200μs | 168,856.750μs | 159,161.075μs | 199,139.700μs | 15,550.415μs | 9.21%  | 7.39x  |
| JoomlaSingleRequestParamBench     | benchParam | 0   | 10   | 10  | 5,096,376b   | 39,944.500μs  | 43,655.270μs  | 41,607.303μs  | 51,912.000μs  | 3,674.424μs  | 8.42%  | 1.91x  |
| LeafSingleRequestParamBench       | benchParam | 0   | 10   | 10  | 152,278,112b | 34,874.500μs  | 37,790.860μs  | 37,767.886μs  | 41,445.700μs  | 1,873.793μs  | 4.96%  | 1.65x  |
| MacawSingleRequestParamBench      | benchParam | 0   | 10   | 10  | 4,404,816b   | 27,943.800μs  | 35,659.150μs  | 31,393.071μs  | 73,138.100μs  | 12,755.662μs | 35.77% | 1.56x  |
| MezonSingleRequestParamBench      | benchParam | 0   | 10   | 10  | 141,061,056b | 146,752.500μs | 170,194.630μs | 152,785.473μs | 260,932.100μs | 36,489.637μs | 21.44% | 7.45x  |
| MiladSingleRequestParamBench      | benchParam | 0   | 10   | 10  | 35,993,272b  | 38,704.200μs  | 39,850.380μs  | 39,249.865μs  | 42,422.000μs  | 1,230.384μs  | 3.09%  | 1.74x  |
| PeceeSingleRequestParamBench      | benchParam | 0   | 10   | 10  | 8,154,696b   | 80,192.000μs  | 82,885.880μs  | 81,251.688μs  | 88,274.100μs  | 2,705.337μs  | 3.26%  | 3.63x  |
| PowerSingleRequestParamBench      | benchParam | 0   | 10   | 10  | 5,347,688b   | 21,736.300μs  | 22,851.370μs  | 22,290.195μs  | 24,333.000μs  | 816.581μs    | 3.57%  | 1.00x  |
| SteampixelSingleRequestParamBench | benchParam | 0   | 10   | 10  | 4,404,848b   | 244,784.400μs | 253,750.480μs | 249,475.559μs | 278,078.600μs | 9,616.243μs  | 3.79%  | 11.10x |
| TetoSingleRequestParamBench       | benchParam | 0   | 10   | 10  | 6,726,408b   | 60,670.300μs  | 79,920.380μs  | 73,702.178μs  | 130,037.900μs | 19,394.914μs | 24.27% | 3.50x  |
| ToroSingleRequestParamBench       | benchParam | 0   | 10   | 10  | 4,404,816b   | 9,689.800μs   | 27,495.940μs  | 17,091.499μs  | 99,743.800μs  | 26,067.520μs | 94.80% | 1.20x  |
| ZaphpaSingleRequestParamBench     | benchParam | 0   | 10   | 10  | 5,025,536b   | 48,650.000μs  | 53,104.450μs  | 50,692.984μs  | 64,711.000μs  | 4,885.802μs  | 9.20%  | 2.32x  |
+-----------------------------------+------------+-----+------+-----+--------------+---------------+---------------+---------------+---------------+--------------+--------+--------+
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  The second case + static routes
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;+----------------------------+-------------+-----+------+-----+-------------+---------------+---------------+---------------+---------------+--------------+--------+------------+
| benchmark                  | subject     | set | revs | its | mem_peak    | best          | mean          | mode          | worst         | stdev        | rstdev | diff       |
+----------------------------+-------------+-----+------+-----+-------------+---------------+---------------+---------------+---------------+--------------+--------+------------+
| CoffeeReactStaticBench     | benchStatic | 0   | 10   | 10  | 4,404,816b  | 9,244.100μs   | 10,291.010μs  | 9,959.738μs   | 13,219.000μs  | 1,120.150μs  | 10.88% | 533.63x    |
| DVKReactStaticBench        | benchStatic | 0   | 100  | 10  | 4,404,816b  | 11,486.660μs  | 12,126.296μs  | 11,940.553μs  | 13,204.730μs  | 482.820μs    | 3.98%  | 628.79x    |
| HoaReactStaticBench        | benchStatic | 0   | 100  | 10  | 4,444,576b  | 3,867.240μs   | 4,144.961μs   | 4,069.371μs   | 4,454.110μs   | 181.688μs    | 4.38%  | 214.93x    |
| IBReactStaticBench         | benchStatic | 0   | 10   | 10  | 4,683,736b  | 27,970.900μs  | 30,546.820μs  | 29,286.966μs  | 39,980.000μs  | 3,427.355μs  | 11.22% | 1,583.97x  |
| JoomlaReactStaticBench     | benchStatic | 0   | 10   | 10  | 4,404,816b  | 5,581.900μs   | 6,261.770μs   | 6,333.534μs   | 6,763.700μs   | 331.498μs    | 5.29%  | 324.70x    |
| LeafReactStaticBench       | benchStatic | 0   | 10   | 10  | 17,032,288b | 8,718.700μs   | 9,429.620μs   | 9,596.009μs   | 10,077.200μs  | 418.128μs    | 4.43%  | 488.96x    |
| MacawReactStaticBench      | benchStatic | 0   | 10   | 10  | 4,404,816b  | 3,966.500μs   | 4,547.030μs   | 4,287.913μs   | 5,229.900μs   | 440.286μs    | 9.68%  | 235.78x    |
| MezonReactStaticBench      | benchStatic | 0   | 100  | 10  | 4,405,224b  | 18.830μs      | 19.285μs      | 19.052μs      | 20.360μs      | 0.471μs      | 2.44%  | 1.00x      |
| MiladReactStaticBench      | benchStatic | 0   | 10   | 10  | 6,760,320b  | 16,863.200μs  | 17,928.550μs  | 17,538.320μs  | 20,783.500μs  | 1,113.527μs  | 6.21%  | 929.66x    |
| PeceeReactStaticBench      | benchStatic | 0   | 10   | 10  | 5,729,376b  | 20,468.700μs  | 22,616.480μs  | 21,170.085μs  | 28,094.400μs  | 2,524.951μs  | 11.16% | 1,172.75x  |
| PowerReactStaticBench      | benchStatic | 0   | 10   | 10  | 4,515,104b  | 16,747.600μs  | 17,718.270μs  | 17,725.738μs  | 19,259.300μs  | 726.676μs    | 4.10%  | 918.76x    |
| SteampixelReactStaticBench | benchStatic | 0   | 10   | 10  | 4,404,816b  | 254,838.600μs | 264,584.430μs | 259,244.541μs | 295,773.800μs | 12,104.379μs | 4.57%  | 13,719.70x |
| TetoReactStaticBench       | benchStatic | 0   | 10   | 10  | 5,238,440b  | 4,072.800μs   | 4,749.520μs   | 4,475.797μs   | 6,553.900μs   | 687.568μs    | 14.48% | 246.28x    |
| ToroReactStaticBench       | benchStatic | 0   | 10   | 10  | 4,404,816b  | 409.800μs     | 464.380μs     | 436.985μs     | 693.300μs     | 80.115μs     | 17.25% | 24.08x     |
| ZaphpaReactStaticBench     | benchStatic | 0   | 10   | 10  | 4,404,816b  | 12,586.100μs  | 14,936.320μs  | 13,641.531μs  | 18,931.100μs  | 2,113.612μs  | 14.15% | 774.50x    |
+----------------------------+-------------+-----+------+-----+-------------+---------------+---------------+---------------+---------------+--------------+--------+------------+
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  The second case + non-static routes
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;+---------------------------+------------+-----+------+-----+-------------+---------------+---------------+---------------+---------------+--------------+--------+---------+
| benchmark                 | subject    | set | revs | its | mem_peak    | best          | mean          | mode          | worst         | stdev        | rstdev | diff    |
+---------------------------+------------+-----+------+-----+-------------+---------------+---------------+---------------+---------------+--------------+--------+---------+
| CoffeeReactParamBench     | benchParam | 0   | 10   | 10  | 4,404,816b  | 9,346.100μs   | 12,261.110μs  | 10,725.392μs  | 25,364.700μs  | 4,551.819μs  | 37.12% | 8.59x   |
| DVKReactParamBench        | benchParam | 0   | 100  | 10  | 4,404,816b  | 14,638.400μs  | 15,790.154μs  | 14,979.128μs  | 17,804.070μs  | 1,052.202μs  | 6.66%  | 11.06x  |
| HoaReactParamBench        | benchParam | 0   | 100  | 10  | 4,730,008b  | 3,957.450μs   | 4,058.723μs   | 4,037.900μs   | 4,255.350μs   | 75.601μs     | 1.86%  | 2.84x   |
| IBReactParamBench         | benchParam | 0   | 10   | 10  | 4,820,208b  | 37,245.200μs  | 38,581.780μs  | 38,063.843μs  | 42,749.500μs  | 1,504.175μs  | 3.90%  | 27.03x  |
| JoomlaReactParamBench     | benchParam | 0   | 10   | 10  | 4,404,816b  | 4,040.700μs   | 4,294.750μs   | 4,223.156μs   | 4,769.100μs   | 215.156μs    | 5.01%  | 3.01x   |
| LeafReactParamBench       | benchParam | 0   | 10   | 10  | 17,041,664b | 9,973.200μs   | 10,710.610μs  | 10,376.970μs  | 13,052.700μs  | 871.227μs    | 8.13%  | 7.51x   |
| MacawReactParamBench      | benchParam | 0   | 10   | 10  | 4,404,816b  | 14,705.800μs  | 15,567.440μs  | 15,621.434μs  | 16,569.900μs  | 495.179μs    | 3.18%  | 10.91x  |
| MezonReactParamBench      | benchParam | 0   | 100  | 10  | 4,681,176b  | 1,070.680μs   | 1,427.126μs   | 1,139.771μs   | 4,012.790μs   | 862.979μs    | 60.47% | 1.00x   |
| MiladReactParamBench      | benchParam | 0   | 10   | 10  | 6,887,816b  | 21,768.200μs  | 23,694.400μs  | 22,963.173μs  | 30,491.500μs  | 2,333.609μs  | 9.85%  | 16.60x  |
| PeceeReactParamBench      | benchParam | 0   | 10   | 10  | 6,110,472b  | 46,821.300μs  | 50,153.060μs  | 48,169.419μs  | 65,957.100μs  | 5,510.359μs  | 10.99% | 35.14x  |
| PowerReactParamBench      | benchParam | 0   | 10   | 10  | 4,515,104b  | 17,027.000μs  | 17,705.200μs  | 17,330.517μs  | 18,659.600μs  | 570.959μs    | 3.22%  | 12.41x  |
| SteampixelReactParamBench | benchParam | 0   | 10   | 10  | 4,404,816b  | 240,130.300μs | 245,763.930μs | 245,531.622μs | 253,088.400μs | 3,355.995μs  | 1.37%  | 172.21x |
| TetoReactParamBench       | benchParam | 0   | 10   | 10  | 5,219,056b  | 10,345.100μs  | 11,818.020μs  | 11,057.018μs  | 15,774.800μs  | 1,599.283μs  | 13.53% | 8.28x   |
| ToroReactParamBench       | benchParam | 0   | 10   | 10  | 4,404,800b  | 8,782.900μs   | 13,319.470μs  | 10,442.532μs  | 29,984.700μs  | 6,346.543μs  | 47.65% | 9.33x   |
| ZaphpaReactParamBench     | benchParam | 0   | 10   | 10  | 4,421,912b  | 25,464.700μs  | 39,406.550μs  | 29,009.220μs  | 60,979.400μs  | 13,633.090μs | 34.60% | 27.61x  |
+---------------------------+------------+-----+------+-----+-------------+---------------+---------------+---------------+---------------+--------------+--------+---------+
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;As you can see in half of all cases Mezon Router is faster than Macaw router.&lt;/p&gt;

&lt;h1&gt;
  
  
  What's next?
&lt;/h1&gt;

&lt;p&gt;More articles can be found in my &lt;a href="https://twitter.com/mezonphp"&gt;Twitter&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  What is mezon/router?
&lt;/h1&gt;

&lt;p&gt;mezon/router now is:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;framework for routing with &lt;strong&gt;100% code coverage&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;10.0 points&lt;/strong&gt; on scrutinizer-ci.com&lt;/li&gt;
&lt;li&gt;router is a part of the &lt;a href="https://github.com/alexdodonov/mezon"&gt;Mezon Project&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Repo on github.com: &lt;a href="https://github.com/alexdodonov/mezon-router"&gt;https://github.com/alexdodonov/mezon-router&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  It will be great if you will contribute something to this project. Documentation, sharing the project in your social media, bug fixing, refactoring, or even &lt;strong&gt;&lt;a href="https://github.com/alexdodonov/mezon-router/issues"&gt;submitting issue with question or feature request&lt;/a&gt;&lt;/strong&gt;. Thanks anyway )
&lt;/h1&gt;

</description>
      <category>php</category>
      <category>benchmark</category>
      <category>mezon</category>
      <category>macaw</category>
    </item>
    <item>
      <title>New benchmark: Mezon Router is up to 480 times faster than Leaf Router</title>
      <dc:creator>alexdodonov</dc:creator>
      <pubDate>Mon, 19 Jul 2021 09:20:32 +0000</pubDate>
      <link>https://dev.to/alexdodonov/new-benchmark-mezon-router-is-up-to-480-times-faster-than-leaf-router-mf2</link>
      <guid>https://dev.to/alexdodonov/new-benchmark-mezon-router-is-up-to-480-times-faster-than-leaf-router-mf2</guid>
      <description>&lt;p&gt;Hi all! Today we have one more benchmark.&lt;/p&gt;

&lt;p&gt;As usual we have two cases:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;http server accepts request, launches php script, which handles this request, and then all script data is removed from memory. All following requests are processed in the same way. In this case very critical to launch script as soon as possible and we do not have time for long pre-compilations and preparations. Because all of it will be lost after the script will finish working;&lt;/li&gt;
&lt;li&gt;php script is launching, initiating all internal components (and router is one of them) and then starting processing requests. This case can be organized via for example react-php. It differs from the previous case because we can spend reasonable time to pre-compile routes for faster processing.&lt;/li&gt;
&lt;/ol&gt;

&lt;h1&gt;
  
  
  The first case
&lt;/h1&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="c1"&gt;// static routes&lt;/span&gt;
&lt;span class="nv"&gt;$_SERVER&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'REQUEST_METHOD'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'GET'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="nv"&gt;$_SERVER&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'REQUEST_URI'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'/static/0'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="nv"&gt;$router&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;RouteGenerator&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;generateLeafStaticRoutes&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1000&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nv"&gt;$router&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;run&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

&lt;span class="nv"&gt;$_SERVER&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'REQUEST_METHOD'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'GET'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="nv"&gt;$_SERVER&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'REQUEST_URI'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'/static/99'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="nv"&gt;$router&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;RouteGenerator&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;generateLeafStaticRoutes&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1000&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nv"&gt;$router&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;run&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

&lt;span class="nv"&gt;$_SERVER&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'REQUEST_METHOD'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'GET'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="nv"&gt;$_SERVER&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'REQUEST_URI'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'/static/199'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="nv"&gt;$router&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;RouteGenerator&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;generateLeafStaticRoutes&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1000&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nv"&gt;$router&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;run&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="c1"&gt;// and so on up to /static/999 route&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="c1"&gt;// non static routes&lt;/span&gt;
&lt;span class="nv"&gt;$_SERVER&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'REQUEST_METHOD'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'GET'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="nv"&gt;$_SERVER&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'REQUEST_URI'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'/param/0/1'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="nv"&gt;$router&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;RouteGenerator&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;generateLeafNonStaticRoutes&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1000&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nv"&gt;$router&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;run&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

&lt;span class="nv"&gt;$_SERVER&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'REQUEST_METHOD'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'GET'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="nv"&gt;$_SERVER&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'REQUEST_URI'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'/param/99/1'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="nv"&gt;$router&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;RouteGenerator&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;generateLeafNonStaticRoutes&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1000&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nv"&gt;$router&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;run&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

&lt;span class="nv"&gt;$_SERVER&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'REQUEST_METHOD'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'GET'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="nv"&gt;$_SERVER&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'REQUEST_URI'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'/param/199/1'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="nv"&gt;$router&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;RouteGenerator&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;generateLeafNonStaticRoutes&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1000&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nv"&gt;$router&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;run&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="c1"&gt;// and so on up to /param/999/1 route&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h1&gt;
  
  
  The second case
&lt;/h1&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="c1"&gt;// static routes&lt;/span&gt;
&lt;span class="nv"&gt;$router&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;RouteGenerator&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;generateLeafStaticRoutes&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1000&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="nv"&gt;$_SERVER&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'REQUEST_METHOD'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'GET'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="nv"&gt;$_SERVER&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'REQUEST_URI'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'/static/0'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="nv"&gt;$router&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;run&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

&lt;span class="nv"&gt;$_SERVER&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'REQUEST_METHOD'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'GET'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="nv"&gt;$_SERVER&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'REQUEST_URI'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'/static/99'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="nv"&gt;$router&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;run&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

&lt;span class="nv"&gt;$_SERVER&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'REQUEST_METHOD'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'GET'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="nv"&gt;$_SERVER&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'REQUEST_URI'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'/static/199'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="nv"&gt;$router&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;run&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="c1"&gt;// and so on up to /static/999 route&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="c1"&gt;// non static routes&lt;/span&gt;
&lt;span class="nv"&gt;$router&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;RouteGenerator&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;generateLeafNonStaticRoutes&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1000&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="nv"&gt;$_SERVER&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'REQUEST_METHOD'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'GET'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="nv"&gt;$_SERVER&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'REQUEST_URI'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'/param/0/1'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="nv"&gt;$router&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;run&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

&lt;span class="nv"&gt;$_SERVER&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'REQUEST_METHOD'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'GET'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="nv"&gt;$_SERVER&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'REQUEST_URI'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'/param/99/1'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="nv"&gt;$router&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;run&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

&lt;span class="nv"&gt;$_SERVER&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'REQUEST_METHOD'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'GET'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="nv"&gt;$_SERVER&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'REQUEST_URI'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'/param/199/1'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="nv"&gt;$router&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;run&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="c1"&gt;// and so on up to /param/1/999 route&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h1&gt;
  
  
  OK What do we have?
&lt;/h1&gt;

&lt;h2&gt;
  
  
  The first case + static routes
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;+------------------------------------+-------------+-----+------+-----+--------------+---------------+---------------+---------------+---------------+--------------+--------+---------+
| benchmark                          | subject     | set | revs | its | mem_peak     | best          | mean          | mode          | worst         | stdev        | rstdev | diff    |
+------------------------------------+-------------+-----+------+-----+--------------+---------------+---------------+---------------+---------------+--------------+--------+---------+
| CoffeeSingleRequestStaticBench     | benchStatic | 0   | 10   | 10  | 4,416,760b   | 47,939.100μs  | 57,073.950μs  | 52,448.314μs  | 92,250.800μs  | 12,711.502μs | 22.27% | 29.40x  |
| DVKSingleRequestStaticBench        | benchStatic | 0   | 10   | 10  | 4,873,600b   | 29,406.000μs  | 31,359.430μs  | 30,224.780μs  | 33,764.300μs  | 1,578.558μs  | 5.03%  | 16.15x  |
| HoaSingleRequestStaticBench        | benchStatic | 0   | 10   | 10  | 5,327,968b   | 50,925.400μs  | 55,086.900μs  | 52,131.973μs  | 69,609.000μs  | 5,744.275μs  | 10.43% | 28.38x  |
| IBSingleRequestStaticBench         | benchStatic | 0   | 10   | 10  | 5,115,480b   | 144,288.000μs | 156,082.490μs | 149,775.315μs | 179,781.900μs | 11,638.906μs | 7.46%  | 80.40x  |
| JoomlaSingleRequestStaticBench     | benchStatic | 0   | 10   | 10  | 4,402,888b   | 34,357.600μs  | 37,628.510μs  | 35,417.780μs  | 43,386.800μs  | 3,418.865μs  | 9.09%  | 19.38x  |
| LeafSingleRequestStaticBench       | benchStatic | 0   | 10   | 10  | 152,263,656b | 35,078.800μs  | 38,101.440μs  | 37,164.095μs  | 43,742.100μs  | 2,487.527μs  | 6.53%  | 19.63x  |
| MezonSingleRequestStaticBench      | benchStatic | 0   | 10   | 10  | 4,403,296b   | 10,426.900μs  | 11,419.360μs  | 11,486.902μs  | 12,418.300μs  | 619.609μs    | 5.43%  | 5.88x   |
| MiladSingleRequestStaticBench      | benchStatic | 0   | 10   | 10  | 35,129,704b  | 34,830.900μs  | 36,623.310μs  | 37,527.545μs  | 37,886.300μs  | 1,128.127μs  | 3.08%  | 18.87x  |
| PeceeSingleRequestStaticBench      | benchStatic | 0   | 10   | 10  | 8,565,512b   | 44,259.500μs  | 47,010.690μs  | 46,139.941μs  | 49,370.700μs  | 1,646.278μs  | 3.50%  | 24.22x  |
| PowerSingleRequestStaticBench      | benchStatic | 0   | 10   | 10  | 5,342,656b   | 23,509.500μs  | 27,317.570μs  | 26,116.556μs  | 37,681.900μs  | 3,827.772μs  | 14.01% | 14.07x  |
| SteampixelSingleRequestStaticBench | benchStatic | 0   | 10   | 10  | 4,402,920b   | 245,642.000μs | 252,848.030μs | 251,697.069μs | 266,980.900μs | 5,706.743μs  | 2.26%  | 130.25x |
| TetoSingleRequestStaticBench       | benchStatic | 0   | 10   | 10  | 6,760,328b   | 49,796.100μs  | 52,161.840μs  | 50,862.160μs  | 54,660.000μs  | 1,743.920μs  | 3.34%  | 26.87x  |
| ToroSingleRequestStaticBench       | benchStatic | 0   | 10   | 10  | 4,402,888b   | 1,598.300μs   | 1,941.310μs   | 1,947.188μs   | 2,284.000μs   | 178.139μs    | 9.18%  | 1.00x   |
| ZaphpaSingleRequestStaticBench     | benchStatic | 0   | 10   | 10  | 4,917,128b   | 39,126.200μs  | 41,894.490μs  | 40,677.525μs  | 50,615.000μs  | 3,206.580μs  | 7.65%  | 21.58x  |
+------------------------------------+-------------+-----+------+-----+--------------+---------------+---------------+---------------+---------------+--------------+--------+---------+
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  The first case + non-static routes
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;+-----------------------------------+------------+-----+------+-----+--------------+---------------+---------------+---------------+---------------+--------------+--------+--------+
| benchmark                         | subject    | set | revs | its | mem_peak     | best          | mean          | mode          | worst         | stdev        | rstdev | diff   |
+-----------------------------------+------------+-----+------+-----+--------------+---------------+---------------+---------------+---------------+--------------+--------+--------+
| CoffeeSingleRequestParamBench     | benchParam | 0   | 10   | 10  | 5,383,800b   | 64,149.900μs  | 68,643.870μs  | 66,966.558μs  | 77,000.900μs  | 3,921.354μs  | 5.71%  | 5.62x  |
| DVKSingleRequestParamBench        | benchParam | 0   | 10   | 10  | 4,865,984b   | 35,881.000μs  | 38,117.380μs  | 36,357.450μs  | 42,288.000μs  | 2,323.897μs  | 6.10%  | 3.12x  |
| HoaSingleRequestParamBench        | benchParam | 0   | 10   | 10  | 5,529,648b   | 55,389.700μs  | 59,949.570μs  | 58,228.467μs  | 69,895.800μs  | 4,100.430μs  | 6.84%  | 4.91x  |
| IBSingleRequestParamBench         | benchParam | 0   | 10   | 10  | 5,236,200b   | 174,096.700μs | 183,709.660μs | 182,310.005μs | 200,004.100μs | 6,536.611μs  | 3.56%  | 15.05x |
| JoomlaSingleRequestParamBench     | benchParam | 0   | 10   | 10  | 5,091,376b   | 43,591.300μs  | 48,020.070μs  | 44,911.551μs  | 75,717.400μs  | 9,302.832μs  | 19.37% | 3.93x  |
| LeafSingleRequestParamBench       | benchParam | 0   | 10   | 10  | 152,273,112b | 40,056.100μs  | 46,651.370μs  | 43,610.004μs  | 65,999.600μs  | 7,444.629μs  | 15.96% | 3.82x  |
| MezonSingleRequestParamBench      | benchParam | 0   | 10   | 10  | 141,056,056b | 160,933.400μs | 172,964.680μs | 167,216.711μs | 199,617.400μs | 12,057.579μs | 6.97%  | 14.17x |
| MiladSingleRequestParamBench      | benchParam | 0   | 10   | 10  | 35,988,240b  | 42,030.700μs  | 47,074.700μs  | 43,814.086μs  | 72,407.700μs  | 8,792.596μs  | 18.68% | 3.86x  |
| PeceeSingleRequestParamBench      | benchParam | 0   | 10   | 10  | 8,149,696b   | 90,550.200μs  | 96,066.750μs  | 93,528.156μs  | 110,313.000μs | 5,935.073μs  | 6.18%  | 7.87x  |
| PowerSingleRequestParamBench      | benchParam | 0   | 10   | 10  | 5,342,656b   | 24,573.500μs  | 26,827.200μs  | 25,561.859μs  | 31,686.900μs  | 2,271.591μs  | 8.47%  | 2.20x  |
| SteampixelSingleRequestParamBench | benchParam | 0   | 10   | 10  | 4,402,920b   | 270,994.300μs | 280,615.200μs | 283,062.232μs | 289,402.400μs | 6,105.135μs  | 2.18%  | 22.99x |
| TetoSingleRequestParamBench       | benchParam | 0   | 10   | 10  | 6,721,408b   | 66,515.100μs  | 69,275.460μs  | 70,647.850μs  | 72,914.600μs  | 2,245.638μs  | 3.24%  | 5.67x  |
| ToroSingleRequestParamBench       | benchParam | 0   | 10   | 10  | 4,402,888b   | 10,670.000μs  | 12,207.530μs  | 11,418.532μs  | 14,782.900μs  | 1,274.212μs  | 10.44% | 1.00x  |
| ZaphpaSingleRequestParamBench     | benchParam | 0   | 10   | 10  | 5,020,536b   | 53,622.100μs  | 63,750.200μs  | 57,301.614μs  | 79,378.700μs  | 9,849.251μs  | 15.45% | 5.22x  |
+-----------------------------------+------------+-----+------+-----+--------------+---------------+---------------+---------------+---------------+--------------+--------+--------+
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  The second case + static routes
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;+----------------------------+-------------+-----+------+-----+-------------+---------------+---------------+---------------+---------------+--------------+--------+------------+
| benchmark                  | subject     | set | revs | its | mem_peak    | best          | mean          | mode          | worst         | stdev        | rstdev | diff       |
+----------------------------+-------------+-----+------+-----+-------------+---------------+---------------+---------------+---------------+--------------+--------+------------+
| CoffeeReactStaticBench     | benchStatic | 0   | 10   | 10  | 4,402,888b  | 10,034.700μs  | 11,286.760μs  | 10,773.621μs  | 14,051.600μs  | 1,197.867μs  | 10.61% | 496.03x    |
| DVKReactStaticBench        | benchStatic | 0   | 100  | 10  | 4,402,888b  | 13,148.010μs  | 13,771.349μs  | 13,981.083μs  | 14,271.230μs  | 374.943μs    | 2.72%  | 605.23x    |
| HoaReactStaticBench        | benchStatic | 0   | 100  | 10  | 4,402,872b  | 4,298.550μs   | 4,763.865μs   | 4,589.042μs   | 5,725.870μs   | 416.916μs    | 8.75%  | 209.36x    |
| IBReactStaticBench         | benchStatic | 0   | 10   | 10  | 4,678,736b  | 30,335.300μs  | 32,897.550μs  | 33,364.751μs  | 34,822.400μs  | 1,411.764μs  | 4.29%  | 1,445.79x  |
| JoomlaReactStaticBench     | benchStatic | 0   | 10   | 10  | 4,402,888b  | 6,436.100μs   | 7,693.700μs   | 7,049.448μs   | 10,506.500μs  | 1,209.691μs  | 15.72% | 338.13x    |
| LeafReactStaticBench       | benchStatic | 0   | 10   | 10  | 17,027,288b | 9,771.700μs   | 10,912.610μs  | 10,306.522μs  | 14,403.800μs  | 1,344.440μs  | 12.32% | 479.59x    |
| MezonReactStaticBench      | benchStatic | 0   | 100  | 10  | 4,403,296b  | 18.780μs      | 22.754μs      | 19.670μs      | 47.190μs      | 8.421μs      | 37.01% | 1.00x      |
| MiladReactStaticBench      | benchStatic | 0   | 10   | 10  | 6,755,288b  | 17,780.200μs  | 19,608.880μs  | 18,943.244μs  | 22,691.900μs  | 1,404.706μs  | 7.16%  | 861.78x    |
| PeceeReactStaticBench      | benchStatic | 0   | 10   | 10  | 5,724,376b  | 22,200.700μs  | 23,723.330μs  | 23,272.309μs  | 25,580.900μs  | 1,023.059μs  | 4.31%  | 1,042.60x  |
| PowerReactStaticBench      | benchStatic | 0   | 10   | 10  | 4,510,072b  | 18,329.000μs  | 19,799.810μs  | 19,385.573μs  | 21,834.900μs  | 1,008.011μs  | 5.09%  | 870.17x    |
| SteampixelReactStaticBench | benchStatic | 0   | 10   | 10  | 4,402,888b  | 278,668.000μs | 294,515.740μs | 288,365.878μs | 351,544.700μs | 19,453.272μs | 6.61%  | 12,943.47x |
| TetoReactStaticBench       | benchStatic | 0   | 10   | 10  | 5,233,440b  | 4,675.600μs   | 5,433.200μs   | 5,129.949μs   | 6,929.700μs   | 654.188μs    | 12.04% | 238.78x    |
| ToroReactStaticBench       | benchStatic | 0   | 10   | 10  | 4,402,888b  | 397.800μs     | 528.510μs     | 467.933μs     | 796.000μs     | 122.898μs    | 23.25% | 23.23x     |
| ZaphpaReactStaticBench     | benchStatic | 0   | 10   | 10  | 4,402,888b  | 14,429.300μs  | 15,781.300μs  | 16,399.930μs  | 17,093.300μs  | 852.563μs    | 5.40%  | 693.56x    |
+----------------------------+-------------+-----+------+-----+-------------+---------------+---------------+---------------+---------------+--------------+--------+------------+
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  The second case + non-static routes
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;+----------------------------+-------------+-----+------+-----+-------------+---------------+---------------+---------------+---------------+--------------+--------+------------+
| benchmark                  | subject     | set | revs | its | mem_peak    | best          | mean          | mode          | worst         | stdev        | rstdev | diff       |
+----------------------------+-------------+-----+------+-----+-------------+---------------+---------------+---------------+---------------+--------------+--------+------------+
| CoffeeReactStaticBench     | benchStatic | 0   | 10   | 10  | 4,402,888b  | 10,034.700μs  | 11,286.760μs  | 10,773.621μs  | 14,051.600μs  | 1,197.867μs  | 10.61% | 496.03x    |
| DVKReactStaticBench        | benchStatic | 0   | 100  | 10  | 4,402,888b  | 13,148.010μs  | 13,771.349μs  | 13,981.083μs  | 14,271.230μs  | 374.943μs    | 2.72%  | 605.23x    |
| HoaReactStaticBench        | benchStatic | 0   | 100  | 10  | 4,402,872b  | 4,298.550μs   | 4,763.865μs   | 4,589.042μs   | 5,725.870μs   | 416.916μs    | 8.75%  | 209.36x    |
| IBReactStaticBench         | benchStatic | 0   | 10   | 10  | 4,678,736b  | 30,335.300μs  | 32,897.550μs  | 33,364.751μs  | 34,822.400μs  | 1,411.764μs  | 4.29%  | 1,445.79x  |
| JoomlaReactStaticBench     | benchStatic | 0   | 10   | 10  | 4,402,888b  | 6,436.100μs   | 7,693.700μs   | 7,049.448μs   | 10,506.500μs  | 1,209.691μs  | 15.72% | 338.13x    |
| LeafReactStaticBench       | benchStatic | 0   | 10   | 10  | 17,027,288b | 9,771.700μs   | 10,912.610μs  | 10,306.522μs  | 14,403.800μs  | 1,344.440μs  | 12.32% | 479.59x    |
| MezonReactStaticBench      | benchStatic | 0   | 100  | 10  | 4,403,296b  | 18.780μs      | 22.754μs      | 19.670μs      | 47.190μs      | 8.421μs      | 37.01% | 1.00x      |
| MiladReactStaticBench      | benchStatic | 0   | 10   | 10  | 6,755,288b  | 17,780.200μs  | 19,608.880μs  | 18,943.244μs  | 22,691.900μs  | 1,404.706μs  | 7.16%  | 861.78x    |
| PeceeReactStaticBench      | benchStatic | 0   | 10   | 10  | 5,724,376b  | 22,200.700μs  | 23,723.330μs  | 23,272.309μs  | 25,580.900μs  | 1,023.059μs  | 4.31%  | 1,042.60x  |
| PowerReactStaticBench      | benchStatic | 0   | 10   | 10  | 4,510,072b  | 18,329.000μs  | 19,799.810μs  | 19,385.573μs  | 21,834.900μs  | 1,008.011μs  | 5.09%  | 870.17x    |
| SteampixelReactStaticBench | benchStatic | 0   | 10   | 10  | 4,402,888b  | 278,668.000μs | 294,515.740μs | 288,365.878μs | 351,544.700μs | 19,453.272μs | 6.61%  | 12,943.47x |
| TetoReactStaticBench       | benchStatic | 0   | 10   | 10  | 5,233,440b  | 4,675.600μs   | 5,433.200μs   | 5,129.949μs   | 6,929.700μs   | 654.188μs    | 12.04% | 238.78x    |
| ToroReactStaticBench       | benchStatic | 0   | 10   | 10  | 4,402,888b  | 397.800μs     | 528.510μs     | 467.933μs     | 796.000μs     | 122.898μs    | 23.25% | 23.23x     |
| ZaphpaReactStaticBench     | benchStatic | 0   | 10   | 10  | 4,402,888b  | 14,429.300μs  | 15,781.300μs  | 16,399.930μs  | 17,093.300μs  | 852.563μs    | 5.40%  | 693.56x    |
+----------------------------+-------------+-----+------+-----+-------------+---------------+---------------+---------------+---------------+--------------+--------+------------+
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;As you can see almost in all cases Mezon Router is faster than Leaf router.&lt;/p&gt;

&lt;h1&gt;
  
  
  What's next?
&lt;/h1&gt;

&lt;p&gt;More articles can be found in my &lt;a href="https://twitter.com/mezonphp"&gt;Twitter&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  What is mezon/router?
&lt;/h1&gt;

&lt;p&gt;mezon/router now is:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;framework for routing with &lt;strong&gt;100% code coverage&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;10.0 points&lt;/strong&gt; on scrutinizer-ci.com&lt;/li&gt;
&lt;li&gt;router is a part of the &lt;a href="https://github.com/alexdodonov/mezon"&gt;Mezon Project&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Repo on github.com: &lt;a href="https://github.com/alexdodonov/mezon-router"&gt;https://github.com/alexdodonov/mezon-router&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  It will be great if you will contribute something to this project. Documentation, sharing the project in your social media, bug fixing, refactoring, or even &lt;strong&gt;&lt;a href="https://github.com/alexdodonov/mezon-router/issues"&gt;submitting issue with question or feature request&lt;/a&gt;&lt;/strong&gt;. Thanks anyway )
&lt;/h1&gt;

</description>
    </item>
  </channel>
</rss>
