CakePHPßetaBeers Valencia, 01/12/2011
Sobre mi
● Andy Dawson● @AD7six● Blogger infrequente AD7six.com● Desarrollador desde 1999● PHP desde 2005● CakePHP
○ desde 2005 ○ Autor de muchos plugins○ Miembro del equipo core de CakePHP
Tecnologías y Herramientas
Tecnologías y Herramientas
¿Por que usar un framework?
● Estructura● Se concentra en implementar la aplicación● Evita problemas comunes● Consigue un código reutilizable● Se beneficia del conocomiento de otros
desarolladores● Desarrollo Rápido (RAD)
Los problemas de los frameworks
● Estructura● Falta de flexibilidad● Complejidad● Tiempo para aprender● Rendimiento● Hay muchos - ¿cómo elejir?
CakePHP en breve
● Convención sobre Configuración● Estructura MVC● Fácil de usar, rápido de aprender● RAD prototyping (scaffolding)● Generdor de código (bake)● unit test (phpunit)● Gran cantidad de plugins publicados● Gran comunidad● versión 1.3, php 4.3.2+● versión 2.0, php 5.2.9+ (y pdo)
Como Empezar
● Principal: http://cakephp.org● Repo: http://github.com/cakephp/cakephp● Docs: http://book.cakephp.org/2.0/● El grupo google: cakephp-esp● Irc: Freenode #cakephp-es
Bienvenido a CakePHP
Ficheros y carpetas
● ROOT○ app
■ Controler■ Model■ View■ weboot
● css● js
○ lib■ Cake
○ plugins○ vendors
Ficheros y carpetas
● ROOT○ app
■ Controler■ Model■ View■ weboot
● css● js
○ lib■ Cake
○ plugins○ vendors
La estructura es una "convención" - Se puede mover fácilmente
Bake - un generador de todo [andy@work:~/www/apps/cakephp(2.0)]$ Console/cake bake ---------------------------------------------------------------Interactive Bake Shell---------------------------------------------------------------[D]atabase Configuration[M]odel[V]iew[C]ontroller[P]roject[F]ixture[T]est case[Q]uitWhat would you like to Bake? (D/M/V/C/P/F/T/Q) >
Primeros pasos: Prototipo
Como hacer el blog-tutorial en 15 segundos 1. Cargar sql en BBDD2. Generar controlador3. Ver resultado
1) SQL /* First, create our posts table: */CREATE TABLE posts ( id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY, title VARCHAR(50), body TEXT, created DATETIME DEFAULT NULL, modified DATETIME DEFAULT NULL); /* Then insert some posts for testing: */INSERT INTO posts (title,body,created) VALUES ('The title', 'This is the post body.', NOW());INSERT INTO posts (title,body,created) VALUES ('A title once again', 'And the post body follows.', NOW());INSERT INTO posts (title,body,created) VALUES ('Title strikes back', 'This is really exciting! Not.', NOW());
2) Generar Controllador [andy@work:~/www/apps/cakephp(2.0)]$ Console/cake bake Controller PostsWelcome to CakePHP v2.0.4 Console---------------------------------------------------------------App : cakephpPath: /home/andy/www/apps/cakephp/--------------------------------------------------------------- Baking controller class for Posts... Creating file /home/andy/www/apps/cakephp/Controller/PostsController.phpWrote `/home/andy/www/apps/cakephp/Controller/PostsController.php`Bake is detecting possible fixtures... Baking test case for Posts Controller ... Creating file /home/andy/www/apps/cakephp/Test/Case/Controller/PostsControllerTest.phpWrote `/home/andy/www/apps/cakephp/Test/Case/Controller/PostsControllerTest.php`
3) Ver Resultados
Un Controlador de Scaffolding <?php// Controller/PostsController.phpApp::uses('AppController', 'Controller');/** * Posts Controller * */class PostsController extends AppController { /** * Scaffold * * @var mixed */
public $scaffold; }
Puntos de interés
● Definir BBDD -> generar código● Si no existe un modelo - Cake usará un
modelo genérico● Es todo dinámico - no hay código para
modificar● Útil mientras el diseño de la BBDD no esté
definido
¿Cambios en la BBDD?
ALTER TABLE postsADD COLUMN published TINYINT(1) DEFAULT 0 AFTER body;
Las vistas se adaptan
Siguiente Fase: Bake MVC
Como hacer el blog-tutorial en 15 segundos. Otra vez. 1. Cargar sql en BBDD2. Generar MVC3. Ver resultados
2) Generar MVC [andy@work:~/www/apps/cakephp(2.0)]$ Console/cake bake all Post -q Baking model class for Post...Baking controller class for Posts...Baking test case for Posts Controller ...Baking `index` view file...Baking `view` view file...Baking `add` view file...Baking `edit` view file... Bake All complete
3) Ver Resultados
Diferencias con Scaffolding
Ahora hay: Controller/PostsController.phpModel/Post.phpTest/Case/Controller/PostsControllerTest.phpTest/Fixture/PostFixture.phpView/Posts/add.ctpView/Posts/edit.ctpView/Posts/index.ctpView/Posts/view.ctp
No es dinámico <?php// Controller/PostsController.phpApp::uses('AppController', 'Controller');/** * Posts Controller */class PostsController extends AppController { /** * index method */
public function index() {$this->Post->recursive = 0;$this->set('posts', $this->paginate());
} ...
Contiene ejemplos de uso <?php // View/Posts/edit.ctp ?><div class="posts form"><?php echo $this->Form->create('Post');?> <fieldset> <legend><?php echo __('Edit Post'); ?></legend> <?php echo $this->Form->input('id'); echo $this->Form->input('title'); echo $this->Form->input('body'); echo $this->Form->input('published'); ?> </fieldset><?php echo $this->Form->end(__('Submit'));?></div>...
Se puede hacer aun más sencillo
<?php // View/Posts/edit.ctp ?><div class="posts form"> <?php echo $this->Form->create(); echo $this->Form->inputs(); echo $this->Form->end(); ?></div>
Puntos de interés
● Cuidado con bake en modo no-interactivo, sobrescribe ficheros sin confirmar
● Scaffolding y el código de bake son visualmente iguales
● Usa Scaffolding si es útil para ti - o salta directamente a código que puedas tocar.
● Pero usa bake - ahorra mucho tiempo
Modelos - clases importantes
● "Fat Models, Skinny Controllers" es un dicho al que hay que hacer caso
● Es mejor llena los modelos con logica, no los controlladores
● Ejemplo - validación
Sin validación - GIGO
La razón - un modelo flaco
<?php// Model/Post.phpApp::uses('AppModel', 'Model');/** * Post Model * */class Post extends AppModel {}
Añadir validación (con Bake) <?phpApp::uses('AppModel', 'Model');class Post extends AppModel { public $displayField = 'title'; public $validate = array( 'title' => array( 'notempty' => array( 'rule' => array('notempty'), 'message' => 'Escribe un titulo, por favor' ), 'minlength' => array( 'rule' => array('minlength', 10), 'message' => 'Un poquito mas...' ), ...
Resultados con validación
Puntos de interés
● Las vistas (el ayudante formulario) conocen automáticamente las reglas de validación
● Hay muchas reglas de validación en el core● Es fácil escribir tus proprias reglas de
validación● Las reglas se puede desactivar o modificar
Resumen de bake
● Se usa para generar projectos, ficheros/clases o todo a la vez
● Interactivo o no● Dinámico (Scaffolding) o no● Las plantillas de cada clase se puede
modificar● Detecta relaciones en la BBDD● El código se adapta a las relaciones● No es obligotario usarlo
Explorando en mas detalle
● Mensajes de error útiles
Ejemplo mensaje de error
Explorando en mas detalle
● Mensajes de error útiles● Debug Kit - un gran ayuda
Debug Kit - installado
Debug Kit - Session data
Debug Kit - Query Log
Debug Kit - Timer
26 (ms)
Explorando en mas detalle
● Mensajes de error útiles● Debug Kit - un gran ayuda● Otras comandos de la consola
La consola
Explorando en mas detalle
● Mensajes de error útiles● Debug Kit - un gran ayuda● Otras comandos de la consola● Projectos útiles/ejemplos
Proyectos interesantes
● http://croogo.org- Blog/CMS● http://my.candycane.jp - Issue tracker● http://cakepackages.com - Plugin index● Mark Story Asset Compress
Explorando en más detalle
● Mensajes de error útiles● Debug Kit - un gran ayuda● Otras comandos de la consola● Projectos utiles/ejemplos● Para leer: CakePHP 1.3 Application
Cookbook - Mariano Iglesias 2011
¿Preguntas?http://slideshare.net/AD7six/intro-a-cakephp