El verdadero rico no es el que tiene mucho dinero sino el que tiene tiempo para estar con la gente que quiere y hacer lo que le gusta.

Rutas y controladores en CakePHP 3

Rutas y controladores en CakePHP 3

Publicado el 21 marzo, 2016 por | Categoría:

Las rutas en CakePHP 3 son un punto de entrada del usuario a nuestra aplicación y a la vez este punto de entrada va representar una petición a dicha aplicación. Cada una de estas rutas apuntará a un controlador para que este posteriormente interactué con cada una de las acciones (métodos) que lo contiene y finalmente se generará una respuesta enviada al usuario ya sea en formato HTML mediante las vistas o puede ser también en formato JSON.

Durante esta lección vamos a conocer los fundamentos necesarios para ir creando nuestras propias rutas, si recuerdas en la segunda lección hemos hablado de la estructura de directorios de CakePHP 3 en el que mencionamos un archivo dentro del directorio config denominado routes.php, es en este archivo en el que vamos a ir componiendo cada una de nuestras rutas que va formar parte de nuestra aplicación. Dentro de las amplias características y opciones que nos trae las rutas cabe resaltar que podemos crear 2 tipos de rutas:

1. Mediante un método estático:

2. Mediante un scope que agrupa varias rutas:

Si te fijas ambas formas de crear rutas tienen algo en común: Estas van a apuntar a un controlador y ejecutar una acción en concreto. Un controlador va representar la capa de la lógica del negocio, es decir, que cada una de las acciones (métodos) que lo componga va tener su propia lógica o funcionalidad de acuerdo a los requerimientos de la aplicación, por ejemplo si nos referimos al controlador UsersController y la acción index() este va manejar toda la lógica para recuperar una lista de todos los usuarios registrados en nuestra aplicación.

Sin más te dejo con el nuevo video donde te hablo de todo lo mencionado anteriormente y otras características más puestas a la práctica:

Ahora dime tu, qué te pareció el manejo y la creación de rutas en CakePHP 3? si viste toda lección a detalle te habrás dado cuenta que al final te muestro una grandiosa característica del framework que es el enrutamiento por defecto que nos trae en base a un controlador y su respectiva acción, desde luego este debe seguir cada una de las convenciones de CakePHP para su correcto funcionamiento. Quisiera por favor que me cuentes acá abajo en la caja de comentarios como te fue a ti en esta lección, de verdad que me interesa mucho saberlo, por otra parte y ya para finalizar quisiera pedirte por favor que compartas esta lección en tus redes sociales, de esa manera mi trabajo llega a mas personas interesadas en aprender de este maravilloso framework 8-)

Sigue todas las lecciones del curso AQUÍ.

Saludos!!!

firma emm

 


Repositorio oficial

Por favor comparte esta lección:

¿Te gustó el artículo? ¡Suscríbete ahora mismo!

Recibe mis últimos artículos, recursos, tutoriales y mucho más.

,

Comentarios

  • Jose

    Muchas gracias, por el curso de CakePHP 3, pense que ya no ibas a publicar mas de Cake.

    El video esta muy bien explicado, el manejo de las rutas no es complejo, pero que pasaria si tuviera si mi archivo de rutas lo lleno de esta manera:

    Router::scope(‘/users’, function ($routes) {

    $routes->connect(‘/index’, [‘controller’ => ‘Users’, ‘action’ => ‘index1’]);
    $routes->connect(‘/index’, [‘controller’ => ‘Users’, ‘action’ => ‘index2’]);
    $routes->connect(‘/index’, [‘controller’ => ‘Users’, ‘action’ => ‘index3’]);
    $routes->connect(‘/index’, [‘controller’ => ‘Users’, ‘action’ => ‘index4’]);
    $routes->connect(‘/index’, [‘controller’ => ‘Users’, ‘action’ => ‘index5’]);
    $routes->connect(‘/index’, [‘controller’ => ‘Users’, ‘action’ => ‘index6’]);
    $routes->connect(‘/index’, [‘controller’ => ‘Users’, ‘action’ => ‘index7’]);
    $routes->connect(‘/index’, [‘controller’ => ‘Users’, ‘action’ => ‘index8’]);
    $routes->connect(‘/index’, [‘controller’ => ‘Users’, ‘action’ => ‘index9’]);


    $routes->connect(‘/index’, [‘controller’ => ‘Users’, ‘action’ => ‘indexn’]);
    });

    Si mi archivo lo lleno de muchas llamadas aunque esten agrupadas segun el controlador destino, seria muy incomodo manejar todo esto, no seria mejor crear otro archivo routes por cada nombre de controlador, en vez de tener todo centralizado en un solo archivo.

    Por ejemplo:
    Routers -> Users
    Routers -> Clientes
    Routers -> Producto

    De esta manera se pondria algo de orden

    • Edson

      Hola Jose, la finalidad de la lección era explicar las rutas desde lo más fundamental, hay personas que de apoco se andan sumergiendo en el Framework pero tu observación es válida. Un saludo!!!

  • Benty Olarte

    Muchas gracias, buen curso pero no me esta sirviendo lo de las rutas.

    Router::connect(‘/users/index’, [‘controller’ => ‘Users’, ‘action’ => ‘index’]);

    Router::scope(‘/users’, function ($routes) {

    $routes->connect(‘/index’, [‘controller’ => ‘Users’, ‘action’ => ‘index’]);

    });

    He probado ambas y no me sirve, me tira la misma pagina de bienvenida de Cake y tengo creado el UsersController igual a como vos lo hiciste.

    • Edson

      Hola Benty, por favor revisa el repositorio del proyecto que comparto al final de la lección, quizá solo es un detalle que se te está yendo, de todas formas avísame cómo te fue. Saludos!!!

  • jorge e

    hola edson , estoy siguiendo el curso de manera local con wamp ,hago todo tal cual lo haces , y al cololar la direccion en el explorador con el local host me dice que no fue encontrado aqui esta la linea de comando que coloque en routes
    Router::connect(‘/users/index’, [‘controller’ => ‘Users’, ‘action’ => ‘index’]);

    y lo que utilize en Userscontroller.php
    public function index(){
    echo “Listado de usuarios”;
    exit();
    }
    y lo que me dice

    Not Found

    The requested URL /pocake/users/index was not found on this server.

    Apache/2.4.9 (Win64) PHP/5.5.12 Server at localhost Port 80

    • Edson

      Hola Jorge, puedes colocar directamente dentro del método scope() en $routes->connect() . Saludos.

      • jorge e

        Amigo gracias por tomar su tiempo para responderme , ya lo coloque asi y me sigue dando el mismo error que no se consigue , le voy a colocar aqui abajo como lo puse para vea si es que estoy declarando mal:
        ?php
        /**
        * Routes configuration
        *
        * In this file, you set up routes to your controllers and their actions.
        * Routes are very important mechanism that allows you to freely connect
        * different URLs to chosen controllers and their actions (functions).
        *
        * CakePHP(tm) : Rapid Development Framework (http://cakephp.org)
        * Copyright (c) Cake Software Foundation, Inc. (http://cakefoundation.org)
        *
        * Licensed under The MIT License
        * For full copyright and license information, please see the LICENSE.txt
        * Redistributions of files must retain the above copyright notice.
        *
        * @copyright Copyright (c) Cake Software Foundation, Inc. (http://cakefoundation.org)
        * @link http://cakephp.org CakePHP(tm) Project
        * @license http://www.opensource.org/licenses/mit-license.php MIT License
        */

        use CakeCorePlugin;
        use CakeRoutingRouteBuilder;
        use CakeRoutingRouter;

        /**
        * The default class to use for all routes
        *
        * The following route classes are supplied with CakePHP and are appropriate
        * to set as the default:
        *
        * – Route
        * – InflectedRoute
        * – DashedRoute
        *
        * If no call is made to Router::defaultRouteClass(), the class used is
        * Route (CakeRoutingRouteRoute)
        *
        * Note that Route does not do any inflections on URLs which will result in
        * inconsistently cased URLs when used with :plugin, :controller and
        * :action markers.
        *
        */
        Router::defaultRouteClass(‘DashedRoute’);

        Router::scope(‘/’, function (RouteBuilder $routes) {
        /**
        * Here, we are connecting ‘/’ (base path) to a controller called ‘Pages’,
        * its action called ‘display’, and we pass a param to select the view file
        * to use (in this case, src/Template/Pages/home.ctp)…
        */
        $routes->connect(‘/’, [‘controller’ => ‘Pages’, ‘action’ => ‘display’, ‘home’]);

        /**
        * …and connect the rest of ‘Pages’ controller’s URLs.
        */
        $routes->connect(‘/users/index’, [‘controller’ => ‘Users’, ‘action’ => ‘index’]);

        /**
        * Connect catchall routes for all controllers.
        *
        * Using the argument DashedRoute, the fallbacks method is a shortcut for
        * $routes->connect('/:controller', ['action' => 'index'], ['routeClass' => 'DashedRoute']);
        * $routes->connect('/:controller/:action/*', [], ['routeClass' => 'DashedRoute']);
        *
        * Any route class can be used with this method, such as:
        * – DashedRoute
        * – InflectedRoute
        * – Route
        * – Or your own route class
        *
        * You can remove these routes once you’ve connected the
        * routes you want in your application.
        */
        $routes->fallbacks(‘DashedRoute’);

        });

        /**
        * Load all plugin routes. See the Plugin documentation on
        * how to customize the loading of plugin routes.
        */
        Plugin::routes();

        • Edson

          Wow se me hace difícil ver código por este medio por obvias razones pero intenta esto:
          Router::scope(‘/users’, function ($routes) {
          $routes->connect(‘/’, [‘controller’ => ‘Users’, ‘action’ => ‘index’]);
          $routes->fallbacks(‘DashedRoute’);
          });

          • jorge e

            Sr. edson gracias por su respuesta pero hago lo que me dice e igual me dice que no lo encuentara

          • Edson

            Hola nuevamente Jorge, lo siento pero no puedo hacer mas ya que esa es la manera de poder crear tus rutas, lo que te pido es que revises el repositorio bien, incluso puedes clonarlo y probarlo para que te convenzas tu mismo de que funciona. Puede ser solo un detalle que se te esta yendo. Saludos.

          • jorge e

            edson hay algun comando para borrar el Userscontroller o lo hago manualmente? es para comenzar a hacer el video otra vez desde cero para intentar nuevamente

          • Edson

            Hola Jorge, puedes eliminarlo manualmente, al final es solo un archivo php 8-) o también puedes crear el mismo controlador desde la línea de comandos con: bin/cake bake controller Users y si existe un controlador similar te preguntará si lo quieres sobre escribir. Saludos.

          • jorge e

            amigo muchisimas gracias sus videos son muy buenos explica bien pero bueno creo que no seguire ya que no puedo crear las rutas sin error , ya cree otro controlador e intente y me sigue igual que no encuentre
            una pregunta mas amigo edson si yo accedo desde mi explorador al archivo routes.php mediante la ruta http://localhost/pocake/config/routes.php
            me da un error que no me parece que sea normal pero usted sabe mas que yo de eso me dice que no encuentra la clase router y literalmente este es el error que me marca: Fatal error: Class ‘CakeRoutingRouter’ not found in C:wampwwwpocakeconfigroutes.php on line 43
            y lo que esta en la linea 43 es esta sentecia:
            Router::defaultRouteClass(‘DashedRoute’);
            si es significante por fa hagamelo saber y si me puede decir como arreglarlo se lo agradezco

          • Edson

            Hola Jorge, no puedes acceder a esa ruta porque no es parte de tu directorio publico (webroot) querer dar permiso a ese tipo de archivos es como abrir la puerta con alfombra roja a un atacante, la parte de estructura de directorios lo expliqué en las primeras lecciones, allí hablo del directorio público de la aplicación, te invito a revisarlo. Saludos.

  • Antonio

    Tengo el mismo problema que jorge y benty, hay alguna solución? saludos

  • Omar Galaviz

    Hola Adson, te queria consultar, si mi scope son tres acciones dentro de un controlador especifico y sencillamente si pongo una accion que no exista, me enruta a una accion en especifica de las existente, es decir que no quiero que aparezcan errores de acciones inexistentes sino que enruta a una en particular cuando vea que no existe tal accion

    que me sugieres que pueda prograr en routes.php

  • Francisco Bombella

    A los que les da el error “404 Not found” es importante que en sus servidores (si es apache, en el archivo httpd.conf) tengan activado:

    AllowOverride All

    Esa instrucción debe estar dentro de la configuración del donde están trabajando. (Por defecto, Apache trae “AllowOverride None”, lo que evita que Cake reescriba las direcciones)

    Además, deben tener el modulo de reescritura cargado en el mismo httpd.conf:

    LoadModule rewrite_module modules/mod_rewrite.so

    Revisen que esa línea no tenga un “;” al inicio.

    Reinicien su servidor y ya debería darles las rutas.

    Saludos.