Alias ​​del controlador CakePHP

Sé que hay un par de otros temas sobre este tema, pero ninguno parece satisfacer mis necesidades.

Lo que tengo

  • example.com/log/
  • LogsController.php

Tengo LogsController lugar de LogController (plural) porque CakePHP quiere que tengas controladores en plural.

Pero como usted sabrá / notará, example.com/log/ nunca usará LogsController debido a la falta de ‘s’ en la url.

Ahora, quiero que /log/* sea ​​redirigido a /logs/* . Funciona perfectamente bien con el siguiente código:

 Router::connect ('/log/*', array('controller'=>'logs')); 

Pero, cuando bash acceder a example.com/log/actions/foo/bar , parece que no funciona. Así que después de algunos Googeling encontré esto:

 Router::connect ('/log/:action/*', array('controller'=>'logs')); 

Funciona genial. Pero ahora, cuando bash acceder a example.com/log/ nuevamente, dice

Error: LogController no se pudo encontrar.

Pregunta Entonces, mi pregunta es, ¿cómo configuro un alias para mi url para que /log/ use LogsController lugar de intentar usar LogController ?

Tengo algunos Controladores más en los que me gustaría cambiar esto, como flight => FlightsController , profile => ProfilesController .


Eche un vistazo a esta pregunta . Es sobre el mismo tema, pero ligeramente diferente. Podría ayudarte de alguna manera.

Ok, con la ayuda de otras personas en IRC y cosas así. Descubrí lo siguiente.

Una combinación de

 Router::connect('/flight/:action/*', array('controller'=>'flights')); Router::connect('/flight/*', array('controller'=>'flights')); 

Hace el truco. Intenté esto antes, pero en otro orden, así:

 Router::connect('/flight/*', array('controller'=>'flights')); Router::connect('/flight/:action/*', array('controller'=>'flights')); 

que no funciona

Así que las primeras 2 líneas de código en este post lo resolvieron para mí. Otro chico me dijo que la solución de Arun Jain no es una solución adecuada, ya que también cambia las convenciones de nombres en el núcleo. Lo cual causará problemas con FormsHelper y clases como esa. Así que creo que preferiré el código en esta publicación, ya que es solo un alias en lugar de un trozo de guión que cambia radicalmente. De todas formas, gracias por la ayuda.

Para hacer esto con el enrutamiento, el enfoque correcto es el siguiente.

 Router::connect('/flight', array('controller'=>'flights','action'=>'index')); Router::connect('/flight/:action/*', array('controller'=>'flights')); 

Esto le dice al enrutador que cuando se encuentra una acción en la URL para usarla, pero no se encuentran los parámetros, entonces por defecto es usar la acción del índice.

Tengo una visión ligeramente diferente de todo esto. El plural es más a menudo la manera más precisa de ir con cosas, pero en ocasiones cuando el plural es simplemente incorrecto, añado una excepción a la clase Inflector (/ lib / Cake / Utility / Inflector).

En su ejemplo, agregaría el log a esta lista de palabras uninflected . Esto significa que la torta de todo el sistema no agregará la ‘s’. Tendrás tu LogController el que las vistas se LogController en la carpeta de vista Log , etc …

EDITAR

Me he encontrado con una forma mucho más ordenada de hacerlo desde app/config/bootstrap.php

 Inflector::rules( 'plural', array( 'uninflected' => array('log') ) ); 

Esto agregaría el log a la lista no inflexible sin tener que alterar los archivos dentro del núcleo para permitir una actualización más fácil de la versión.

Simplemente puede hacerlo usando lo siguiente:

 class LogsController extends AppController { public $name = 'Log'; ..... YOUR REMAINING CODE ...... } 

El código de conexión del enrutador seguirá siendo el mismo. Por favor pregunte si no funcionó para usted.