Browse Source

Fixed methods and got to a basic working version

Herton 4 years ago
parent
commit
32cffea3aa
7 changed files with 205 additions and 19 deletions
  1. 1 1
      Application.php
  2. 78 0
      Controllers/CategoriesPostsController.php
  3. 45 4
      Controllers/Controller.php
  4. 3 0
      Resource.php
  5. 72 6
      Route.php
  6. 2 4
      handle.php
  7. 4 4
      routes.php

+ 1 - 1
Application.php

@@ -60,7 +60,7 @@ class Application
     public static function getInstance()
     {
         if (self::$instance == null) {
-            self::$instance = new Application(dirname(__DIR__));
+            self::$instance = new Application(__DIR__);
         }
 
         return self::$instance;

+ 78 - 0
Controllers/CategoriesPostsController.php

@@ -2,6 +2,84 @@
 
 namespace Goodquestiondev\Controllers;
 
+use Symfony\Component\HttpFoundation\Request;
+
 class CategoriesPostsController extends Controller
 {
+    /**
+     * Display the articles index.
+     */
+    public function index()
+    {
+        echo 'Index!';
+    }
+
+    /**
+     * Show the form for creating a new resource.
+     */
+    public function create()
+    {
+        var_dump(__FUNCTION__);
+    }
+
+    /**
+     * Store a resource
+     *
+     * @param  Request  $request
+     */
+    public function store(Request $request)
+    {
+        var_dump(__FUNCTION__, $request);
+    }
+
+    /**
+     * Display the specified resource
+     *
+     * @param  array $params
+     */
+    public function show($params)
+    {
+        var_dump(__FUNCTION__, $params);
+    }
+
+    /**
+    * Show the form for editing the specified article.
+    *
+    * @param  array $params
+    */
+    public function edit($params)
+    {
+        var_dump(__FUNCTION__, $params);
+    }
+
+    /**
+     * Update a newly created resource
+     *
+     * @param  Request $request
+     * @param  string  $params
+     */
+    public function update(Request $request, array $params)
+    {
+        var_dump(__FUNCTION__, $request, $params);
+    }
+
+    /**
+     * Delete the specified resource
+     *
+     * @param  array $params
+     */
+    public function destroy($params)
+    {
+        var_dump(__FUNCTION__, $params);
+    }
+
+    /**
+     * Handle bad method
+     *
+     * @param  Request $request
+     */
+    public function error($request)
+    {
+        throw new \Exception('Bad request');
+    }
 }

+ 45 - 4
Controllers/Controller.php

@@ -1,6 +1,6 @@
 <?php
 
-namespace Goodquestiondev\SimpleRouterResource;
+namespace Goodquestiondev\Controllers;
 
 use Symfony\Component\HttpFoundation\Request;
 
@@ -23,7 +23,7 @@ class Controller
     }
 
     /**
-     * Store a newly created resource
+     * Store a resource
      *
      * @param  Request  $request
      */
@@ -35,10 +35,51 @@ class Controller
     /**
      * Display the specified resource
      *
-     * @param  array $resource
+     * @param  array $params
      */
-    public function show(array $resource)
+    public function show($params)
     {
         throw new \Exception('Undefined method '. __FUNCTION__);
     }
+
+    /**
+    * Show the form for editing the specified article.
+    *
+    * @param  array $params
+    */
+    public function edit($params)
+    {
+        throw new \Exception('Undefined method '. __FUNCTION__);
+    }
+
+    /**
+     * Update a newly created resource
+     *
+     * @param  Request $request
+     * @param  string  $params
+     */
+    public function update(Request $request, array $params)
+    {
+        throw new \Exception('Undefined method '. __FUNCTION__);
+    }
+
+    /**
+     * Delete the specified resource
+     *
+     * @param  array $params
+     */
+    public function destroy($params)
+    {
+        throw new \Exception('Bad request');
+    }
+
+    /**
+     * Handle bad method
+     *
+     * @param  Request $request
+     */
+    public function error($request)
+    {
+        throw new \Exception('Bad request');
+    }
 }

+ 3 - 0
Resource.php

@@ -58,6 +58,7 @@ class Resource
             $this->uriList[] = "{$parts[0]}";
             $this->uriList[] = "{$parts[0]}/{{$singularOne}}/{$parts[1]}";
             $this->uriList[] = "{$parts[0]}/{{$singularOne}}/{$parts[1]}/create";
+            $this->uriList[] = "{$parts[0]}/{{$singularOne}}/{$parts[1]}/{{$singularTwo}}"; //For demostration
             $this->uriList[] = "{$parts[1]}/{{$singularTwo}}";
             $this->uriList[] = "{$parts[1]}/{{$singularTwo}}/edit";
         }
@@ -72,7 +73,9 @@ class Resource
      */
     public function handleRequest($verb, $path, $uriInfo, $content)
     {
+        var_dump($this->uri);
         $route = Route::getInstance();
         $route->resources[$this->uri];
+        var_dump($route);
     }
 }

+ 72 - 6
Route.php

@@ -4,6 +4,8 @@ namespace Goodquestiondev;
 
 use Illuminate\Support\Str;
 use Goodquestiondev\Resource;
+use Goodquestiondev\Controllers\Controller;
+use Symfony\Component\HttpFoundation\Request;
 
 class Route
 {
@@ -86,19 +88,17 @@ class Route
     /**
      * Redirects the user to the correct controller and method based on the path
      *
-     * @param string $verb The request verb
-     * @param string $path The path string
-     * @param string $content The request data content
+     * @param Request $request The request data content
      *
      * @return Resource
      */
-    public static function getResource(string $verb, string $path, string $content)
+    public static function getResource($request)
     {
         $route = self::getInstance();
-        $uriInfo = $route->getUriInfo($path);
+        $uriInfo = $route->getUriInfo($request->getPathInfo());
         foreach ($route->resources as $resource) {
             if (in_array($uriInfo['uri'], $resource->uriList)) {
-                $resource->handleRequest($verb, $path, $uriInfo, $content);
+                $route->callController($resource, $request, $uriInfo);
             }
         };
     }
@@ -152,4 +152,70 @@ class Route
             'params' => $params
         ];
     }
+
+    /**
+     * Find controller and instantiate it
+     *
+     * @param Resource $resource The Resource verb
+     * @param Request $request The request
+     * @param array $uriInfo The url info
+     *
+     * @return void
+     */
+    public function callController(Resource $resource, Request $request, array $uriInfo)
+    {
+        $app = Application::getInstance();
+        try {
+            $controllerClassName = $app->controllerUris[$resource->uri];
+            $controllerName = "Goodquestiondev\\Controllers\\{$controllerClassName}";
+            $controller = new $controllerName;
+        } catch (\Exception $e) {
+            throw new \Exception('Error getting Controller');
+        }
+        $this->callAction($controller, $resource, $request, $uriInfo);
+    }
+
+    /**
+     * Call the Controller method
+     *
+     * @param Controller $controller The controller
+     * @param Resource $resource The Resource verb
+     * @param Request $request The request
+     *
+     * @return void
+     */
+    public function callAction(Controller $controller, Resource $resource, Request $request, array $uriInfo)
+    {
+        $path = $request->getPathInfo();
+        switch ($request->getMethod()) {
+            case 'GET':
+                if (Str::contains($path, 'create')) {
+                    $controller->create();
+                    break;
+                }
+                if (Str::contains($path, 'edit')) {
+                    $controller->edit($uriInfo['params']);
+                    break;
+                }
+                if (Str::contains($uriInfo['uri'], '{')) {
+                    $controller->show($uriInfo['params']);
+                    break;
+                }
+                $controller->index();
+
+                break;
+            case 'POST':
+                $controller->store($request);
+                break;
+            case 'PUT':
+            case 'PATCH':
+                $controller->update($request, $uriInfo['params']);
+                break;
+            case 'DELETE':
+                $controller->destroy($uriInfo['params']);
+                break;
+            default:
+                $controller->error($request);
+        }
+    }
 }

+ 2 - 4
handle.php

@@ -1,10 +1,8 @@
 <?php
 
 use Symfony\Component\HttpFoundation\Request;
-use Goodquestiondev\SimpleRouterResource\SimpleRoute;
+use Goodquestiondev\Route;
 
 $request = Request::createFromGlobals();
 
-var_dump($request->getMethod(), $request->getContent(), $request->getPathInfo());
-
-var_dump(SimpleRoute::getHandler($request));
+Route::getResource($request);

+ 4 - 4
routes.php

@@ -1,6 +1,6 @@
 <?php
 
-use Goodquestiondev\SimpleRouterResource\SimpleRoute as Route;
+use Goodquestiondev\Route as Route;
 
 /*
 |--------------------------------------------------------------------------
@@ -14,6 +14,6 @@ use Goodquestiondev\SimpleRouterResource\SimpleRoute as Route;
 Route::resource('posts');
 Route::resource('users.posts');
 Route::resource('categories.posts');
-Route::get('/', function () {
-    return 'Hello';
-});
+// Route::get('/', function () {
+//     return 'Hello';
+// });