Usare le Relazioni Polimorfiche per gestire la SEO

0
919

Usare le relazioni polimorfiche di Laravel per i contenuti SEO

Questa è una traduzione dell’articolo http://maxoffsky.com/code-blog/using-polymorphic-relationships-of-laravel-for-seo-content scritto da Maks Surguy su http://maxoffsky.com.

Questo tutorial è applicabile a qualsiasi applicazione realizzata con Laravel e che necessita di un qualche strumento per la gestione del SEO.

Il SEO (Search Engine Optimization) è un aspetto molto importante per tutte le applicazioni web. Mentre le tattiche per il SEO potrebbero essere diverse e con diversi modi di ottimizzare un sito per i motori di ricerca, una strada per indicare, al meccanismo di ricerca, i contenuti delle tue pagine è quello di usare il titolo, la meta descrizione e i tag keyword. Questi tre elementi giocano un ruolo importante nel modo in cui le pagine verranno visualizzate nei risultati dei motori ricerca.

La scorsa settimana ho avuto un incarico per la costruzione di un pannello di gestione SEO per un grande sito web. Il pannello di gestione SEO consentirà agli amministratori del sito di impostare il titolo, descrizione e tag keyword per le pagine dinamiche e statiche del sito (ci sono più di 1000 pagine). Utilizzando le relazioni polimorfiche di Laravel ho terminato il lavoro in due giorni. Questo tutorial di seguito vi insegnerà alcuni accorgimenti e gli elementi fondamentali che ho imparato durante l’implementazione.

Prima di iniziare con il codice, immaginiamo di avere un sito di e-commerce che ha alcune categorie di prodotti. Ogni categoria ha la sua pagina raggiungibile da un URL che utilizza una uno slug del nome categoria (ad esempio la categoria “Maglie a manica lunga” potrebbe avere uno slug del tipo “maglie-manica-lunga”). Ogni prodotto ha anche una propria pagina anche’essa con uno slug del nome prodotto come parte dell’URL.

Da un modello semplificato di negozio, descritto sopra, possiamo notare che ci sono almeno 2 tipi di dati nel sistema che saranno visibili agli utenti – categorie e prodotti. Naturalmente si potrebbero avere a disposizione molti altri dati – tag, marchi, colori ecc. Ciascuno di questi tipi di dati può avere una pagina che visualizza le informazioni su tali dati – la pagina della categoria potrebbe mostrare tutti i prodotti presenti per una determinata categoria, la pagina del prodotto mostrerebbe i dati relativi al prodotto e così via.

Che cosa fare se volessimo implementare il SEO per alcuni o per tutti questi tipi di dati?

  • Soluzione 1: aggiungere le informazioni SEO come colonne extra delle tabelle di ogni tipo di dato. Forse se hai solo 1 o 2 tipi di dato non è un problema, ma quando la tua applicazione ne ha di più, il tuo DB potrebbe crescere notevolmente con l’aggiunta delle colonne “titolo”, “description” e “keywords” per ogni tipo di dato da rappresentare;

  • Soluzione 2: usare il sistema di Relazioni Polimorfiche presente in Eloquent;

Non lasciare che il nome ti spaventi. Le Relazioni Polimorfiche sono un po’ speciali, ma sono più semplici di quanto si possa pensare. Se non le hai mai utilizzate, sappi che possono semplificare notevolmente la struttura del tuo database, in svariati casi. Le polimorfiche sono estremamente utili quando si ha un una struttura comune con due o più tipi di dati. Capirai meglio il concetto durante la lettura di questo articolo.

Di seguito il mio ragionamento: invece di aggiungere le stesse colonne per tutte le tabelle DB che ne hanno bisogno, si può avere solo una tabella con ID e il TIPO di dato da altre tabelle memorizzate. Guarda l’immagine qui sotto che mostra una struttura DB reale, se si sceglie di usare le relazioni polimorfiche per memorizzare i dati SEO per più tipi di dati (più tabelle):

La migration per creare una tabella del genere è la seguente:

Schema::create(‘seo’, function(Blueprint $table){
$table->increments(“id”);

$table->string(“title”);
$table->string(“description”);
$table->string(“keywords”);

$table->morphs(‘seoable’);

$table->timestamps();
});

Il metodo morphs si occupa di creare due colonne: seoable_id, intero senza segno, e seoable_type, una stringa. Questi due campi sono la base per le relazioni polimorfiche.

Passiamo avanti adesso: hai bisogno di creare un Model per i tuoi dati SEO. Questo di seguito andrà bene per tutti i tipi di dati che vuoi mettere in relazione. Il model per la tabella SEO è il seguente (memorizzato in app/models/Seo.php):

morphTo();
}

}

Tutto qui! In ogni altro model in cui vuoi usare i dati SEO, devi solo specificare $this->morphMany(‘Seo’, ‘seoble’) come relazione che restituisce il SEO (ad esempio forniamo il model SEO per il model Products in app/models/Product.php):

class Product extends Model
{

public function seo()
{
return $this->morphMany(‘Seo’, ‘seoble’);
}


}

A questo punto, se hai dati presenti nella tabella SEO, specificando un ID di qualche prodotto nel DB e la “seoble_type” come “Product”, si possono ottenere i dati SEO per quello specifico prodotto e visualizzarli in questo modo:

// recupero i dati del prodotto tramite ID
$product = Product::find($id);

// recupero i dati SEO del prodotto;
$seo = $product->seo->first();

// mostro nella view i dati SEO per tale prodotto
{{ isset($seo->title) ? $seo->title : ‘Viewing Product’}}
keywords) ? $seo->keywords : ”}}”>
description) ? $seo->description : ”}}”>

Inoltre, se hai un model per le categorie per il quale sono stati salvati i dati nella tabella seo con id della categoria e come “seoable_type” “Category”, per recuperare tali dati, vale la stessa cosa vista nell’esempio sopra dei prodotti:

// recupero i dati della categoria tramite ID
$category = Category::find($id);

// recupero i dati SEO della categoria;
$seo = $category->seo->first();

// mostro nella view i dati SEO per tale categoria
{{ isset($seo->title) ? $seo->title : ‘Viewing Category’}}
keywords) ? $seo->keywords : ”}}”>
description) ? $seo->description : ”}}”>

Niente male, vero?

A questo punto, puoi inserire i dati nel DB tramite l’amministratore DB che utilizzi (come PHP MyAdmin) per tutti i prodotti, le categorie e per altre entità e puoi mostrarli facilmente ai motori di ricerca nel modo che ho appena descritto.

Buon lavoro!