src/ForeverPHP/Routing/Router.php
public function add(string $route, string $view, $middlewares = null)
    {
        $app = null;        // Aplicacion donde esta la vista
        $v = null;          // Vista a buscar
        $method = 'run';  // Metodo por defecto a ejecutar

        // Se valida si es una vista a ejecutar o una funcion anonima
        if (is_string($view)) {
            if (!strpos($view, '@')) {
                throw new RouterException("Revise la ruta ($route) al parecer la ruta a la vista no esta correctamente escrita.");
            }

            // Dividir la vista en app, vista y funcion si es que esta definida
            $view = explode('@', $view);
            $app = $view[0];
            $v = $view[1];

            // Valida si la vista trae un metodo a ejecutar
            if (count($view) == 3) {
                $method = $view[2];
            }
        } elseif (is_array($view)) {
            /*
             * Definicion de una vista con matriz.
             *
             * $view = array(
             *     'name' => 'nombre_vista',
             *     'app.vista' o 'view' => 'app.view.function' o function() {}
             * );
             */

            // Si el numero de items de la matriz es menor a dos no es valido
            if (count($view) < 2) {
                throw new RouterException('Definición de vista invalida.');
            }

            if (!array_key_exists('name', $view)) {
                throw new RouterException("No existe el atributo 'name' de la vista en la matriz.");
            }

            /*
             * Almacena temporalmente el nombre de la ruta para que al volver a
             * llamar a add se agregue el nombre a la ruta.
             */
            $this->nameForRoute = $view['name'];

            // Vuelve a llamar a add para agregar la ruta
            return $this->add($route, $view[0], $middlewares);
        } else {
            $method = $view;
        }

        // Se valida si la ruta trae parametros por ruta
        $paramsUrl = array();
        $route = $this->parseRoute($route, $paramsUrl);

        // Matriz con el contenido de la ruta
        $routeContent = array(
            'app' => $app,
            'view' => $v,
            'method' => $method,
            'paramsUrl' => $paramsUrl,
            'name' => $this->nameForRoute,
            'middlewares' => $middlewares
        );

        // Valida si es ruta normal o compleja
        if (count($paramsUrl) == 0) {
            $this->routes[$route] = $routeContent;
        } else {
            $this->complexRoutes[$route] = $routeContent;
        }
    }
public function add(string $route, string $view, $middlewares = null)
    {
        $app = null;        // Aplicacion donde esta la vista
        $v = null;          // Vista a buscar
        $method = 'run';  // Metodo por defecto a ejecutar

        // Se valida si es una vista a ejecutar o una funcion anonima
        if (is_string($view)) {
            if (!strpos($view, '@')) {
                throw new RouterException("Revise la ruta ($route) al parecer la ruta a la vista no esta correctamente escrita.");
            }

            // Dividir la vista en app, vista y funcion si es que esta definida
            $view = explode('@', $view);
            $app = $view[0];
            $v = $view[1];

            // Valida si la vista trae un metodo a ejecutar
            if (count($view) == 3) {
                $method = $view[2];
            }
        } elseif (is_array($view)) {
            /*
             * Definicion de una vista con matriz.
             *
             * $view = array(
             *     'name' => 'nombre_vista',
             *     'app.vista' o 'view' => 'app.view.function' o function() {}
             * );
             */

            // Si el numero de items de la matriz es menor a dos no es valido
            if (count($view) < 2) {
                throw new RouterException('Definición de vista invalida.');
            }

            if (!array_key_exists('name', $view)) {
                throw new RouterException("No existe el atributo 'name' de la vista en la matriz.");
            }

            /*
             * Almacena temporalmente el nombre de la ruta para que al volver a
             * llamar a add se agregue el nombre a la ruta.
             */
            $this->nameForRoute = $view['name'];

            // Vuelve a llamar a add para agregar la ruta
            return $this->add($route, $view[0], $middlewares);
        } else {
            $method = $view;
        }

        // Se valida si la ruta trae parametros por ruta
        $paramsUrl = array();
        $route = $this->parseRoute($route, $paramsUrl);

        // Matriz con el contenido de la ruta
        $routeContent = array(
            'app' => $app,
            'view' => $v,
            'method' => $method,
            'paramsUrl' => $paramsUrl,
            'name' => $this->nameForRoute,
            'middlewares' => $middlewares
        );

        // Valida si es ruta normal o compleja
        if (count($paramsUrl) == 0) {
            $this->routes[$route] = $routeContent;
        } else {
            $this->complexRoutes[$route] = $routeContent;
        }
    }
/*
ESTA FUNCION QUEDARA OBSOLETA SIENDO REEMPLAZADA POR get, post, ENTRE OTRAS, ESTA FUNCIONA AUN NO SE ELIMINARA
POR TEMAS DE COMPATIBILIDAD PERO SE MODIFICARA, Y ESTA SEGUN EL METODO DE LLAMADA DE LA RUTA LLAMARA A LA FUNCION
get, post, etc SEGUN SEA NECESARIO