Development

Documentation/it_IT/book/1.0/06-Interno-Controller-Layer (diff)

You must first sign up to be able to contribute.

Changes between Version 21 and Version 22 of Documentation/it_IT/book/1.0/06-Interno-Controller-Layer

Show
Ignore:
Author:
Andrea.Giorgini (IP: 84.60.50.169)
Timestamp:
03/03/07 20:14:33 (11 years ago)
Comment:

--

Legend:

Unmodified
Added
Removed
Modified
  • Documentation/it_IT/book/1.0/06-Interno-Controller-Layer

    v21 v22  
    10911091Il parametro <span style="font-family: Monospace">enabled: off</span> funziona bene per disabilitare i tuoi filtri, ma puoi disattivare i filtri di default tramite il file <span style="font-family: Monospace">settings.yml</span>, modificando i valori di <span style="font-family: Monospace">web_debug</span>, <span style="font-family: Monospace">use_security</span>, <span style="font-family: Monospace">cache</span>, e <span style="font-family: Monospace">use_flash</span>. Questo perchè ognuno dei filtri di default possiede un parametro <span style="font-family: Monospace">condition</span> che controlla i valori di tali impostazioni.</p></blockquote> 
    10921092}}} 
     1093 
     1094 
     1095=== Costruire filtri personalizzati === 
     1096 
     1097E' abbastanza semplice costruire un filtro. Crea una classe simile a quella del Listato 6-30, e posizionala in una delle cartelle {{{lib/}}} del progetto per approfittare della funzionalità di autoloading. 
     1098 
     1099Dato che un'azione può fare un redirect od un forward ad un'altra azione e di conseguenza rilanciare tutta la catena di filtri, potresti voler restringere l'esecuzione dei tuoi filtri alla sola prima chiamata della richiesta. Il metodo {{{isFirstCall()}}} della classe {{{sfFilter}}} restituisce un booleano a questo scopo. Questa chiamata ha senso esclusivamente prima dell'azione {{{execution}}}. 
     1100 
     1101Questi concetti sono più chiari con un esempio. Il Listato 6-33 mostra un filtro utilizzato per autenticare automaticamente utenti che possiedono uno specifico cookie MyWebSite, che presumibilmente viene creato dall'azione di login. E' un modo rudimentale ma funzionante di implementare la funzionalità "ricordati di me" offerta spesso nelle form di login. 
     1102 
     1103''Listato 6-33 - Esempio di filtro, in {{{apps/myapp/lib/rememberFilter.class.php}}}'' 
     1104 
     1105{{{ 
     1106#!php 
     1107class rememberFilter extends sfFilter 
     1108{ 
     1109  public function execute($filterChain) 
     1110  { 
     1111    // Esegue questo filtro solo una volta 
     1112    if ($this->isFirstCall()) 
     1113    { 
     1114      // I filtri non hanno accesso diretto alle richieste ed agli oggetti utente 
     1115      // Per arrivarci devi passare dal contesto 
     1116      $request = $this->getContext()->getRequest(); 
     1117      $user    = $this->getContext()->getUser(); 
     1118  
     1119      if ($request->getCookie('MyWebSite')) 
     1120      { 
     1121        // sign in 
     1122        $user->setAuthenticated(true); 
     1123      } 
     1124    } 
     1125  
     1126    // Esegui un nuovo filtro 
     1127    $filterChain->execute(); 
     1128  } 
     1129} 
     1130}}} 
     1131 
     1132In qualche caso, invece di continuare l'esecuzione della catena di filtri, alla fine di un filtro avrai bisogno di fare un forward ad una data azione. {{{sfFilter}}} non possiede un metodo {{{forward()}}}, ma {{{sfController}}} si, per cui puoi fare semplicemente: 
     1133 
     1134{{{ 
     1135#!php 
     1136return $this->getController()->forward('mymodule', 'myAction'); 
     1137}}} 
     1138 
     1139{{{ 
     1140#!html 
     1141<blockquote style="padding: 5px 20px 5px 40px; margin: 10px 0; background: #ffc url(/images/note.gif) no-repeat 5px 10px; border: 1px solid #ddd;"><p> 
     1142La classe <span style="font-family: Monospace">sfFilter</span> possiede un metodo <span style="font-family: Monospace">initialize()</span>, eseguito quando l'oggetto filtro viene creato. Puoi fare un override di tale metodo nel tuo filtro personalizzato se hai bisogno di gestire parametri (definiti in <span style="font-family: Monospace">filters.yml</span>, come descritto in seguito).</p></blockquote> 
     1143}}} 
     1144 
     1145 
     1146=== Attivazione dei filtri e parametri === 
     1147 
     1148Creare un filtro non significa attivarlo. Devi aggiungere il tuo filtro alla catena, e per farlo devi dichiararlo nel file {{{filters.yml}}}, situato nella cartella {{{config/}}} dell'applicazione o del modulo, come mostrato nel Listato 6-34. 
     1149 
     1150''Listato-34 - Esempio di attivazione di un filtro, in {{{in apps/myapp/config/filters.yml}}}'' 
     1151 
     1152{{{ 
     1153#!php 
     1154rendering: ~ 
     1155web_debug: ~ 
     1156security:  ~ 
     1157 
     1158remember:                 # I filtri necessitano di un nome univoco 
     1159  class: rememberFilter 
     1160  param: 
     1161    cookie_name: MyWebSite 
     1162    condition:   %APP_ENABLE_REMEMBER_ME% 
     1163 
     1164cache:     ~ 
     1165common:    ~ 
     1166flash:     ~ 
     1167execution: ~ 
     1168}}} 
     1169 
     1170Una volta attivato, il filtro viene eseguito ad ogni richiesta. Il file di configurazione dei filtri può contenere una o più definizioni di parametri sotto la chiave {{{param}}}. La classe ha la possibilità di ricevere i valori di tali parametri tramite il metodo {{{getParameter()}}}. Il Listato 6-35 ne mostra un esempio. 
     1171 
     1172''Listato 6-35 - Ricevere i parametri, in {{{apps/myapp/lib/rememberFilter.class.php}}}'' 
     1173 
     1174{{{ 
     1175#!php 
     1176class rememberFilter extends sfFilter 
     1177{ 
     1178  public function execute ($filterChain) 
     1179  { 
     1180      ... 
     1181      if ($request->getCookie($this->getParameter('cookie_name'))) 
     1182      ... 
     1183  } 
     1184} 
     1185}}} 
     1186 
     1187Il parametro {{{condition}}} viene testato dalla catena di filtri per verificare se il filtro debba essere eseguito o meno. Quindi la dichiarazione del tuo filtro si potrebbe basare sulla configurazione di un'applicazione, come nel Listato 6-34. Il filtro {{{remember}}} verrà eseguito esclusivamente se nel tuo {{{app.yml}}} è presente la seguente impostazione: 
     1188 
     1189{{{ 
     1190#!php 
     1191all: 
     1192  enable_remember_me: on 
     1193}}} 
     1194 
     1195 
     1196=== Esempi di filtri === 
     1197 
     1198La funzionalità di filtro è utile nella ripetizione di codice per ogni azione. Ad esempio, nell'utilizzo di un sistema di tracking esterno, probabilmente avrai bisogno di inserire un pezzo di codice in ogni pagina dell'applicazione. Potresti metterlo nel layout globale, ma così sarebbe disponibile per tutte le applicazioni. Oppure, potresti metterlo in un filtro, come mostrato nel Listato 6-36, ed attivarlo a seconda del modulo. 
     1199 
     1200''Listato 6-36 - Filtro Google Analytics'' 
     1201 
     1202{{{ 
     1203#!php 
     1204class sfGoogleAnalyticsFilter extends sfFilter 
     1205{ 
     1206  public function execute($filterChain) 
     1207  { 
     1208    // Prima dell'azione non c'è niente da eseguire 
     1209    $filterChain->execute(); 
     1210  
     1211    // Decora la risposta con il codice del tracker 
     1212    $googleCode = ' 
     1213<script src="http://www.google-analytics.com/urchin.js"  type="text/javascript"> 
     1214</script> 
     1215<script type="text/javascript"> 
     1216  _uacct="UA-'.$this->getParameter('google_id').'";urchinTracker(); 
     1217</script>'; 
     1218    $response = $this->getContext()->getResponse(); 
     1219    $response->setContent(str_ireplace('</body>', $googleCode.'</body>',$response->getContent())); 
     1220   } 
     1221} 
     1222}}} 
     1223 
     1224Fai attenzione al fatto che il filtro nell'esempio non è perfetto, in quanto non dovrebbe aggiungere il tracker in risposte che non siano HTML. 
     1225 
     1226Un altro esempio potrebbe essere un filtro che commuta la risposta in SSL, se non lo è già, come mostrato nel Listato 6-37. 
     1227 
     1228''Listato 6-37 - Filtro per comunicazione sicura'' 
     1229 
     1230{{{ 
     1231#!php 
     1232class sfSecureFilter extends sfFilter 
     1233{ 
     1234  public function execute($filterChain) 
     1235  { 
     1236    $context = $this->getContext(); 
     1237    $request = $context->getRequest(); 
     1238    if (!$request->isSecure()) 
     1239    { 
     1240      $secure_url = str_replace('http', 'https', $request->getUri()); 
     1241      return $context->getController()->redirect($secure_url); 
     1242      // Non continuiamo con la catena dei filtri 
     1243    } 
     1244    else 
     1245    { 
     1246      // La richiesta è già sicura, proseguiamo 
     1247      $filterChain->execute(); 
     1248    } 
     1249  } 
     1250} 
     1251}}} 
     1252 
     1253 
     1254== Configurazione del modulo == 
     1255 
     1256Pochi comportamenti dei moduli si basano su configurazione. Per modificarli, devi creare un file chiamato {{{module.yml}}} nella cartella {{{config/}}} del modulo, e definire le impoostazioni per ogni ambiente (o sotto l'header {{{all:}}} per tutti gli ambienti). Il Listato 6-38 ne mostra un esempio. 
     1257 
     1258''Listato 6-38 - Configurazione del modulo, in {{{apps/myapp/modules/mymodule/config/module.yml}}}'' 
     1259 
     1260{{{ 
     1261#!php 
     1262all:                 # Per tutti gli ambienti 
     1263  enabled:     true 
     1264  is_internal: false 
     1265  view_name:   sfPhpView 
     1266}}} 
     1267 
     1268Il parametro {{{enabled}}} ti permette di disabilitare tutte le azioni di un modulo. Tutte le azioni vengono redirezionate a {{{module_disabled_module/module_disabled_action}}} (come impostato in {{{settings.yml}}}). 
     1269 
     1270Il parametro {{{is_internal}}} ti permette di restringere a chiamate interne tutte le azioni di un modulo. Ad esempio, questo torna utile per tutte le azioni che spediscono e-mail, le quali dovrebbero essere disponibili alle altre azioni ma non direttamente dall'esterno. 
     1271 
     1272Il parametro {{{view_name}}} definisce la classe di vista. Deve ereditare da {{{sfView}}}. Facendo l'override di questo parametro puoi utilizzare altri sistemi per le template, come ad esempio Smarty. 
     1273 
     1274 
     1275== Sommario == 
     1276 
     1277In symfony, il controller è diviso in due parti: il front controller, unico punto di accesso all'applicazione per un dato ambiente, e le azioni, che contengono la logica delle pagine. Un'azione ha la capacità di determinare come sarà eseguita la propria vista, restituendo una delle costanti {{{sfView}}}. All'interno di un'azione, puoi manipolari diversi elementi del contesto, compresa la richiesta ({{{sfRequest}}}) e le sessioni utente ({{{sfUser}}}). 
     1278 
     1279Unendo la potenze delle azioni, delle sessioni e della configurazione di sicurezza si ottiene un sistema completamente sicuro, con gestione di restrizioni e credenziali. I metodi special {{{validate()}}} e {{{handleError()}}} nelle azioni permettono la gestione della validazione. Ed i metodi {{{perExecute()}}} e {{{postExecute()}}} sono pensati per la riusabilità del codice in un modulo, mentre i filtri autorizzano la stessa riusabilità per tutte le applicazioni eseguendo il codice del controller ad ogni richiesta.