Newsgroup: it.comp.www.php
Titolo: CakePHP

Salve,
negli ultimi due giorni mi sono imbattuto ripetutamente in questo
framework (tra siti di news e drupal), e sarei curioso di sapere se
qualcuno l'ha gia` usato e come lo trova.
Pareri da chi l'ha provato, insomma.
Dicono che sia molto simile a Rails (di Ruby), ma non avendolo mai usato
non so cos intendano. Io ho dato un occhio ai tutorial e non sembra
male, ma sarei curioso di sapere come si comporta in progetti un po'
piu` grossi di quelli.
Grazie.
Bye.
-- 
Alessandro Pellizzari

 piu` grossi di quelli.
Non ho mai utilizzato Ror. Stando a quello che dicono loro, su IRC, sono  
partiti con un porting di Ror, per poi seguire la loro strada (la  
struttura delle directory è cambiata, ad esempio, hanno cominciato ad  
introdurre funzioni e classi differenti).
Se hai domande piu' specifiche falle pure, anche se, ti ripeto, non ci ho  
smanettato moltissimo, solo un po'.
Ciao
Tac
-- 
La netiquette prevede sign di al massimo quattro righe.
Purtroppo la mia sign in quattro righe non ci stà.

 smanettato moltissimo, solo un po'.
Domande piu` specifiche no, mi riservo comunque di provarlo prima
possibile. Solo una cosa sul pezzo che ho quotato: quali limitazioni
pensi ti possa dare nello sviluppo? In pratica: perche` non credi lo
utilizzerai?
Grazie per le info.
-- 
Alessandro Pellizzari



Una per tutte: l'assurda naming convention utilizzata per i controllers.
L'applicazione è suddivisa in controllers.
Es:
http://example.com/users/login
richiamerà automaticamente la funzione login della classe UsersController.
la classe sarà qualcosa di questo tipo:
class UsersController extends AppController {
	function index (){
		//...
	}
	function login (){
		//...
	}
}
La n.convention però prevede che i controller siano tutti al plurale, se  
non lo fai, alcune cose non funzionano, o tocca fare ritocchi qua e là.
Il programma, ad esempio, dal plurale calcola automaticamente il singolare  
(user) e ti mette a disposizione automaticamente una classe settata per  
leggere dalla tabella 'user' sul db.
I template vengono di default richiamati dalla cartella /app/views/user.
Tutto è workaroundabile, ma a quel punto il framework diventa meno veloce  
(ma resta comunque piu' veloce che farsi le cose a manina).
Quando l'ho provato non era stato ancora implementato il nuovo Inflector  
(la classe che converte singolari plurali etc) che permette di  
implementare casi particolari etc (per esempio gli utenti inglesi avevano  
difficoltà con i controller Curriculum, il cui plurale, anche in inglese,  
è irregolare).
Chiaramente avere sul db la tabella "articolos" non è il massimo, ne  
tantomeno avere un url che contenga una parola di questo tipo.
E' tutto comunque aggirabile senza hack sul core, ma a questo punto ho  
preferito modificare l'inflector.
Con due righe di codice (e leggera sorpresa degli stessi sviluppatori di  
cake) tutto funzionava perfettamente.
Il framework *gira* sulle naming conventions, e questo va benissimo, ma  
questa dei plurali per gli stranieri è un po' ostica.
Le altre limitazioni sono sulla strutturazione. La struttura è il punto  
forte ma non condivido alcune scelte (aggirabili cmq senza modificare il  
core).
Ad esempio ogni controller può avere una variabile $beforeFilter. Se è  
settata (deve essere un'array), gli elementi contenuti vengono eseguiti  
prima del richiamo della pagina.
Esempio:
class UsersController extends AppController {
	var $beforeFilter = array ('_writeStatistics','_alreadyLogged');
	function index (){
		//...
	}
	function login (){
		//...
	}
	function _writeStatistics(){
	}
	function _writeStatistics(){
	}
}
Usando la classe di esempio, sia con 
http://example.com/users
, sia con  
http://example.com/users/login
, prima di eseguire la funzione relativa  
alla pagina in esame (index o login), verranno eseguite in ordine  
_writeStatistic e _alreadyLogged.
E' un meccanismo di callback molto utile, solo che in genere per questo  
genere di cose si utilizza l'ereditarietà.
Sarebbe meglio strutturare la cosa così:
class AppController {
	function _beforeFilter(){
       }
}
class UsersController extends AppController {
	var $beforeFilter = array ('_writeStatistics','_alreadyLogged');
	function index (){
		//...
	}
	function login (){
		//...
	}
	function _beforeFilter(){
		$this->_writeStatistics();
		$this->_alreadyLogged();
	}
	function _writeStatistics(){
	}
	function _alreadyLogged(){
	}
}
L'ultimo esempio è una soluzione di gran lunga piu' flessibile, anche se  
anche come è strutturato ora è comunque comodo.
Inoltre, è possibile implementare questa modifica a livello di  
applicazione senza toccare il core con poche righe di codice.
Buffo notare come la stessa possibilità sul salvataggio nel db è stata  
implementare. beforeSave() è stato implementato esattamente come  
beforeFilter(). Recentemente hanno aggiunto _afterSave(), ma l'hanno  
implementato usando l'ereditarietà, come nell'esempio che ho proposto  
sopra. Credo si siano accorti che è meglio, immagino (spero) deprecheranno  
il metodo utilizzato per beforeFilter e beforeSave a favore del metodo  
dell'ultimo esempio.
Piu' che limitazioni, come vedi, sono scelte ben precise.
Ultima cosa: l'applicazione usa .htaccess per gestire i controller.  
htaccess è comunque disattivabile, ma se è attivato lavorare sulle url non  
è semplicissimo.
Ad esempio può essere problematico avere url come:
http://example.com/admin/users/add
Perchè l'applicativo cercherebbe AdminController, non UserController.
Anche questo è aggirabile senza modifiche al core, anche se il grande boss  
non mi è parso abbia gradito piu' di tanto il metodo che ho utilizzato  
(anche se a mio parere non è errato nemmeno concettualmente).
Cake ha anche vantaggi, intendiamoci. E' uno dei pochi MVC Framework che  
gira senza problemi su php4, per esempio.
E' probabilmente quello che richiede meno apprendimento (anche se è meno  
semplice di quello che fanno intendere, è comunque semplice).
E' inoltre possibile sovrascrivere (anche qui non capisco perchè non  
permettano di utilizzare l'ereditarietà totalmente, invece che solo in  
parte) varie classi presenti nel core per adattarlo ai propri gusti.
La classe AppController che hai visto nell'esempio sopra, è generalmente  
vuota ed estende la classe Controller.
Quando crei un tuo controller, in genere fai in modo che estenda  
AppController.
UsersControllers => AppController => Controller.
In questo modo se non ti và bene qualcosa all'interno di Controller ti  
basta fare l'override della funzione.
E' possibile fare questo gioco per molte componenti dell'applicativo (non  
tutte, purtroppo).


 Una per tutte: l'assurda naming convention utilizzata per i controllers.
Wooo! Grazie mille, mi sono salvato il post e lo rileggero` con calma
durante i miei test.
Nel frattempo, visto che parli di altri framework MVC, cosa
consiglieresti tu? Anche su PHP5.
Mi interessa una soluzione che separi il piu` possibile il layout (da
dare in pasto a grafici e html-isti) dal codice (che faccio io).
Grazie.
-- 
Alessandro Pellizzari

 consiglieresti tu? Anche su PHP5.
Prova a dare una occhiata a Prado ( 
http://www.xisc.com/
 )
-- 
I am what I am, I do what I can
Sei un newbie? Leggi questo 
http://url.repository.biz/go/3C
Vuoi supportarmi? 
http://url.repository.biz/go/3E
Do. Or do not. There is not try.

 dare in pasto a grafici e html-isti) dal codice (che faccio io).
Cake nasce dall'assunto che php stesso è un motore di template, motivo per  
cui le varie "viste" sono file php. L'idea di base è comunque usare solo  
variabili e funzioni di encoding al loro interno.
Dopo una gran rottura di cojonas da parte della community il creatore di  
cake ha creato una piccola classe per integrarlo con smarty, quindi al  
limite puoi usare quello.
La separazione comunque, se il programmatore è in gamba, c'è e come.
Se ti interessa solo la separazione e non tutto un framework, c'è Mojavi,  
che dovrebbe essere un progetto abbastanza maturo (è uno dei software che  
usa Symfony).
Magari prova a chiedere qui:
sitepoint.com/forums/forumdisplay.php?f=147
è decisamente un bel forum (anche se in molti ti diranno di fartelo da te  
:-)).


 Prova a dare una occhiata a Prado ( 
http://www.xisc.com/
 )
Carino, ma non mi sembra tutta questa gioia.
E' sicuramente promettente, ma nello showcase del loro sito non mi pare di  
aver visto questi grandi casi d'uso.
Interessante il fatto che sia stato usato per una applicazione desktop in  
php, invece.
Staremo a vedere cosa succederà con la versione appena uscita.


 usa Symfony).
Grazie per le segnalazioni (anche a Setec per Prado).
Symfony e Prado mi sono sembrati (a un primo sguardo, poi magari mi
sbaglio) piu` complessi da usare, mentre mojavi (e cake) sembrano piu`
adatti alle mie esigenze attuali, soprattutto per il modello di sviluppo
che abbiamo.
Smarty e` interessante, ma non mi e` piaciuta molto l'idea di "popolare"
manualmente le variabili prima di richiamare il template, e cercavo
qualcosa OO proprio per infilare negli oggetti i metodi da richiamare
nel template per costruire la pagina.
Non ho problemi a "dare in pasto" qualche pezzo di PHP ai grafici, sanno
come evitare di pasticciarci.
Grazie ancora.
Bye.

 Bye.
Prego. (se decidi di provare un framework mvc, procurati un buon debugger,  
o quantomeno una qualche utility per stampare a video backtrace leggibili,  
all'inizio capire il percorso che fà il codice non è del tutto immediato.
