class Yii extends YiiBase {}




/**

 * Yii is a helper class serving common framework functionalities.

 *

 * It encapsulates {@link YiiBase} which provides the actual implementation.

 * By writing your own Yii class, you can customize some functionalities of YiiBase.

 *

 * @author Qiang Xue <qiang.xue@gmail.com>

 * @version $Id: yii.php 1678 2010-01-07 21:02:00Z qiang.xue $

 * @package system

 * @since 1.0

 */

class Yii extends YiiBase

{

}




Avete mai modificato questa classe? Si può sfruttare?

Certamente, quella classe è vuota proprio per dare la possibilità di estendere il funzionamento del framework.

Quado l’applicazione web è “in funzione”, quella classe è un po come la spina dorsale, quindi qualsiasi cosa aggiungi li dentro te la ritrovi ovunque in “run time” ;)

Personalmente non ho ancora avuto la necessità di modificare la classe Yii, il meccanismo delle estensioi, unito al pattern MVC ricopre praticamente tutte le mie esigenze, ma se mi capiterà un giorno di esser limitato in qualcosa, quella sarà una delle prime classi che proverò a modificare.

Soltanto una considerazione però: ricorda che dal punto di vista della modularità, è più “comodo” creare una estensione, piuttosto che modificare la classe base: l’estensione la prendi e la metti in tutte le installazioni Yii a piacimento; non si può dire la stessa cosa sella classe Yii, soprattutto se la estendi di parecchio.

Quindi posso estendere Yii e veder propagare ogni mio nuovo metodo in tutte le altre classi giusto? Si, in effetti se volessi portare da un mio lavoro Yii le stesse modifiche dovrei fare un copia incolla, mentre con un’estensione (che non so nemmeno che forma abbia) dovrei spostare “solo lei”. Giusto?

Si, è giusto. Potrai chiamare nomeMetodo() praticamente ovunque. Ti basterà scrivere Yii::nomeMetodo()

Si, ti confermo anche questo. Copiare/incollare un file o una cartella è sicuramente più “pulito” che andare a ravanare nei file e fare copia/incolla. ;)

Per estendere Yii ci sono svariati modi, tutti molto puliti. La scelta dipende da cosa devi fare. Del resto è un framework! :)

Io l’avevo usata banalmente per fare l’override del metodo powered() contenuto in YiiBase e modificare la dicitura “Powered by …”. Però penso smetterò di modificare la classe Yii perché preferisco tenere il contenuto della directory /framework intatto in modo da poter aggiornare comodamente il framework di versione in versione semplicemente rimpiazzando la suddetta cartella, invece se modifichi la classe Yii devi ricordati ogni volta di ripristinare anche il relativo file.

Infatti ;)

Non si deve modificare mai niente di niente di quello che sta nella cartella framework.

Se devi modificare qualcosa, ti fai una tua bella classe (da mettere, per esempio, in component) con scritto:




class MiaYii extends Yii

{

    public function powered()

    {

         return "potenziato da Yii";

    }

}




E nel codice puoi scrivere comodamente:




echo MyYii::powered();



Questa cosa si applica a tutte le cose che stanno nel framework. Io ho provato a modificare CDbCommandBuilder, per esempio, ed estedere CDbConnection per farla includere.

UH! Non ci avevo pensato. Oltre tutto possiamo aggiornare tutto il framework senza preoccuparci di nulla se seguiamo il tuo consiglio. Ottima cosa direi =).

E’ il bello di estendere.

Io in 2 anni mi sono scontrato solo una volta con una cosa che non si puo’ estendere (c’e’ una costante)!

Per il resto si puo’ fare proprio di tutto senza mettere mano ai file del framework.

Tieni pero’ presente che il file “upgrade”, quello da consultare quando esce una nuova versione per passare alla successiva, copre solo l’uso normale e da bravo ragazzo, non copre tutte le eventuali estensioni (d’altra parte che ne sanno loro di come modifichi i metodi), per cui se hai casini che non capisci in upgrade, quasi sempre e’ un file che hai esteso.

Giusto da tenere a mente

Può essere vero in generale ma nel caso specifico la classe Yii è fatta apposta per essere modificata (come suggerisce il blocco di commento), che poi per i motivi già spiegati si possa preferire di non farlo è un altro conto.

Ma infatti, quello che intendo dire e’ che non si deve modificare la classe Yii, ma estenderla e sovrascrivere i metodi che servono.

Al 90% dei casi, se voi pensate di estendere qualcosa ci ha gia’ pensato Qiang prima di voi, e vi troverete un bel metodo nella classe con un commento tipo:




/* Overwrite this method for change this behaviour