Dubbio implementazione router dinamico

Ciao a tutti!

Ho un sito che accetta URL in questo formato:

www.nomesito.it/mioParametro

Se mioParametro è contenuto nella tabella PIPPO, allora voglio che il router passi l'azione al modulo PIPPODULO

Se mioParametro è contenuto nella tabella PAPERINO, allora voglio che il router passi l'azione al modulo PAPERIDULO

Come mi consigliate di fare?

- Avevo escluso l'ipotesi di caricare tutte le possibili URL nel bootstrap tramite un ciclo PHP, perchè sarebbero veramente tante... Però posso sempre riconsiderare l'ipotesi.

- Pensavo piuttosto di mandare tutte le richieste ad un generico controller, che poi forward()erebbe il controllo al modulo appropriato.

Altre idee? Voi come fareste?

Gracias! =)

inviato 6 anni fa
Sifro
X 0 X

Stai parlando di moduli...un'implementazione standard di una applicazione con Zend Framework prevede anche l'uso dei moduli.

Questi moduli puoi mapparli come tu dici. L'utente accede all'url indicando il suo parametro, questo carica di conseguenza quel determinato modulo.

Non vedo dove sia il problema.

risposto 6 anni fa
Mario Santagiuliana
X 0 X

Stai parlando di moduli...un'implementazione standard di una applicazione con Zend Framework prevede anche l'uso dei moduli.

Questi moduli puoi mapparli come tu dici. L'utente accede all'url indicando il suo parametro, questo carica di conseguenza quel determinato modulo.

Non vedo dove sia il problema.

...oppure hai detto moduli ma intendevi altro?

N.B.: Nello ZF i moduli sono un insieme di controller/model/view correlati tra loro

 :bye:

risposto 6 anni fa
Gianni Tomasicchio
X 0 X

Provo a spiegarmi meglio.

Ho una tabella in un DB MySql chiamata PERSONAGGI BUONI e una chiamata PERSONAGGI CATTIVI.

All'interno di PERSONAGGI BUONI ci sono:

- paperino

- qui

- quo

- qua

All'interno di PERSONAGGI CATTIVI ci sono:

- gargamella

- crudelia

- mufasa

- l'url www.miosito.it/paperino deve essere gestita dal BuoniController in quanto paperino si trova nella tabella dei buoni

- l'url www.miosito.it/mufasa deve essere gestita dal CattiviController in quanto mufasa si trova nella tabella dei cattivi

Il fatto è che esistono diciamo 10000 differenti possibili URL e io non le conosco a priori: devono essere recuperate dal database ogni volta (ovviamente implementerò delle funzioni per gestire la cache ma questo è un altro discorso)

In pratica la scelta di quale controller utilizzare dipende non dal formato dell'URL (quello è lo stesso!) ma dalla corrispondenza nel database del parametro specificato.

E' più chiaro così?

risposto 6 anni fa
Sifro
X 0 X

Si...se le operazioni che devi compiere sulle varie tabelle sono sempre le stesse è inutile ricreare sempre dei controller o dei moduli per ogni tabella.

Il parametro passato sarà utilizzato dal tuo controller per selezionare la tabella su cui operare.

Per utilizzare quel parametro puoi impostare Zend_Controller_Route.

Ciao

risposto 6 anni fa
Mario Santagiuliana
X 0 X

mmm mi sa che ancora non ci siamo capiti :D

Sulle tabelle non devo compiere nessuna azione: le tabelle mi servono solo a capire se il nome del personaggio passato tramite parametro GET è buono oppure cattivo.

Se è buono devo farci tutta una serie di cose con un determinato modulo.

Se è cattivo devo farci tutta un'altra serie di cose con un altro ben determinato modulo.

Naturalmente quello dei personaggi è un esempio. Nella realtà la distinzione è fra categorie di un blog e categorie di una directory. Per questioni di SEO mi serve che entrambe abbiano l'URL www.miosito.it/nome-categoria

risposto 6 anni fa
Sifro
X 0 X

sarebbe più facile con degli URL del tipo www.tuosito.it/blog/<categoria> e  www.tuosito.it/direcory/<categoria>

se così non puoi procedere allora probabilmente devi crearti un Router personalizzato implementando l'interfaccia Zend_Controller_Router_Interface:

<?php
      interface Zend_Controller_Router_Interface
      {
        /**
         * @param  Zend_Controller_Request_Abstract $request
         * @throws Zend_Controller_Router_Exception
         * @return Zend_Controller_Request_Abstract
         */
        public function route(Zend_Controller_Request_Abstract $request);

      }
?>

Nel metodo route dovresti leggere l'URL richiesto dalla $request, capire il controller e la action da attivare e registrarli nello stesso oggetto $request

 :bye:

risposto 6 anni fa
Gianni Tomasicchio
X 0 X

perfetto è quello che mi serviva! Ma c'è un po' di documentazione a riguardo?

Sul manualone non ho trovato molto.

risposto 6 anni fa
Sifro
X 0 X

Nella documentazione ufficiale ci sono degli esempi in cui viene mostrato come aggiungere un router alla catena. Tieni presente che tu dovrai svuotare la catena dei router e aggiungere una istanza del tuo router personalizzato, altrimenti gli URL verranno intercettati prima dal router standard e non dal tuo.

Non credo ci siano esempi di creazione di un router personalizzato quindi ti conviene sbirciare nel codice di un router del framework, ad esempio quello statico che forse è il più semplice.

 :bye:

risposto 6 anni fa
Gianni Tomasicchio
X 0 X

bella (si fa per dire) storia, senza documentazione sono un po' disorientato.

Diciamo che mi riprometto di metterci mano non appena avrò un po' più di tempo, e per ora provo ad implementare la versione più artigianale tramite forward().

Ho però un problema: tutte le richieste adesso vanno all'IndexController del modulo Default, nel quale ho questo codice:

if($param == 'topolino') 
   // se ho topolino, vado alla action 1
   $this->_forward('action1', 'index', 'default');
// in tutti gli altri casi vado alla action 2
$this->_forward('action2','index','default');

Il problema è che qui passando come parametro "topolino" in effetti entro nell'IF giusto, ma poi il controllo non passa alla action1... Come mai?

risposto 6 anni fa
Sifro
modificato 6 anni fa
X 0 X

capito il problema: Zend prima finisce di eseguire l'azione chiamante, e poi va in quella chiamata dal forward().

Sul manuale dice:

If called in preDispatch(), the currently requested action will be skipped in favor of the new one. Otherwise, after the current action is processed, the action requested in _forward() will be executed.

Ho provato a cambiare il nome della azione in preDispatch(), ma senza risultati, è identico a prima

risposto 6 anni fa
Sifro
X 0 X

Ok come non detto, ho risolto sistemando il codice nella action da cui parte il forward()... continua ad eseguirla tutta ma almeno non ci sono errori e alla fine tutto finisce bene =)

Grazie a tutti e due per l'aiuto ;)

risposto 6 anni fa
Sifro
X 0 X
Effettua l'accesso o registrati per rispondere a questa domanda