Selezione tra più azioni in PHP

0

Ho programmato per un certo numero di anni e in PHP per circa 4 di quegli anni. Mi sono sempre chiesto quale sia l'approccio migliore quando il tuo programma decide quale azione intraprendere in base a un'azione dell'utente.

Lasciami limitare un po 'questo. Ho un piccolo CMS personalizzato, in esecuzione, una delle pagine consente a un amministratore di visualizzare e modificare i dettagli dell'account utente come nome, generare una nuova password, modificare le date di pagamento e così via.

Ho un numero di azioni diverse qui:

  • Visualizza tutti gli utenti
  • Visualizza singolo utente
  • Visualizza utenti (stringa di ricerca)
  • Modifica utente
    • Modifica abbonamento
    • Modifica nome
    • Etc
  • Elimina utente
  • Blacklist

Per tutte queste azioni fornisco un let con i dati GET, per esempio:

<a href="users.php?action=show_user&uid=12">User A</a>

I link per le altre cose come la modifica di un utente sarebbero "action = edit_subscription" per esempio.

Quando viene caricata la mia pagina, di solito uso un'istruzione IF ELSE per verificare se un'azione è presente prima di eseguire on.

if($_GET['action'] == "show_user"){
}
else if($_GET['action'] == "edit_subscription"){
}

Una volta che il programma corrisponde all'azione, controlla altri dati come UID e quindi li invia in una classe da elaborare. A volte questo può sembrare un po 'prolisso e può essere un po' difficile da eseguire il debug.

Non so se questo è il modo migliore per farlo, stavo cercando di usare l'istruzione switch e mi chiedevo se sarebbe stato meglio, ma non sono sicuro se lo fosse.

Quindi, se c'è un modo migliore per me per raggiungere questo processo di selezione, forse una sorta di schema che può essere utilizzato?

Un ultimo punto è che sto cercando di mantenere tutto in una volta il file (a parte le classi) così l'HTML e il PHP per le azioni di corrispondenza sono tutti nello stesso file .php, anche se non è sicuro al 100% se questa è la migliore pratica pure.

Grazie per il tuo tempo.

    
posta ragebunny 27.03.2015 - 13:09
fonte

3 risposte

1

Raccomando di guardare il codice del router nella maggior parte dei moderni framework MVC. L'approccio prevalente è usare la riflessione per invocare una particolare funzione chiamata dopo l'azione.

Ecco il codice rilevante di Yii:

O da Laravel:

/**
 * Execute an action on the controller.
 *
 * @param  string  $method
 * @param  array   $parameters
 * @return \Symfony\Component\HttpFoundation\Response
 */
public function callAction($method, $parameters)
{
    return call_user_func_array(array($this, $method), $parameters);
}

link

Nell'esempio Yii sta cercando una funzione all'interno della classe chiamata action<action name> e chiamandola se esiste. Ad esempio se hai richiamato le azioni ViewUsers chiamerebbe la funzione actionViewUsers() . Per gli URL amici, spesso c'è anche un livello sopra quello che mappa un percorso verso una combinazione di controller / azione.

I vantaggi di questo sono numerosi:

  • Evita casi massicci e ingestibili o dichiarazioni
  • Mantiene le variabili limitate allo scopo della loro funzione di azione
  • La mappatura dell'azione - > la funzione viene eseguita in modo dinamico, quindi non è necessario mantenere un elenco di questi mapping
risposta data 27.03.2015 - 13:39
fonte
0

Se vuoi divertirti, potresti prendere in considerazione una tabella di salto .

Basta disporre di un array in cui la chiave è "show_user", "edit_subscription", ecc. e il valore corrispondente è una funzione da chiamare. Dopo aver dichiarato l'array, il codice effettivo è solo una singola istruzione per chiamare la funzione.

Al momento non ho un IDE PHP, per codificarlo per te, ma puoi basarti su il C esempio .

Dalla memoria, qualcosa come

$func = myArray[$_GET['action']];
$func();
    
risposta data 27.03.2015 - 13:40
fonte
0

Penso che tu stia cercando il componente Routing per il tuo codice. Il codice che ho collegato è una libreria di codici piuttosto personale usata e fornita dal framework Symfony2.

Potresti esaminare gli approcci che usa per configurare e determinare percorsi e controllori per loro.

    
risposta data 01.04.2015 - 12:48
fonte

Leggi altre domande sui tag