Pregunta

Quiero dos métodos especiales:

  • uno que se ejecuta para todas las URL
  • uno que se ejecuta solo para una ruta específica ( / admin )

Pensé que lo más general sería usar begin , y el método para / admin usaría auto . Por ejemplo, en estos dos controladores Catalyst:

package MyApp::Controller::Root;

sub begin :Private {
    my ($self, $c) = @_;

    $c->log->debug('Run for all URLs');
}

[...]

package MyApp::Controller::Admin;

sub auto :Private {
    my ($self, $c) = @_;

    $c->log->debug('Run for /admin only');
}

Pero esto no logra lo que quiero. ¿Cuál es la solución correcta?

EDITAR : el problema es que Addmin :: auto () nunca se llama, no cuando accedo a / admin o / admin /

Después de más pruebas, nunca se llama a auto . Intenté poner el auto en diferentes lugares, nunca se llama.

¿Fue útil?

Solución 2

El problema era en realidad el siguiente: ambos controladores tenían esta línea:

__PACKAGE__->config->{namespace} = '';

Esto evitó que la función automática se activara en Admin.pm

Otros consejos

No hay una razón obvia por la que lo que ha descrito no hace lo que necesita. Esa sería la forma correcta de hacerlo.

El registro debe mostrar la ruta de envío y si su solicitud fue enrutada a través de estas acciones o no. Si no, le dirá cómo se está manejando.

La segunda línea de cada sub debe terminarse con un ';'. Supongo que es un error tipográfico en SO, no su código original.

¿Tiene una acción de inicio en Controller :: Admin? Como dice RET, la forma en que ha descrito las cosas debería funcionar bien; la única advertencia con un "comienzo global" es que si pones un comienzo en cualquier otro controlador, se "sombreará" el global, porque solo un comienzo se ejecuta por acción, y es el "más específico" uno (el más largo en términos de espacio de nombres de ruta privada).

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top