2012-08-12 19 views
5

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

Lo que tengo

  • example.com/log/
  • LogsController.php

tengo LogsController en lugar de LogController (plural) porque CakePHP quiere que tenga controladores en plural.

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

Ahora, quiero que /log/* se redirija a . Funciona perfectamente bien con el siguiente código:

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

embargo, cuando intento acceder a la example.com/log/actions/foo/bar no parece funcionar. Así que después de algunos Googeling encontré esto:

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

Funciona muy bien. Pero ahora, cuando estoy tratando de acceder example.com/log/ de nuevo, que dice

Error: LogController could not be found.

Pregunta Así que mi pregunta es, ¿Cómo puedo configurar un alias para mi URL para que /log/ utilizará LogsController en lugar de intentar usar LogController.

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


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

+0

Lea esto http://stackoverflow.com/questions/9959152/define-a-singular-rule-in-the-bootstrap-for-inflector – cgTag

+0

Es más fácil decir simplemente que el "vuelo" es singular y plural . – cgTag

Respuesta

10

Ok, con la ayuda de otras personas en IRC y cosas por el estilo. 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.

-1

Simplemente puede hacerlo utilizando siguiente:

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

Su código Connnect enrutador permanecerá igual. Por favor pregunte si no funcionó para usted.

+0

Intenté esto, pero parece que no funciona. Cambié el $ nombre en FlightsController por 'Flight', pero cuando intento acceder a example.com/flight, dice que falta FlightController. – Jelmer

+1

No, la variable de nombre es para compatibilidad con PHP4. No tendrá ningún impacto en el enrutamiento porque el controlador se carga después de realizar el enrutamiento. – cgTag

1

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 router que cuando una acción se encuentra en la URL para usarlo, pero no hay params se encuentran a continuación, por defecto es usar la acción index.

0

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 log a esta lista de uninflected palabras. Esto significa que la torta de todo el sistema no agregará la 's'. Vas a tener sus LogController sus puntos de vista se sentaba en la carpeta Log vista etc ...

EDITAR

que he encontrado una manera mucho más ordenado a hacerlo desde app/config/bootstrap.php

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

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

+0

Pero eso significa que estaría editando archivos en el núcleo. Lo cual no quiero Porque quiero poder actualizar Cake haciendo clic en un botón. Entonces quizás deba extender la clase, pero eso realmente sería un dolor. Supongo que hay algunos buenos métodos para eso. Lo investigaré cuando tenga tiempo :) Tnx para el pensamiento – Jelmer