Browse Source

Refactored controllers, error and view handlers to classes for readability.

Frederic G. MARAND 6 years ago
parent
commit
b327dc29b3

+ 294 - 222
.idea/workspace.xml

@@ -2,9 +2,18 @@
 <project version="4">
   <component name="ChangeListManager">
     <list default="true" id="ddb2382b-0607-474c-bb0c-2ed75e2c2479" name="Default" comment="">
-      <change beforePath="$PROJECT_DIR$/.idea/php.xml" afterPath="$PROJECT_DIR$/.idea/php.xml" />
+      <change beforePath="" afterPath="$PROJECT_DIR$/src/demo/Controllers/DelegatingController.php" />
+      <change beforePath="" afterPath="$PROJECT_DIR$/src/demo/Controllers/ErrorController.php" />
+      <change beforePath="" afterPath="$PROJECT_DIR$/src/demo/Controllers/EscapeController.php" />
+      <change beforePath="" afterPath="$PROJECT_DIR$/src/demo/Controllers/HomeController.php" />
+      <change beforePath="" afterPath="$PROJECT_DIR$/src/demo/Controllers/StreamController.php" />
+      <change beforePath="" afterPath="$PROJECT_DIR$/src/demo/Errors/GenericErrorHandler.php" />
+      <change beforePath="" afterPath="$PROJECT_DIR$/src/demo/Errors/HttpErrorHandler.php" />
+      <change beforePath="" afterPath="$PROJECT_DIR$/src/demo/Views/JsonView.php" />
       <change beforePath="$PROJECT_DIR$/.idea/workspace.xml" afterPath="$PROJECT_DIR$/.idea/workspace.xml" />
       <change beforePath="$PROJECT_DIR$/src/controllers.php" afterPath="$PROJECT_DIR$/src/controllers.php" />
+      <change beforePath="$PROJECT_DIR$/src/demo/Controllers/BlogController.php" afterPath="$PROJECT_DIR$/src/demo/Controllers/BlogController.php" />
+      <change beforePath="$PROJECT_DIR$/templates/errors/500.html.twig" afterPath="$PROJECT_DIR$/templates/errors/500.html.twig" />
     </list>
     <option name="EXCLUDED_CONVERTED_TO_IGNORED" value="true" />
     <option name="TRACKING_ENABLED" value="true" />
@@ -17,28 +26,7 @@
     <pharConfigPath>$PROJECT_DIR$/composer.json</pharConfigPath>
   </component>
   <component name="FileEditorManager">
-    <leaf>
-      <file leaf-file-name="controllers.php" pinned="false" current-in-tab="true">
-        <entry file="file://$PROJECT_DIR$/src/controllers.php">
-          <provider selected="true" editor-type-id="text-editor">
-            <state relative-caret-position="242">
-              <caret line="148" column="38" lean-forward="false" selection-start-line="148" selection-start-column="38" selection-end-line="148" selection-end-column="38" />
-              <folding />
-            </state>
-          </provider>
-        </entry>
-      </file>
-      <file leaf-file-name="JsonResponse.php" pinned="false" current-in-tab="false">
-        <entry file="file://$PROJECT_DIR$/vendor/symfony/http-foundation/JsonResponse.php">
-          <provider selected="true" editor-type-id="text-editor">
-            <state relative-caret-position="125">
-              <caret line="30" column="73" lean-forward="true" selection-start-line="30" selection-start-column="14" selection-end-line="30" selection-end-column="73" />
-              <folding />
-            </state>
-          </provider>
-        </entry>
-      </file>
-    </leaf>
+    <leaf />
   </component>
   <component name="FindInProjectRecents">
     <findStrings>
@@ -54,6 +42,8 @@
       <find>security.authorization_checker</find>
       <find>hello</find>
       <find>ello</find>
+      <find>fifi</find>
+      <find>your</find>
     </findStrings>
     <dirStrings>
       <dir>$PROJECT_DIR$/vendor</dir>
@@ -72,12 +62,20 @@
         <option value="$PROJECT_DIR$/config/prod.php" />
         <option value="$PROJECT_DIR$/src/demo/User.php" />
         <option value="$PROJECT_DIR$/src/demo/UserConverter.php" />
-        <option value="$PROJECT_DIR$/src/demo/Controllers/BlogController.php" />
         <option value="$PROJECT_DIR$/src/demo/Controllers/UserController.php" />
-        <option value="$PROJECT_DIR$/src/demo/Controllers/FeedbackController.php" />
-        <option value="$PROJECT_DIR$/src/demo/Controllers/ErrorController.php" />
         <option value="$PROJECT_DIR$/src/app.php" />
         <option value="$PROJECT_DIR$/src/demo/AppRoute.php" />
+        <option value="$PROJECT_DIR$/src/demo/Controllers/StreamController.php" />
+        <option value="$PROJECT_DIR$/src/demo/Controllers/EscapeController.php" />
+        <option value="$PROJECT_DIR$/src/demo/Controllers/HomeController.php" />
+        <option value="$PROJECT_DIR$/src/demo/Controllers/BlogController.php" />
+        <option value="$PROJECT_DIR$/src/demo/Controllers/DelegatingController.php" />
+        <option value="$PROJECT_DIR$/src/demo/Controllers/FeedbackController.php" />
+        <option value="$PROJECT_DIR$/src/demo/Controllers/ErrorController.php" />
+        <option value="$PROJECT_DIR$/src/demo/Errors/GenericErrorHandler.php" />
+        <option value="$PROJECT_DIR$/templates/errors/500.html.twig" />
+        <option value="$PROJECT_DIR$/src/demo/Errors/HttpErrorHandler.php" />
+        <option value="$PROJECT_DIR$/src/demo/Views/JsonView.php" />
         <option value="$PROJECT_DIR$/src/controllers.php" />
       </list>
     </option>
@@ -245,16 +243,59 @@
               <item name="demo" type="2a2b976b:PhpTreeStructureProvider$1" />
               <item name="Controllers" type="2a2b976b:PhpTreeStructureProvider$1" />
             </path>
+            <path>
+              <item name="silex-book" type="b2602c69:ProjectViewProjectNode" />
+              <item name="silex-book" type="2a2b976b:PhpTreeStructureProvider$1" />
+              <item name="src" type="2a2b976b:PhpTreeStructureProvider$1" />
+              <item name="demo" type="2a2b976b:PhpTreeStructureProvider$1" />
+              <item name="Errors" type="2a2b976b:PhpTreeStructureProvider$1" />
+            </path>
+            <path>
+              <item name="silex-book" type="b2602c69:ProjectViewProjectNode" />
+              <item name="silex-book" type="2a2b976b:PhpTreeStructureProvider$1" />
+              <item name="src" type="2a2b976b:PhpTreeStructureProvider$1" />
+              <item name="demo" type="2a2b976b:PhpTreeStructureProvider$1" />
+              <item name="Views" type="2a2b976b:PhpTreeStructureProvider$1" />
+            </path>
+            <path>
+              <item name="silex-book" type="b2602c69:ProjectViewProjectNode" />
+              <item name="silex-book" type="2a2b976b:PhpTreeStructureProvider$1" />
+              <item name="var" type="2a2b976b:PhpTreeStructureProvider$1" />
+            </path>
+            <path>
+              <item name="silex-book" type="b2602c69:ProjectViewProjectNode" />
+              <item name="silex-book" type="2a2b976b:PhpTreeStructureProvider$1" />
+              <item name="vendor" type="2a2b976b:PhpTreeStructureProvider$1" />
+            </path>
+            <path>
+              <item name="silex-book" type="b2602c69:ProjectViewProjectNode" />
+              <item name="silex-book" type="2a2b976b:PhpTreeStructureProvider$1" />
+              <item name="vendor" type="2a2b976b:PhpTreeStructureProvider$1" />
+              <item name="pimple" type="2a2b976b:PhpTreeStructureProvider$1" />
+            </path>
+            <path>
+              <item name="silex-book" type="b2602c69:ProjectViewProjectNode" />
+              <item name="silex-book" type="2a2b976b:PhpTreeStructureProvider$1" />
+              <item name="vendor" type="2a2b976b:PhpTreeStructureProvider$1" />
+              <item name="pimple" type="2a2b976b:PhpTreeStructureProvider$1" />
+              <item name="pimple" type="2a2b976b:PhpTreeStructureProvider$1" />
+            </path>
             <path>
               <item name="silex-book" type="b2602c69:ProjectViewProjectNode" />
               <item name="silex-book" type="2a2b976b:PhpTreeStructureProvider$1" />
               <item name="vendor" type="2a2b976b:PhpTreeStructureProvider$1" />
+              <item name="pimple" type="2a2b976b:PhpTreeStructureProvider$1" />
+              <item name="pimple" type="2a2b976b:PhpTreeStructureProvider$1" />
+              <item name="src" type="2a2b976b:PhpTreeStructureProvider$1" />
             </path>
             <path>
               <item name="silex-book" type="b2602c69:ProjectViewProjectNode" />
               <item name="silex-book" type="2a2b976b:PhpTreeStructureProvider$1" />
               <item name="vendor" type="2a2b976b:PhpTreeStructureProvider$1" />
-              <item name="composer" type="2a2b976b:PhpTreeStructureProvider$1" />
+              <item name="pimple" type="2a2b976b:PhpTreeStructureProvider$1" />
+              <item name="pimple" type="2a2b976b:PhpTreeStructureProvider$1" />
+              <item name="src" type="2a2b976b:PhpTreeStructureProvider$1" />
+              <item name="Pimple" type="2a2b976b:PhpTreeStructureProvider$1" />
             </path>
             <path>
               <item name="silex-book" type="b2602c69:ProjectViewProjectNode" />
@@ -297,7 +338,20 @@
               <item name="silex-book" type="2a2b976b:PhpTreeStructureProvider$1" />
               <item name="vendor" type="2a2b976b:PhpTreeStructureProvider$1" />
               <item name="symfony" type="2a2b976b:PhpTreeStructureProvider$1" />
-              <item name="http-foundation" type="2a2b976b:PhpTreeStructureProvider$1" />
+              <item name="http-kernel" type="2a2b976b:PhpTreeStructureProvider$1" />
+            </path>
+            <path>
+              <item name="silex-book" type="b2602c69:ProjectViewProjectNode" />
+              <item name="silex-book" type="2a2b976b:PhpTreeStructureProvider$1" />
+              <item name="vendor" type="2a2b976b:PhpTreeStructureProvider$1" />
+              <item name="symfony" type="2a2b976b:PhpTreeStructureProvider$1" />
+              <item name="http-kernel" type="2a2b976b:PhpTreeStructureProvider$1" />
+              <item name="Event" type="2a2b976b:PhpTreeStructureProvider$1" />
+            </path>
+            <path>
+              <item name="silex-book" type="b2602c69:ProjectViewProjectNode" />
+              <item name="silex-book" type="2a2b976b:PhpTreeStructureProvider$1" />
+              <item name="web" type="2a2b976b:PhpTreeStructureProvider$1" />
             </path>
           </expand>
           <select />
@@ -344,28 +398,27 @@
       <workItem from="1511975755546" duration="4189000" />
       <workItem from="1512542104610" duration="4501000" />
       <workItem from="1512547041317" duration="573000" />
-      <workItem from="1512580189446" duration="1035000" />
+      <workItem from="1512580189446" duration="7097000" />
     </task>
     <servers />
   </component>
   <component name="TimeTrackingManager">
-    <option name="totallyTimeSpent" value="16067000" />
+    <option name="totallyTimeSpent" value="23335000" />
   </component>
   <component name="ToolWindowManager">
     <frame x="0" y="23" width="1676" height="1027" extended-state="6" />
-    <editor active="true" />
     <layout>
-      <window_info id="Project" active="false" anchor="right" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="true" show_stripe_button="true" weight="0.27111384" sideWeight="0.5" order="5" side_tool="false" content_ui="combo" />
+      <window_info id="Project" active="false" anchor="right" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="true" show_stripe_button="true" weight="0.27233782" sideWeight="0.5" order="5" side_tool="false" content_ui="combo" />
       <window_info id="TODO" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33" sideWeight="0.5" order="10" side_tool="false" content_ui="tabs" />
       <window_info id="Docker" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33" sideWeight="0.5" order="11" side_tool="false" content_ui="tabs" />
       <window_info id="Event Log" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.32939914" sideWeight="0.5" order="0" side_tool="true" content_ui="tabs" />
       <window_info id="Database" active="false" anchor="right" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33" sideWeight="0.5" order="0" side_tool="false" content_ui="tabs" />
       <window_info id="Run" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33" sideWeight="0.5" order="6" side_tool="false" content_ui="tabs" />
       <window_info id="Version Control" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.32939914" sideWeight="0.5" order="1" side_tool="false" content_ui="tabs" />
-      <window_info id="Structure" active="false" anchor="left" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="true" show_stripe_button="true" weight="0.24847001" sideWeight="0.5" order="1" side_tool="false" content_ui="tabs" />
+      <window_info id="Structure" active="false" anchor="left" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="true" show_stripe_button="true" weight="0.24112608" sideWeight="0.5" order="1" side_tool="false" content_ui="tabs" />
       <window_info id="Mongo Explorer" active="false" anchor="right" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33" sideWeight="0.5" order="1" side_tool="false" content_ui="tabs" />
       <window_info id="Terminal" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33" sideWeight="0.5" order="2" side_tool="false" content_ui="tabs" />
-      <window_info id="Debug" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="true" show_stripe_button="true" weight="0.39914164" sideWeight="0.5" order="7" side_tool="false" content_ui="tabs" />
+      <window_info id="Debug" active="true" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="true" show_stripe_button="true" weight="0.39914164" sideWeight="0.5" order="7" side_tool="false" content_ui="tabs" />
       <window_info id="Favorites" active="false" anchor="left" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33" sideWeight="0.5" order="0" side_tool="true" content_ui="tabs" />
       <window_info id="Cvs" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.25" sideWeight="0.5" order="8" side_tool="false" content_ui="tabs" />
       <window_info id="Message" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33" sideWeight="0.5" order="4" side_tool="false" content_ui="tabs" />
@@ -385,39 +438,30 @@
   </component>
   <component name="XDebuggerManager">
     <breakpoint-manager>
-      <breakpoints>
-        <line-breakpoint enabled="true" type="php">
-          <url>file://$PROJECT_DIR$/src/controllers.php</url>
-          <line>172</line>
-          <option name="timeStamp" value="28" />
-        </line-breakpoint>
-        <line-breakpoint enabled="true" type="php">
-          <url>file://$PROJECT_DIR$/src/controllers.php</url>
-          <line>55</line>
-          <option name="timeStamp" value="37" />
-        </line-breakpoint>
-        <line-breakpoint enabled="true" type="php">
-          <url>file://$PROJECT_DIR$/src/controllers.php</url>
-          <line>60</line>
-          <option name="timeStamp" value="39" />
-        </line-breakpoint>
-        <line-breakpoint enabled="true" type="php">
-          <url>file://$PROJECT_DIR$/src/controllers.php</url>
-          <line>90</line>
-          <option name="timeStamp" value="56" />
-        </line-breakpoint>
-        <line-breakpoint enabled="true" type="php">
-          <url>file://$PROJECT_DIR$/src/controllers.php</url>
-          <line>156</line>
-          <option name="timeStamp" value="58" />
-        </line-breakpoint>
-      </breakpoints>
-      <option name="time" value="61" />
+      <breakpoints-dialog>
+        <breakpoints-dialog />
+      </breakpoints-dialog>
+      <option name="time" value="78" />
     </breakpoint-manager>
     <watches-manager />
   </component>
   <component name="debuggerHistoryManager">
     <expressions id="evaluateExpression">
+      <expression>
+        <expression-string>func_get_args()</expression-string>
+        <language-id>PHP</language-id>
+        <evaluation-mode>EXPRESSION</evaluation-mode>
+      </expression>
+      <expression>
+        <expression-string>new ReflectionFunction($this-&gt;callback)</expression-string>
+        <language-id>PHP</language-id>
+        <evaluation-mode>EXPRESSION</evaluation-mode>
+      </expression>
+      <expression>
+        <expression-string>$this-&gt;callback</expression-string>
+        <language-id>PHP</language-id>
+        <evaluation-mode>EXPRESSION</evaluation-mode>
+      </expression>
       <expression>
         <expression-string>$response</expression-string>
         <language-id>PHP</language-id>
@@ -436,374 +480,402 @@
     </expressions>
   </component>
   <component name="editorHistoryManager">
-    <entry file="file://$PROJECT_DIR$/vendor/symfony/routing/Route.php">
+    <entry file="file://$PROJECT_DIR$/vendor/symfony/http-kernel/Event/FilterResponseEvent.php">
       <provider selected="true" editor-type-id="text-editor">
-        <state relative-caret-position="5985">
-          <caret line="399" column="0" lean-forward="false" selection-start-line="399" selection-start-column="0" selection-end-line="399" selection-end-column="0" />
+        <state relative-caret-position="328">
+          <caret line="44" column="0" lean-forward="false" selection-start-line="44" selection-start-column="0" selection-end-line="44" selection-end-column="0" />
         </state>
       </provider>
     </entry>
-    <entry file="file://$PROJECT_DIR$/README.rst">
+    <entry file="file://$PROJECT_DIR$/vendor/silex/silex/src/Silex/EventListener/ConverterListener.php">
       <provider selected="true" editor-type-id="text-editor">
-        <state relative-caret-position="874">
-          <caret line="77" column="0" lean-forward="true" selection-start-line="77" selection-start-column="0" selection-end-line="77" selection-end-column="0" />
+        <state relative-caret-position="195">
+          <caret line="52" column="53" lean-forward="false" selection-start-line="52" selection-start-column="53" selection-end-line="52" selection-end-column="53" />
         </state>
       </provider>
     </entry>
-    <entry file="file://$PROJECT_DIR$/templates/index.html.twig">
+    <entry file="file://$PROJECT_DIR$/vendor/symfony/event-dispatcher/EventDispatcher.php">
       <provider selected="true" editor-type-id="text-editor">
-        <state relative-caret-position="45">
-          <caret line="3" column="4" lean-forward="false" selection-start-line="3" selection-start-column="4" selection-end-line="3" selection-end-column="4" />
+        <state relative-caret-position="207">
+          <caret line="126" column="0" lean-forward="false" selection-start-line="126" selection-start-column="0" selection-end-line="126" selection-end-column="0" />
         </state>
       </provider>
     </entry>
-    <entry file="file://$PROJECT_DIR$/vendor/symfony/debug/Debug.php">
+    <entry file="file://$PROJECT_DIR$/vendor/silex/silex/src/Silex/Provider/HttpKernelServiceProvider.php">
       <provider selected="true" editor-type-id="text-editor">
-        <state relative-caret-position="364">
-          <caret line="33" column="27" lean-forward="false" selection-start-line="33" selection-start-column="27" selection-end-line="33" selection-end-column="27" />
+        <state relative-caret-position="292">
+          <caret line="91" column="0" lean-forward="false" selection-start-line="91" selection-start-column="0" selection-end-line="91" selection-end-column="0" />
         </state>
       </provider>
     </entry>
-    <entry file="file://$PROJECT_DIR$/web/index.php">
+    <entry file="file://$PROJECT_DIR$/vendor/silex/silex/doc/usage.rst">
       <provider selected="true" editor-type-id="text-editor">
-        <state relative-caret-position="90">
-          <caret line="6" column="0" lean-forward="true" selection-start-line="6" selection-start-column="0" selection-end-line="6" selection-end-column="0" />
-          <folding />
+        <state relative-caret-position="316">
+          <caret line="584" column="0" lean-forward="true" selection-start-line="584" selection-start-column="0" selection-end-line="584" selection-end-column="0" />
         </state>
       </provider>
     </entry>
-    <entry file="file://$PROJECT_DIR$/templates/errors/4xx.html.twig">
-      <provider selected="true" editor-type-id="text-editor">
-        <state relative-caret-position="60">
-          <caret line="4" column="14" lean-forward="false" selection-start-line="4" selection-start-column="14" selection-end-line="4" selection-end-column="14" />
+    <entry file="file://$PROJECT_DIR$/README.md">
+      <provider selected="true" editor-type-id="split-provider[text-editor;markdown-preview-editor]">
+        <state split_layout="FIRST">
+          <first_editor relative-caret-position="195">
+            <caret line="13" column="0" lean-forward="true" selection-start-line="13" selection-start-column="0" selection-end-line="13" selection-end-column="0" />
+          </first_editor>
+          <second_editor />
         </state>
       </provider>
     </entry>
-    <entry file="file://$PROJECT_DIR$/config/prod.php">
+    <entry file="file://$PROJECT_DIR$/composer.json">
       <provider selected="true" editor-type-id="text-editor">
-        <state relative-caret-position="105">
-          <caret line="7" column="17" lean-forward="false" selection-start-line="7" selection-start-column="17" selection-end-line="7" selection-end-column="17" />
-          <folding />
+        <state relative-caret-position="585">
+          <caret line="39" column="6" lean-forward="false" selection-start-line="39" selection-start-column="6" selection-end-line="39" selection-end-column="6" />
         </state>
       </provider>
     </entry>
-    <entry file="file://$PROJECT_DIR$/vendor/symfony/http-foundation/Request.php">
+    <entry file="jar://$APPLICATION_HOME_DIR$/plugins/php/lib/php.jar!/stubs/standard/standard_3.php">
       <provider selected="true" editor-type-id="text-editor">
-        <state relative-caret-position="102">
-          <caret line="768" column="27" lean-forward="true" selection-start-line="768" selection-start-column="27" selection-end-line="768" selection-end-column="27" />
+        <state relative-caret-position="177">
+          <caret line="40" column="9" lean-forward="false" selection-start-line="40" selection-start-column="9" selection-end-line="40" selection-end-column="9" />
           <folding />
         </state>
       </provider>
     </entry>
-    <entry file="file://$PROJECT_DIR$/web/index_dev.php">
+    <entry file="file://$PROJECT_DIR$/vendor/symfony/http-foundation/BinaryFileResponse.php">
       <provider selected="true" editor-type-id="text-editor">
-        <state relative-caret-position="285">
-          <caret line="18" column="0" lean-forward="true" selection-start-line="18" selection-start-column="0" selection-end-line="18" selection-end-column="0" />
-          <folding />
+        <state relative-caret-position="470">
+          <caret line="311" column="0" lean-forward="false" selection-start-line="311" selection-start-column="0" selection-end-line="311" selection-end-column="0" />
         </state>
       </provider>
     </entry>
-    <entry file="file://$PROJECT_DIR$/config/dev.php">
+    <entry file="file://$PROJECT_DIR$/vendor/silex/silex/src/Silex/Provider/ValidatorServiceProvider.php">
       <provider selected="true" editor-type-id="text-editor">
-        <state relative-caret-position="270">
-          <caret line="18" column="0" lean-forward="true" selection-start-line="18" selection-start-column="0" selection-end-line="18" selection-end-column="0" />
-          <folding />
+        <state relative-caret-position="0">
+          <caret line="0" column="0" lean-forward="false" selection-start-line="0" selection-start-column="0" selection-end-line="0" selection-end-column="0" />
         </state>
       </provider>
     </entry>
-    <entry file="file://$PROJECT_DIR$/src/demo/User.php">
+    <entry file="file://$PROJECT_DIR$/vendor/silex/silex/src/Silex/Provider/TwigServiceProvider.php">
       <provider selected="true" editor-type-id="text-editor">
-        <state relative-caret-position="240">
-          <caret line="16" column="16" lean-forward="true" selection-start-line="16" selection-start-column="16" selection-end-line="16" selection-end-column="16" />
+        <state relative-caret-position="0">
+          <caret line="0" column="0" lean-forward="false" selection-start-line="0" selection-start-column="0" selection-end-line="0" selection-end-column="0" />
         </state>
       </provider>
     </entry>
-    <entry file="file://$PROJECT_DIR$/vendor/silex/silex/src/Silex/Controller.php">
+    <entry file="file://$PROJECT_DIR$/vendor/silex/silex/src/Silex/Application/TwigTrait.php">
       <provider selected="true" editor-type-id="text-editor">
-        <state relative-caret-position="852">
-          <caret line="95" column="0" lean-forward="false" selection-start-line="95" selection-start-column="0" selection-end-line="95" selection-end-column="0" />
-          <folding />
+        <state relative-caret-position="327">
+          <caret line="34" column="23" lean-forward="true" selection-start-line="34" selection-start-column="23" selection-end-line="34" selection-end-column="23" />
         </state>
       </provider>
     </entry>
-    <entry file="file://$PROJECT_DIR$/vendor/symfony/routing/Route.php">
+    <entry file="file://$PROJECT_DIR$/vendor/silex/silex/src/Silex/Application/SecurityTrait.php">
       <provider selected="true" editor-type-id="text-editor">
-        <state relative-caret-position="852">
-          <caret line="399" column="0" lean-forward="false" selection-start-line="399" selection-start-column="0" selection-end-line="399" selection-end-column="0" />
+        <state relative-caret-position="781">
+          <caret line="50" column="33" lean-forward="true" selection-start-line="50" selection-start-column="33" selection-end-line="50" selection-end-column="33" />
         </state>
       </provider>
     </entry>
-    <entry file="file://$PROJECT_DIR$/src/demo/Controllers/BlogController.php">
+    <entry file="file://$PROJECT_DIR$/vendor/silex/silex/src/Silex/Route.php">
       <provider selected="true" editor-type-id="text-editor">
-        <state relative-caret-position="195">
-          <caret line="13" column="0" lean-forward="true" selection-start-line="13" selection-start-column="0" selection-end-line="13" selection-end-column="0" />
+        <state relative-caret-position="553">
+          <caret line="81" column="5" lean-forward="true" selection-start-line="81" selection-start-column="5" selection-end-line="81" selection-end-column="5" />
+          <folding />
         </state>
       </provider>
     </entry>
-    <entry file="file://$PROJECT_DIR$/src/demo/Controllers/UserController.php">
+    <entry file="file://$PROJECT_DIR$/vendor/silex/silex/doc/providers/security.rst">
       <provider selected="true" editor-type-id="text-editor">
-        <state relative-caret-position="195">
-          <caret line="13" column="39" lean-forward="false" selection-start-line="13" selection-start-column="39" selection-end-line="13" selection-end-column="39" />
-          <folding />
+        <state relative-caret-position="259">
+          <caret line="23" column="4" lean-forward="true" selection-start-line="23" selection-start-column="4" selection-end-line="23" selection-end-column="4" />
         </state>
       </provider>
     </entry>
-    <entry file="file://$PROJECT_DIR$/src/demo/UserConverter.php">
+    <entry file="file://$PROJECT_DIR$/vendor/silex/silex/src/Silex/Route/SecurityTrait.php">
       <provider selected="true" editor-type-id="text-editor">
-        <state relative-caret-position="255">
-          <caret line="17" column="0" lean-forward="false" selection-start-line="17" selection-start-column="0" selection-end-line="17" selection-end-column="0" />
+        <state relative-caret-position="375">
+          <caret line="25" column="53" lean-forward="false" selection-start-line="25" selection-start-column="23" selection-end-line="25" selection-end-column="53" />
         </state>
       </provider>
     </entry>
-    <entry file="file://$PROJECT_DIR$/src/demo/Controllers/ErrorController.php" />
-    <entry file="file://$PROJECT_DIR$/vendor/symfony/http-kernel/Controller/ControllerResolver.php">
+    <entry file="file://$PROJECT_DIR$/src/app.php">
       <provider selected="true" editor-type-id="text-editor">
-        <state relative-caret-position="170">
-          <caret line="194" column="0" lean-forward="false" selection-start-line="194" selection-start-column="0" selection-end-line="194" selection-end-column="0" />
+        <state relative-caret-position="405">
+          <caret line="27" column="0" lean-forward="true" selection-start-line="27" selection-start-column="0" selection-end-line="27" selection-end-column="0" />
+          <folding />
         </state>
       </provider>
     </entry>
-    <entry file="file://$PROJECT_DIR$/vendor/twig/twig/lib/Twig/Environment.php">
+    <entry file="file://$PROJECT_DIR$/src/demo/AppRoute.php">
       <provider selected="true" editor-type-id="text-editor">
-        <state relative-caret-position="327">
-          <caret line="477" column="0" lean-forward="false" selection-start-line="477" selection-start-column="0" selection-end-line="477" selection-end-column="0" />
+        <state relative-caret-position="330">
+          <caret line="22" column="0" lean-forward="false" selection-start-line="22" selection-start-column="0" selection-end-line="22" selection-end-column="0" />
+          <folding />
         </state>
       </provider>
     </entry>
-    <entry file="file://$PROJECT_DIR$/vendor/twig/twig/lib/Twig/Template.php">
+    <entry file="file://$PROJECT_DIR$/vendor/symfony/http-foundation/JsonResponse.php">
       <provider selected="true" editor-type-id="text-editor">
-        <state relative-caret-position="357">
-          <caret line="382" column="0" lean-forward="false" selection-start-line="382" selection-start-column="0" selection-end-line="382" selection-end-column="0" />
+        <state relative-caret-position="125">
+          <caret line="30" column="73" lean-forward="true" selection-start-line="30" selection-start-column="14" selection-end-line="30" selection-end-column="73" />
+          <folding />
         </state>
       </provider>
     </entry>
-    <entry file="file://$PROJECT_DIR$/vendor/symfony/http-kernel/Exception/HttpException.php">
+    <entry file="file://$PROJECT_DIR$/src/demo/Controllers/HomeController.php">
       <provider selected="true" editor-type-id="text-editor">
-        <state relative-caret-position="177">
-          <caret line="18" column="6" lean-forward="false" selection-start-line="18" selection-start-column="6" selection-end-line="18" selection-end-column="6" />
+        <state relative-caret-position="195">
+          <caret line="13" column="23" lean-forward="false" selection-start-line="13" selection-start-column="23" selection-end-line="13" selection-end-column="23" />
+          <folding />
         </state>
       </provider>
     </entry>
-    <entry file="file://$PROJECT_DIR$/vendor/symfony/http-kernel/Exception/NotFoundHttpException.php">
+    <entry file="file://$PROJECT_DIR$/src/demo/Controllers/StreamController.php">
       <provider selected="true" editor-type-id="text-editor">
-        <state relative-caret-position="240">
-          <caret line="16" column="48" lean-forward="true" selection-start-line="16" selection-start-column="48" selection-end-line="16" selection-end-column="48" />
+        <state relative-caret-position="465">
+          <caret line="31" column="3" lean-forward="true" selection-start-line="31" selection-start-column="3" selection-end-line="31" selection-end-column="3" />
+          <folding />
         </state>
       </provider>
     </entry>
-    <entry file="file://$PROJECT_DIR$/vendor/symfony/http-kernel/Event/FilterResponseEvent.php">
+    <entry file="file://$PROJECT_DIR$/src/demo/Controllers/EscapeController.php">
       <provider selected="true" editor-type-id="text-editor">
-        <state relative-caret-position="328">
-          <caret line="44" column="0" lean-forward="false" selection-start-line="44" selection-start-column="0" selection-end-line="44" selection-end-column="0" />
+        <state relative-caret-position="255">
+          <caret line="17" column="41" lean-forward="false" selection-start-line="17" selection-start-column="41" selection-end-line="17" selection-end-column="41" />
+          <folding />
         </state>
       </provider>
     </entry>
-    <entry file="file://$PROJECT_DIR$/vendor/symfony/http-kernel/Event/KernelEvent.php">
+    <entry file="file://$PROJECT_DIR$/src/demo/Controllers/DelegatingController.php">
       <provider selected="true" editor-type-id="text-editor">
-        <state relative-caret-position="432">
-          <caret line="58" column="0" lean-forward="false" selection-start-line="58" selection-start-column="0" selection-end-line="58" selection-end-column="0" />
+        <state relative-caret-position="300">
+          <caret line="29" column="25" lean-forward="false" selection-start-line="29" selection-start-column="25" selection-end-line="29" selection-end-column="25" />
+          <folding />
         </state>
       </provider>
     </entry>
-    <entry file="file://$PROJECT_DIR$/vendor/silex/silex/src/Silex/EventListener/ConverterListener.php">
+    <entry file="file://$PROJECT_DIR$/src/demo/Controllers/BlogController.php">
       <provider selected="true" editor-type-id="text-editor">
-        <state relative-caret-position="195">
-          <caret line="52" column="53" lean-forward="false" selection-start-line="52" selection-start-column="53" selection-end-line="52" selection-end-column="53" />
+        <state relative-caret-position="311">
+          <caret line="49" column="4" lean-forward="false" selection-start-line="49" selection-start-column="4" selection-end-line="49" selection-end-column="4" />
+          <folding />
         </state>
       </provider>
     </entry>
-    <entry file="file://$PROJECT_DIR$/vendor/symfony/event-dispatcher/EventDispatcher.php">
+    <entry file="file://$PROJECT_DIR$/src/demo/Controllers/FeedbackController.php">
       <provider selected="true" editor-type-id="text-editor">
-        <state relative-caret-position="207">
-          <caret line="126" column="0" lean-forward="false" selection-start-line="126" selection-start-column="0" selection-end-line="126" selection-end-column="0" />
+        <state relative-caret-position="210">
+          <caret line="14" column="24" lean-forward="false" selection-start-line="14" selection-start-column="24" selection-end-line="14" selection-end-column="24" />
+          <folding />
         </state>
       </provider>
     </entry>
-    <entry file="file://$PROJECT_DIR$/vendor/pimple/pimple/src/Pimple/Container.php">
+    <entry file="file://$PROJECT_DIR$/src/demo/User.php">
       <provider selected="true" editor-type-id="text-editor">
-        <state relative-caret-position="462">
-          <caret line="118" column="0" lean-forward="false" selection-start-line="118" selection-start-column="0" selection-end-line="118" selection-end-column="0" />
+        <state relative-caret-position="300">
+          <caret line="20" column="0" lean-forward="true" selection-start-line="20" selection-start-column="0" selection-end-line="20" selection-end-column="0" />
           <folding />
         </state>
       </provider>
     </entry>
-    <entry file="file://$PROJECT_DIR$/vendor/silex/silex/src/Silex/Provider/HttpKernelServiceProvider.php">
+    <entry file="file://$PROJECT_DIR$/src/demo/UserConverter.php">
       <provider selected="true" editor-type-id="text-editor">
-        <state relative-caret-position="292">
-          <caret line="91" column="0" lean-forward="false" selection-start-line="91" selection-start-column="0" selection-end-line="91" selection-end-column="0" />
+        <state relative-caret-position="255">
+          <caret line="17" column="0" lean-forward="true" selection-start-line="17" selection-start-column="0" selection-end-line="17" selection-end-column="0" />
+          <folding />
         </state>
       </provider>
     </entry>
-    <entry file="file://$PROJECT_DIR$/vendor/silex/silex/src/Silex/CallbackResolver.php">
+    <entry file="file://$PROJECT_DIR$/src/demo/Error.php">
       <provider selected="true" editor-type-id="text-editor">
-        <state relative-caret-position="170">
-          <caret line="47" column="18" lean-forward="false" selection-start-line="47" selection-start-column="18" selection-end-line="47" selection-end-column="18" />
+        <state relative-caret-position="0">
+          <caret line="0" column="0" lean-forward="false" selection-start-line="0" selection-start-column="0" selection-end-line="0" selection-end-column="0" />
+          <folding />
         </state>
       </provider>
     </entry>
-    <entry file="file://$PROJECT_DIR$/vendor/silex/silex/src/Silex/ExceptionListenerWrapper.php">
+    <entry file="file://$PROJECT_DIR$/vendor/symfony/http-kernel/Exception/HttpException.php">
       <provider selected="true" editor-type-id="text-editor">
-        <state relative-caret-position="762">
-          <caret line="91" column="0" lean-forward="false" selection-start-line="91" selection-start-column="0" selection-end-line="91" selection-end-column="0" />
+        <state relative-caret-position="417">
+          <caret line="33" column="0" lean-forward="false" selection-start-line="33" selection-start-column="0" selection-end-line="33" selection-end-column="0" />
+          <folding />
         </state>
       </provider>
     </entry>
-    <entry file="file://$PROJECT_DIR$/vendor/silex/silex/doc/usage.rst">
+    <entry file="file://$PROJECT_DIR$/vendor/symfony/http-foundation/Response.php">
       <provider selected="true" editor-type-id="text-editor">
-        <state relative-caret-position="316">
-          <caret line="584" column="0" lean-forward="true" selection-start-line="584" selection-start-column="0" selection-end-line="584" selection-end-column="0" />
+        <state relative-caret-position="904">
+          <caret line="117" column="67" lean-forward="false" selection-start-line="117" selection-start-column="67" selection-end-line="117" selection-end-column="67" />
+          <folding />
         </state>
       </provider>
     </entry>
-    <entry file="file://$PROJECT_DIR$/README.md">
-      <provider selected="true" editor-type-id="split-provider[text-editor;markdown-preview-editor]">
-        <state split_layout="FIRST">
-          <first_editor relative-caret-position="195">
-            <caret line="13" column="0" lean-forward="true" selection-start-line="13" selection-start-column="0" selection-end-line="13" selection-end-column="0" />
-          </first_editor>
-          <second_editor />
+    <entry file="file://$PROJECT_DIR$/var/cache/twig/5e/5eba38db8e5b316b6d68bf2cd92b79dd587c1a0c53a5603d65d17a36b34b73ca.php">
+      <provider selected="true" editor-type-id="text-editor">
+        <state relative-caret-position="0">
+          <caret line="0" column="0" lean-forward="false" selection-start-line="0" selection-start-column="0" selection-end-line="0" selection-end-column="0" />
+          <folding />
         </state>
       </provider>
     </entry>
-    <entry file="file://$PROJECT_DIR$/composer.json">
+    <entry file="file://$PROJECT_DIR$/vendor/twig/twig/lib/Twig/Environment.php">
       <provider selected="true" editor-type-id="text-editor">
-        <state relative-caret-position="585">
-          <caret line="39" column="6" lean-forward="false" selection-start-line="39" selection-start-column="6" selection-end-line="39" selection-end-column="6" />
+        <state relative-caret-position="267">
+          <caret line="923" column="0" lean-forward="false" selection-start-line="923" selection-start-column="0" selection-end-line="923" selection-end-column="0" />
+          <folding />
         </state>
       </provider>
     </entry>
-    <entry file="jar://$APPLICATION_HOME_DIR$/plugins/php/lib/php.jar!/stubs/standard/standard_3.php">
+    <entry file="file://$PROJECT_DIR$/vendor/twig/twig/lib/Twig/Template.php">
       <provider selected="true" editor-type-id="text-editor">
-        <state relative-caret-position="177">
-          <caret line="40" column="9" lean-forward="false" selection-start-line="40" selection-start-column="9" selection-end-line="40" selection-end-column="9" />
+        <state relative-caret-position="470">
+          <caret line="388" column="0" lean-forward="false" selection-start-line="388" selection-start-column="0" selection-end-line="388" selection-end-column="0" />
           <folding />
         </state>
       </provider>
     </entry>
-    <entry file="file://$PROJECT_DIR$/vendor/symfony/http-kernel/HttpKernel.php">
+    <entry file="file://$PROJECT_DIR$/var/cache/twig/3f/3f5548c0e36ed4ed52490fc77c0032902278e740dd00859b18d5713434f25973.php">
       <provider selected="true" editor-type-id="text-editor">
-        <state relative-caret-position="462">
-          <caret line="174" column="0" lean-forward="false" selection-start-line="174" selection-start-column="0" selection-end-line="174" selection-end-column="0" />
+        <state relative-caret-position="200">
+          <caret line="50" column="0" lean-forward="false" selection-start-line="50" selection-start-column="0" selection-end-line="50" selection-end-column="0" />
+          <folding />
         </state>
       </provider>
     </entry>
-    <entry file="file://$PROJECT_DIR$/vendor/symfony/http-foundation/BinaryFileResponse.php">
+    <entry file="file://$PROJECT_DIR$/src/demo/Errors/GenericErrorHandler.php">
       <provider selected="true" editor-type-id="text-editor">
-        <state relative-caret-position="470">
-          <caret line="311" column="0" lean-forward="false" selection-start-line="311" selection-start-column="0" selection-end-line="311" selection-end-column="0" />
+        <state relative-caret-position="375">
+          <caret line="44" column="0" lean-forward="false" selection-start-line="44" selection-start-column="0" selection-end-line="44" selection-end-column="0" />
+          <folding />
         </state>
       </provider>
     </entry>
-    <entry file="file://$PROJECT_DIR$/vendor/symfony/http-foundation/Response.php">
+    <entry file="file://$PROJECT_DIR$/templates/errors/500.html.twig">
       <provider selected="true" editor-type-id="text-editor">
-        <state relative-caret-position="200">
-          <caret line="382" column="0" lean-forward="false" selection-start-line="382" selection-start-column="0" selection-end-line="382" selection-end-column="0" />
+        <state relative-caret-position="45">
+          <caret line="3" column="38" lean-forward="false" selection-start-line="3" selection-start-column="38" selection-end-line="3" selection-end-column="38" />
           <folding />
         </state>
       </provider>
     </entry>
-    <entry file="file://$PROJECT_DIR$/vendor/silex/silex/src/Silex/Provider/ValidatorServiceProvider.php">
+    <entry file="file://$PROJECT_DIR$/src/demo/Controllers/ErrorController.php">
       <provider selected="true" editor-type-id="text-editor">
-        <state relative-caret-position="0">
-          <caret line="0" column="0" lean-forward="false" selection-start-line="0" selection-start-column="0" selection-end-line="0" selection-end-column="0" />
+        <state relative-caret-position="210">
+          <caret line="14" column="0" lean-forward="false" selection-start-line="14" selection-start-column="0" selection-end-line="14" selection-end-column="0" />
+          <folding />
         </state>
       </provider>
     </entry>
-    <entry file="file://$PROJECT_DIR$/vendor/silex/silex/src/Silex/Provider/TwigServiceProvider.php">
+    <entry file="file://$PROJECT_DIR$/vendor/composer/ClassLoader.php">
       <provider selected="true" editor-type-id="text-editor">
-        <state relative-caret-position="0">
-          <caret line="0" column="0" lean-forward="false" selection-start-line="0" selection-start-column="0" selection-end-line="0" selection-end-column="0" />
+        <state relative-caret-position="222">
+          <caret line="323" column="0" lean-forward="false" selection-start-line="323" selection-start-column="0" selection-end-line="323" selection-end-column="0" />
+          <folding />
         </state>
       </provider>
     </entry>
-    <entry file="file://$PROJECT_DIR$/vendor/silex/silex/src/Silex/Application/TwigTrait.php">
+    <entry file="file://$PROJECT_DIR$/src/demo/Errors/HttpErrorHandler.php">
       <provider selected="true" editor-type-id="text-editor">
-        <state relative-caret-position="327">
-          <caret line="34" column="23" lean-forward="true" selection-start-line="34" selection-start-column="23" selection-end-line="34" selection-end-column="23" />
+        <state relative-caret-position="180">
+          <caret line="12" column="0" lean-forward="false" selection-start-line="12" selection-start-column="0" selection-end-line="12" selection-end-column="0" />
+          <folding />
         </state>
       </provider>
     </entry>
-    <entry file="file://$PROJECT_DIR$/vendor/silex/silex/src/Silex/Application/SecurityTrait.php">
+    <entry file="file://$PROJECT_DIR$/src/demo/Views.php">
       <provider selected="true" editor-type-id="text-editor">
-        <state relative-caret-position="781">
-          <caret line="50" column="33" lean-forward="true" selection-start-line="50" selection-start-column="33" selection-end-line="50" selection-end-column="33" />
+        <state relative-caret-position="0">
+          <caret line="0" column="0" lean-forward="false" selection-start-line="0" selection-start-column="0" selection-end-line="0" selection-end-column="0" />
+          <folding />
         </state>
       </provider>
     </entry>
-    <entry file="file://$PROJECT_DIR$/vendor/silex/silex/src/Silex/Route.php">
+    <entry file="file://$PROJECT_DIR$/vendor/pimple/pimple/src/Pimple/Container.php">
       <provider selected="true" editor-type-id="text-editor">
-        <state relative-caret-position="553">
-          <caret line="81" column="5" lean-forward="true" selection-start-line="81" selection-start-column="5" selection-end-line="81" selection-end-column="5" />
+        <state relative-caret-position="170">
+          <caret line="134" column="0" lean-forward="false" selection-start-line="134" selection-start-column="0" selection-end-line="134" selection-end-column="0" />
           <folding />
         </state>
       </provider>
     </entry>
-    <entry file="file://$PROJECT_DIR$/vendor/silex/silex/doc/providers/security.rst">
+    <entry file="file://$PROJECT_DIR$/vendor/silex/silex/src/Silex/ControllerResolver.php">
       <provider selected="true" editor-type-id="text-editor">
-        <state relative-caret-position="259">
-          <caret line="23" column="4" lean-forward="true" selection-start-line="23" selection-start-column="4" selection-end-line="23" selection-end-column="4" />
+        <state relative-caret-position="360">
+          <caret line="24" column="6" lean-forward="false" selection-start-line="24" selection-start-column="6" selection-end-line="24" selection-end-column="6" />
+          <folding />
         </state>
       </provider>
     </entry>
-    <entry file="file://$PROJECT_DIR$/vendor/silex/silex/src/Silex/Route/SecurityTrait.php">
+    <entry file="file://$PROJECT_DIR$/vendor/silex/silex/src/Silex/ExceptionListenerWrapper.php">
       <provider selected="true" editor-type-id="text-editor">
-        <state relative-caret-position="375">
-          <caret line="25" column="53" lean-forward="false" selection-start-line="25" selection-start-column="23" selection-end-line="25" selection-end-column="53" />
+        <state relative-caret-position="274">
+          <caret line="59" column="0" lean-forward="false" selection-start-line="59" selection-start-column="0" selection-end-line="59" selection-end-column="0" />
+          <folding />
         </state>
       </provider>
     </entry>
-    <entry file="file://$PROJECT_DIR$/src/app.php">
+    <entry file="file://$PROJECT_DIR$/vendor/symfony/http-kernel/HttpKernel.php">
       <provider selected="true" editor-type-id="text-editor">
-        <state relative-caret-position="405">
-          <caret line="27" column="0" lean-forward="true" selection-start-line="27" selection-start-column="0" selection-end-line="27" selection-end-column="0" />
+        <state relative-caret-position="177">
+          <caret line="69" column="0" lean-forward="false" selection-start-line="69" selection-start-column="0" selection-end-line="69" selection-end-column="0" />
           <folding />
         </state>
       </provider>
     </entry>
-    <entry file="file://$PROJECT_DIR$/src/demo/AppRoute.php">
+    <entry file="file://$PROJECT_DIR$/vendor/silex/silex/src/Silex/Application.php">
       <provider selected="true" editor-type-id="text-editor">
-        <state relative-caret-position="330">
-          <caret line="22" column="0" lean-forward="false" selection-start-line="22" selection-start-column="0" selection-end-line="22" selection-end-column="0" />
+        <state relative-caret-position="331">
+          <caret line="354" column="0" lean-forward="false" selection-start-line="354" selection-start-column="0" selection-end-line="354" selection-end-column="0" />
           <folding />
         </state>
       </provider>
     </entry>
-    <entry file="file://$PROJECT_DIR$/vendor/composer/ClassLoader.php">
+    <entry file="file://$PROJECT_DIR$/vendor/silex/silex/src/Silex/CallbackResolver.php">
       <provider selected="true" editor-type-id="text-editor">
-        <state relative-caret-position="222">
-          <caret line="323" column="0" lean-forward="false" selection-start-line="323" selection-start-column="0" selection-end-line="323" selection-end-column="0" />
+        <state relative-caret-position="575">
+          <caret line="61" column="17" lean-forward="true" selection-start-line="61" selection-start-column="17" selection-end-line="61" selection-end-column="17" />
           <folding />
         </state>
       </provider>
     </entry>
-    <entry file="file://$PROJECT_DIR$/vendor/silex/silex/src/Silex/Application.php">
+    <entry file="file://$PROJECT_DIR$/vendor/symfony/http-kernel/Event/KernelEvent.php">
       <provider selected="true" editor-type-id="text-editor">
         <state relative-caret-position="177">
-          <caret line="418" column="0" lean-forward="false" selection-start-line="418" selection-start-column="0" selection-end-line="418" selection-end-column="0" />
+          <caret line="41" column="7" lean-forward="true" selection-start-line="41" selection-start-column="7" selection-end-line="41" selection-end-column="7" />
           <folding />
         </state>
       </provider>
     </entry>
-    <entry file="file://$PROJECT_DIR$/src/demo/Controllers/FeedbackController.php">
+    <entry file="file://$PROJECT_DIR$/vendor/silex/silex/src/Silex/ViewListenerWrapper.php">
       <provider selected="true" editor-type-id="text-editor">
-        <state relative-caret-position="135">
-          <caret line="9" column="6" lean-forward="false" selection-start-line="9" selection-start-column="6" selection-end-line="9" selection-end-column="6" />
+        <state relative-caret-position="162">
+          <caret line="47" column="0" lean-forward="false" selection-start-line="47" selection-start-column="0" selection-end-line="47" selection-end-column="0" />
           <folding />
         </state>
       </provider>
     </entry>
-    <entry file="file://$PROJECT_DIR$/vendor/symfony/http-foundation/JsonResponse.php">
+    <entry file="file://$PROJECT_DIR$/web/index.php">
       <provider selected="true" editor-type-id="text-editor">
-        <state relative-caret-position="125">
-          <caret line="30" column="73" lean-forward="true" selection-start-line="30" selection-start-column="14" selection-end-line="30" selection-end-column="73" />
+        <state relative-caret-position="135">
+          <caret line="9" column="0" lean-forward="false" selection-start-line="9" selection-start-column="0" selection-end-line="9" selection-end-column="0" />
           <folding />
         </state>
       </provider>
     </entry>
     <entry file="file://$PROJECT_DIR$/src/controllers.php">
       <provider selected="true" editor-type-id="text-editor">
-        <state relative-caret-position="242">
-          <caret line="148" column="38" lean-forward="false" selection-start-line="148" selection-start-column="38" selection-end-line="148" selection-end-column="38" />
+        <state relative-caret-position="390">
+          <caret line="106" column="67" lean-forward="false" selection-start-line="106" selection-start-column="67" selection-end-line="106" selection-end-column="67" />
+          <folding>
+            <marker date="1512593654000" expanded="true" signature="3937:4095" ph="..." />
+            <marker date="1512593654000" expanded="true" signature="3939:4082" ph="//..." />
+          </folding>
+        </state>
+      </provider>
+    </entry>
+    <entry file="file://$PROJECT_DIR$/src/demo/Views/JsonView.php">
+      <provider selected="true" editor-type-id="text-editor">
+        <state relative-caret-position="240">
+          <caret line="16" column="20" lean-forward="true" selection-start-line="16" selection-start-column="20" selection-end-line="16" selection-end-column="20" />
           <folding />
         </state>
       </provider>

+ 53 - 134
src/controllers.php

@@ -1,14 +1,21 @@
 <?php
 
 use demo\Controllers\BlogController;
+use demo\Controllers\DelegatingController;
+use demo\Controllers\ErrorController;
+use demo\Controllers\EscapeController;
 use demo\Controllers\FeedbackController;
+use demo\Controllers\HomeController;
+use demo\Controllers\StreamController;
 use demo\Controllers\UserController;
+use demo\Errors\GenericErrorHandler;
+use demo\Errors\HttpErrorHandler;
+use demo\Views\JsonView;
 use Silex\Application;
 use Symfony\Component\HttpFoundation\JsonResponse;
 use Symfony\Component\HttpFoundation\Request;
 use Symfony\Component\HttpFoundation\Response;
 use Symfony\Component\HttpKernel\Exception\HttpException;
-use Symfony\Component\HttpKernel\HttpKernelInterface;
 
 //Request::setTrustedProxies(array('127.0.0.1'));
 
@@ -44,146 +51,58 @@ $beforeAllMiddleware = function (Request $request, Application $app) {
 $app->before($beforeAllMiddleware);
 $app->after($afterAllMiddleware);
 
-$app->get('/', function () use ($app) {
-  return $app['twig']->render('index.html.twig', []);
-})->bind('homepage');
-// Redirect via response header
-$app->get('/home', function ()  use ($app) {
-  return $app->redirect('/', Response::HTTP_TEMPORARY_REDIRECT); // Default 302.
-});
-// Forward to another controller to avoid redirection.
-$app->get('/blogz', function () use ($app) {
-  $subRequest = Request::create('/blogs', 'GET');
-  return $app->handle($subRequest, HttpKernelInterface::SUB_REQUEST);
-});
-$app->get('/all_blogs', function () use ($app) {
-  /** @var \Symfony\Component\Routing\Generator\UrlGeneratorInterface $generator */
-  $generator = $app['url_generator'];
-  $subRequest = Request::create($generator->generate('blog_list', 'GET'));
-  return $app->handle($subRequest, HttpKernelInterface::SUB_REQUEST);
-});
-
-$blogPosts = [
-  1 => [
-    'date' => '2011-03-29',
-    'author' => 'igorw',
-    'title' => 'Using Silex',
-    'body' => '...It takes time on version changes...',
-  ],
-  2 => [
-    'date' => '2015-03-29',
-    'author' => 'igorw',
-    'title' => 'Using Silex 2',
-    'body' => '...Especialy S1 to S2...',
-  ],
-];
-
-// Available automatic arguments on controllers: Application, Request.
-$app->get('/blogs', function () use ($blogPosts) {
-  $output = "<ul>\n";
-  foreach ($blogPosts as $post) {
-    $output .= "<li>" . $post ['title'] . "</li>\n";
-  }
-  $output .= "</ul>\n";
-  return $output;
-})->bind('blog_list');
-$app->get('/blogs-json', function () use ($app, $blogPosts) {
-  return $app->json($blogPosts);
-});
-$app->get('/blogs-json-view', function () use ($blogPosts) {
-  return $blogPosts; // Rely on the view handler.
-});
-
-// Default: http://blog, not http://blog/
-$app->get('/blog/{id}', BlogController::class . '::fifiAction')
+// Demo Twig.
+$app->get('/',                  HomeController::class       . '::home')
+  ->bind('homepage');
+
+// Demo redirects and forwards.
+$app->get('/home',              DelegatingController::class . '::redirectPath');
+$app->get('/blogz',             DelegatingController::class . '::forwardPath');
+$app->get('/all_blogs',         DelegatingController::class . '::forwardName');
+
+// Demo typical entity listing routes with their modifiers.
+$app->get('/blogs',             BlogController::class       . '::index')
+  ->bind('blog_list');
+$app->get('/blogs-json',        BlogController::class       . '::json');
+$app->get('/blogs-json-view',   BlogController::class       . '::jsonView');
+$app->get('/blog/{id}',         BlogController::class       . '::fifiAction')
   ->assert('id', '\d+')
   ->when("request.headers.get('User-Agent') matches '/firefox/i'");
-$app->get('/blog/{id}', function (Application $app, $id) use ($blogPosts) {
-  if (!isset ($blogPosts [$id])) {
-    // Will trigger the error() (or built-in) error handler.1
-    $app->abort(Response::HTTP_NOT_FOUND, "Post $id does not exist.");
-  }
-  $post = $blogPosts [$id];
-  return "<h1> {$post['title']}</h1>" . "<p> {$post['body']} </p>";
-})->assert('id', '\d+')
+$app->get('/blog/{id}',         BlogController::class       . '::show')
+  ->assert('id', '\d+')
   ->value('id', 1)
   ->bind('blog_post');
 
-$app->post('/feedback', FeedbackController::class . '::feedbackAction');
-
-$app->get('/hello/{name}', function ($name, Application $app) {
-  return $app->escape("Hello, $name");
-});
-$app->get('/hello-json/{name}', function ($name, Application $app) {
-  return $app->json(['name' => $name]);
-});
-
-$app->get('/noise', function (Application $app) {
-  $noise = base64_encode(random_bytes(2048));
-  $stream = fopen('php://memory', 'r+');
-  fwrite($stream, $noise);
-  rewind($stream);
-  $streamer = function () use($stream) {
-    while (!feof($stream)) {
-      echo fread($stream, 1024);
-      ob_flush();
-      flush();
-    }
-    fclose($stream);
-  };
-  return $app->stream($streamer, Response::HTTP_OK, ['Content-type' => 'text/plain']);
-});
-$app->get('/pass', function (Application $app) {
-  return $app->sendFile('/etc/passwd');
-});
-
-$app->get('/user/{user}', UserController::class . '::itemAction')
-  ->convert('user', 'converter.user:convert');
+// Demo POST request handling.
+$app->post('/feedback',         FeedbackController::class   . '::feedbackAction');
 
-// Register a view handler. They can also receive Request $request as 2nd arg,
-// e.g. for basic content negotiation.
-$app->view(function (array $controllerResult) use ($app) {
-  // Does limited escaping using JSON_HEX_TAG | JSON_HEX_APOS | JSON_HEX_AMP | JSON_HEX_QUOT.
-  // Try /hello-json/<script>alert('Yo');<script> : Chrome with JSON Decode
-  // extension throws JS error, which proves interpretation is triggered. This
-  // is actually due to the extension.
-  return $app->json($controllerResult);
-});
-// Handlers are examined in order, and called in a chain with the result of the
-// previous one. The last one must return a string or Response.
+// Demo escaping HTML and JSON
+$app->get('/hello/{name}',      EscapeController::class     . '::html');
+$app->get('/hello-json/{name}', EscapeController::class     . '::json');
 
-/* Error handlers receive exactly these arguments, in that order. */
-$app->error(function (HttpException $e, Request $request, $code) {
-  $response = new Response('HTTP Error caught: skipping generic error handler.',
-    // This status is ignored by Silex, which tries to ensure status code
-    // consistency with the exception.
-    Response::HTTP_NOT_FOUND,
-    // But we can force it with this fake header, which is removed before
-    // sending the response to the user agent.
-    ['X-Status-Code' => Response::HTTP_OK]);
-  return $response;
-});
-/* Custom error handlers registered with error() take precedence over the
-  built-in error handler provider by Silex, but the formatted error messages it
-  provides can be accessed in debug mode by returning based on $app['debug']
-  like this.
- */
-$app->error(function (\Exception $e, Request $request, $code) use ($app) {
-  // Use the default handler in debug mode.
-  if ($app['debug']) {
-    return;
-  }
+// Demo streaming.
+$app->get('/noise',             StreamController::class     . '::customStream');
+$app->get('/pass',              StreamController::class     . '::fileStream');
 
-  // Use our error formats otherwise.
+// Demo error handling.
+$app->get('err/http',           ErrorController::class      . '::errorHttp');
+$app->get('err/base',           ErrorController::class      . '::errorBase');
 
-  // 404.html, or 40x.html, or 4xx.html, or error.html
-  $templates = [
-    'errors/' . $code . '.html.twig',
-    'errors/' . substr($code, 0, 2) . 'x.html.twig',
-    'errors/' . substr($code, 0, 1) . 'xx.html.twig',
-    'errors/default.html.twig',
-  ];
+// Demo param converters.
+$app->get('/user/{user}',       UserController::class       . '::itemAction')
+  ->convert('user', 'converter.user:convert');
 
-  return new Response($app['twig']->resolveTemplate($templates)
-    ->render(['code' => $code]), $code);
-});
+// Register a view handler. They can also receive Request $request as 2nd arg,
+// e.g. for basic content negotiation. But the callback_resolver service:
+// - can not receive $app
+// - unlike the controller_resolver, can only use standard callables/services
+// - unlike the exception listener, can not use _invoke-able class names.
+// So one way to get the app is to use it as a global (!).
+$app->view([JsonView::class, 'handle']);
+
+// Handlers are examined in order, and called in a chain with the result of the
+// previous one. The last one must return a string or Response.
+$app->error([HttpErrorHandler::class, 'handle']);
+// Handlers do not receive $app, so they have to be closures or instantiated
+// here if they need it (or use the global $app like view handlers.
+$app->error(new GenericErrorHandler($app));

+ 54 - 0
src/demo/Controllers/BlogController.php

@@ -4,10 +4,64 @@ namespace demo\Controllers;
 
 
 use Silex\Application;
+use Symfony\Component\HttpFoundation\Response;
 
+/**
+ * Class BlogController demonstrates most basic controller types.
+ *
+ * Available automatic arguments on controllers: Application, Request.
+ *
+ * @package demo\Controllers
+ */
 class BlogController {
 
+  const POSTS = [
+    1 => [
+      'date' => '2011-03-29',
+      'author' => 'igorw',
+      'title' => 'Using Silex',
+      'body' => '...It takes time on version changes...',
+    ],
+    2 => [
+      'date' => '2015-03-29',
+      'author' => 'igorw',
+      'title' => 'Using Silex 2',
+      'body' => '...Especialy S1 to S2...',
+    ],
+  ];
+
+
+  // Default: http://blog, not http://blog/
   public function fifiAction(Application $app, $id) {
     return "<h1>Fifi action {$id} </h1>\n";
   }
+
+  public function index() {
+    $output = "<ul>\n";
+    foreach (static::POSTS as $post) {
+      $output .= "<li>" . $post ['title'] . "</li>\n";
+    }
+    $output .= "</ul>\n";
+    return $output;
+  }
+
+  // Default: http://blog, not http://blog/
+  public function show(Application $app, $id) {
+    if (!isset (static::POSTS[$id])) {
+      // Will trigger the error() (or built-in) error handler.1
+      $app->abort(Response::HTTP_NOT_FOUND, "Post $id does not exist.");
+    }
+    $post = static::POSTS[$id];
+    return "<h1> {$post['title']}</h1>" . "<p> {$post['body']} </p>";
+  }
+
+  // Encode response manually.
+  public function json(Application $app) {
+    return $app->json(static::POSTS);
+  }
+
+  // Rely on the view handler.
+  public function jsonView() {
+    return static::POSTS;
+  }
 }

+ 37 - 0
src/demo/Controllers/DelegatingController.php

@@ -0,0 +1,37 @@
+<?php
+
+namespace demo\Controllers;
+
+use Silex\Application;
+use Symfony\Component\HttpFoundation\Request;
+use Symfony\Component\HttpFoundation\Response;
+use Symfony\Component\HttpKernel\HttpKernelInterface;
+
+/**
+ * Class DelegatingController demonstrates delegation of response building.
+ *
+ * It shows redirection to a path, and forwarding to a subrequest using either
+ * a path or a named route.
+ *
+ * @package demo\Controllers
+ */
+class DelegatingController {
+  // Redirect via response header
+  public function redirectPath(Application $app) {
+    return $app->redirect('/', Response::HTTP_TEMPORARY_REDIRECT); // Default 302.
+  }
+
+  // Forward to another controller to avoid redirection, using a path.
+  public function forwardPath(Application $app) {
+    $subRequest = Request::create('/blogs', 'GET');
+    return $app->handle($subRequest, HttpKernelInterface::SUB_REQUEST);
+  }
+
+  public function forwardName(Application $app) {
+    /** @var \Symfony\Component\Routing\Generator\UrlGeneratorInterface $generator */
+    $generator = $app['url_generator'];
+    $subRequest = Request::create($generator->generate('blog_list', 'GET'));
+    return $app->handle($subRequest, HttpKernelInterface::SUB_REQUEST);
+  }
+
+}

+ 17 - 0
src/demo/Controllers/ErrorController.php

@@ -0,0 +1,17 @@
+<?php
+
+namespace demo\Controllers;
+
+use Silex\Application;
+use Symfony\Component\HttpFoundation\Response;
+
+class ErrorController {
+
+  public function errorBase(Application $app) {
+    throw new \InvalidArgumentException('This route is always in error.');
+  }
+
+  public function errorHttp(Application $app) {
+    $app->abort(Response::HTTP_TOO_MANY_REQUESTS);
+  }
+}

+ 21 - 0
src/demo/Controllers/EscapeController.php

@@ -0,0 +1,21 @@
+<?php
+
+namespace demo\Controllers;
+
+use Silex\Application;
+
+/**
+ * Class EscapeController demonstrates escaping for HTML and JSON.
+ *
+ * @package demo\Controllers
+ */
+class EscapeController {
+
+  public function html($name, Application $app) {
+    return $app->escape("Hello, $name");
+  }
+
+  public function json($name, Application $app) {
+    return $app->json(['name' => $name]);
+  }
+}

+ 18 - 0
src/demo/Controllers/HomeController.php

@@ -0,0 +1,18 @@
+<?php
+
+namespace demo\Controllers;
+
+use Silex\Application;
+
+/**
+ * Class HomeController demonstrates use of Twig
+ *
+ * @package demo\Controllers
+ */
+class HomeController {
+
+  public function home(Application $app) {
+   return $app['twig']->render('index.html.twig', []);
+  }
+
+}

+ 33 - 0
src/demo/Controllers/StreamController.php

@@ -0,0 +1,33 @@
+<?php
+
+namespace demo\Controllers;
+
+use Silex\Application;
+use Symfony\Component\HttpFoundation\Response;
+
+/**
+ * Class StreamController demos streaming of static files and custom content.
+ *
+ * @package demo\Controllers
+ */
+class StreamController {
+  public function customStream(Application $app) {
+    $noise = base64_encode(random_bytes(2048));
+    $stream = fopen('php://memory', 'r+');
+    fwrite($stream, $noise);
+    rewind($stream);
+    $streamer = function () use($stream) {
+      while (!feof($stream)) {
+        echo fread($stream, 1024);
+        ob_flush();
+        flush();
+      }
+      fclose($stream);
+    };
+    return $app->stream($streamer, Response::HTTP_OK, ['Content-type' => 'text/plain']);
+  }
+
+  public function fileStream(Application $app) {
+    return $app->sendFile('/etc/passwd');
+  }
+}

+ 47 - 0
src/demo/Errors/GenericErrorHandler.php

@@ -0,0 +1,47 @@
+<?php
+
+namespace demo\Errors;
+
+use Silex\Application;
+use Symfony\Component\HttpFoundation\Request;
+use Symfony\Component\HttpFoundation\Response;
+
+class GenericErrorHandler {
+
+  /**
+   * @var \Silex\Application
+   */
+  protected $app;
+
+  public function __construct(Application $app) {
+    $this->app = $app;
+  }
+
+  /* Custom error handlers registered with error() take precedence over the
+    built-in error handler provider by Silex, but the formatted error messages it
+    provides can be accessed in debug mode by returning based on $app['debug']
+    like this.
+   */
+  public function __invoke(\Exception $e, Request $request, $code) {
+  // Use the default handler in debug mode.
+    if ($this->app['debug']) {
+      return;
+    }
+
+    // Use our error formats otherwise.
+
+    // 404.html, or 40x.html, or 4xx.html, or error.html
+    $templates = [
+      'errors/' . $code . '.html.twig',
+      'errors/' . substr($code, 0, 2) . 'x.html.twig',
+      'errors/' . substr($code, 0, 1) . 'xx.html.twig',
+      'errors/default.html.twig',
+    ];
+
+    /** @var \Twig_Environment $twig */
+    $twig = $this->app['twig'];
+    /** @var \Twig_Template $template */
+    $template = $twig->resolveTemplate($templates);
+    return new Response($template->render(['code' => $code . ' : ' . $e->getMessage()]));
+  }
+}

+ 22 - 0
src/demo/Errors/HttpErrorHandler.php

@@ -0,0 +1,22 @@
+<?php
+
+namespace demo\Errors;
+
+
+use Symfony\Component\HttpFoundation\Request;
+use Symfony\Component\HttpFoundation\Response;
+use Symfony\Component\HttpKernel\Exception\HttpException;
+
+class HttpErrorHandler {
+  // Error handlers receive exactly these arguments, in that order.
+  public static function handle(HttpException $e, Request $request, $code) {
+    $response = new Response("HTTP Error $code caught: skipping generic error handler.",
+      // This status is ignored by Silex, which tries to ensure status code
+      // consistency with the exception.
+      Response::HTTP_NOT_FOUND,
+      // But we can force it with this fake header, which is removed before
+      // sending the response to the user agent.
+      ['X-Status-Code' => Response::HTTP_OK]);
+    return $response;
+  }
+}

+ 22 - 0
src/demo/Views/JsonView.php

@@ -0,0 +1,22 @@
+<?php
+
+namespace demo\Views;
+
+use Silex\Application;
+use Symfony\Component\HttpFoundation\Request;
+
+/**
+ * Class JsonView is a JSON view handler.
+ *
+ * @package demo\Views
+ */
+class JsonView {
+
+  public function handle(array $controllerResult, Request $request) {
+    // Does limited escaping using JSON_HEX_TAG | JSON_HEX_APOS | JSON_HEX_AMP | JSON_HEX_QUOT.
+    // Try /hello-json/<script>alert('Yo');<script> : Chrome with JSON Decode
+    // extension throws JS error, which proves interpretation is triggered. This
+    // is actually due to the extension.
+    return $GLOBALS['app']->json($controllerResult);
+  }
+}

+ 1 - 1
templates/errors/500.html.twig

@@ -1,5 +1,5 @@
 {% extends "layout.html.twig" %}
 
 {% block content %}
-    Internal server error.
+    Internal server error ({{ code }})
 {% endblock %}