Come funziona il pattern MVC in October CMS

Luca Benati

In questo articolo vediamo come funziona il pattern MVC in October.


Pubblicato da Luca Benati il 11 novembre 2019

In questo articolo andremo a vedere come funziona il pattern MVC in October, cominceremo quindi con il creare un controller base, la cui documentazione ufficiale è disponibile qui.


namespace Lbenati\Mioplugin\Controllers;

use Backend\Classes\Controller;

class MioController extends Controller
{
    // qui definiremo i metodi
}


In October il routing di backend segue lo schema del controller, quindi la classe definita qui sopra avrà come prefisso di route /backend/lbenati/mioplugin/miocontroller.

L'entry point di default è definito dal metodo index, chiamata una "action". Questo come gli altri metodi che verranno definiti possono ritornare direttamente un contenuto


public function index()
{
    // Ritorno una stringa
    return 'Ciao';
}

oppure possono ad esempio ritornare un redirect ad un'altra pagina, in questo esempio vediamo un redirect al metodo (action) 'miometodo' dello stesso controller


public function index()
{
    // Ritorno un redirect
    return \Backend::redirect('/backend/lbenati/mioplugin/miocontroller/miometodo');
}


public function miometodo()
{
    // ...
}

Quando un'azione (metodo della classe del controller) non ritorna nulla October cercerà un file per la vista con lo stesso nome dell'action. In questo caso il file plugins/lbenati/mioplugin/miocontroller/miometodo.htm

Se una metodo accetta dei parametri questi verranno presi dai segmenti della url che seguono la action.

La seguente action usa la struttura della url /backend/lbenati/mioplugin/miocontroller/miometodo/luca

In questo caso 'luca' sarà il valore di $nome all'interno della action miometodo


public function miometodo($name = null)
{
    return 'Il mio nome è : ' . $name;
}

Le variabili possono essere passate alla view usando la proprietà $this->vars. Ad esempio se volessimo passare il mio nome alla vista miometodo.htm scriveremo


public function miometodo($nome = null)
{
    $this->vars['mionome'] = $nome;
}


Ora possiamo accedere al nome tramite la variabile $mionome nel corrispondente file plugins/lbenati/mioplugin/miocontroller/miometodo.htm


<h1>Il mio nome è: <?= $mionome ?></h>


Naturalmente è possibile specificare quanti parametri si desidera seguendo lo stesso schema. Ad esempio se noi aggiungiamo il parametro congnome al metodo, tramite la url /backend/lbenati/mioplugin/miocontroller/miometodo/luca/benati valorizzeremo $nome con il valore 'luca' e $cognome con il valore 'benati'


public function miometodo($nome = null, $cognome = null)
{
    $this->vars['mionome'] = $nome;
    $this->vars['miocognome'] = $cognome;
    $this->vars['mionomecompleto'] = $nome . ' ' . $cognome;
}


nel file plugins/lbenati/mioplugin/miocontroller/miometodo.htm


<h1>Il mio nome è: <?= $mionome ?></h>
<h1>Il mio cognome è: <?= $miocognome ?></h>
<h1>Il mio nome completo è: <?= $mionomecompleto ?></h>

I controller possono anche specificare gestori Ajax (Ajax hanldler), rendendo gli aggiornamenti di pagina dinamici un gioco da ragazzi.

Questi metodi devono sempre essere specificati aggiungendo il prefisso 'on' al nome del metodo, come ad esempio onMetodo, qui specificheremo un gestore chiamato onMiometodo.


public function onMiometodo()
{
    // ...
}

Per rendere un gestore Ajax disponibile solo a ad una specifica action è possibile farlo aggiungendo come prefisso il nome dell'azione che ne ha il permesso.

Ad esempio questo Ajax handler può essere chiamato solo dalla action miometodo.


public function miometodo_onMiometodo()
{
    // ...
}

In entrambi i casi il metodo Ajax cercherà nella URL i parametri esattamente come fa la action.

Ad esempio mostriamo un bel messaggio flash.


public function onMiometodo($nome = null)
{

    \Flash::success( 'Complimenti! ' . $nome . ' è proprio un gran bel nome!');
}


Per ora questo è tutto, in un prossimo articolo approfondiremo i controllers e i Behaviors messi a disposizione da October.


Lunga vita e prosperità

Ti interessa un argomento non trattato?