1 00:00:01,199 --> 00:00:06,059 Vamos a empezar a ver cómo hacer un proyecto que utilice Doctrine, ¿de acuerdo? 2 00:00:06,219 --> 00:00:11,519 Entonces vamos a seguir un poco el manual que tiene el propio proyecto Doctrine. 3 00:00:12,259 --> 00:00:16,359 Vamos a ir a su comienzo y vamos a ver qué nos hace falta. 4 00:00:17,120 --> 00:00:21,379 Lo primero que nos va a hacer falta es establecer el proyecto. 5 00:00:21,820 --> 00:00:26,000 Para ello, lo primero que hacemos es crear una carpeta vacía. 6 00:00:26,239 --> 00:00:27,960 Vamos a crearla aquí mismo. 7 00:00:27,960 --> 00:00:36,359 Te voy a crear una carpeta vacía a la que voy a llamar Ejemplo Doctrine 8 00:00:36,359 --> 00:00:40,469 Y en ella de momento no tengo nada 9 00:00:40,469 --> 00:00:43,710 Voy a ir en el editor, me voy a meter en esta carpeta 10 00:00:43,710 --> 00:00:46,450 Voy a abrir esta carpeta para trabajar con ella 11 00:00:46,450 --> 00:00:49,289 Y no estar por ahí buscando la información 12 00:00:49,289 --> 00:00:51,950 Vamos a ir a ella, está en este directorio 13 00:00:51,950 --> 00:00:53,170 Y aquí 14 00:00:53,170 --> 00:00:57,210 Bien, selecciono esta carpeta y ahora se me pone a trabajar aquí 15 00:00:57,210 --> 00:01:01,869 Bien, estando aquí, cierro esto para que no nos incordie 16 00:01:01,869 --> 00:01:05,069 Lo que voy a hacer es lo que nos dice el manual 17 00:01:05,069 --> 00:01:06,349 Ya esto también lo quito 18 00:01:06,349 --> 00:01:08,170 Lo que nos dice el manual 19 00:01:08,170 --> 00:01:12,430 El manual nos dice que creemos un ficherito que se llame composer.json 20 00:01:12,430 --> 00:01:15,170 Con esta información que tenemos aquí 21 00:01:15,170 --> 00:01:21,670 Entonces vamos a crear aquí un ficherito que se llame composer.json 22 00:01:21,670 --> 00:01:24,629 Con esta información 23 00:01:24,629 --> 00:01:44,049 Esta información lo que nos dice es que va a utilizar los trines ORM, un tipo de anotaciones que no utilizaremos habitualmente pero que es Symfony Jam, la actualizaremos en Symfony ahora y una autocarga de lo que esté en SRC. Ya veremos qué es lo que va a venir en SRC posteriormente. Lo guardo y ya hemos hecho la primera parte. 24 00:01:44,049 --> 00:01:52,750 Ahora, tenemos que posicionarnos en ese directorio y decir Composer Install y va a instalar todo esto que requerimos. 25 00:01:53,409 --> 00:02:02,290 Entonces, pues vamos a abrir una terminal y como estamos ya en el directorio, pues le decimos Composer Install. 26 00:02:03,269 --> 00:02:07,469 Bueno, ahora tarda un poquito, va a instalar todos los componentes que le hagan falta 27 00:02:07,469 --> 00:02:16,349 y mientras que los instala podemos seguir observando cuestiones que nos van a hacer falta. 28 00:02:16,610 --> 00:02:21,550 Esto va a crear una estructura a partir del directorio que va a generar todo esto. 29 00:02:22,330 --> 00:02:29,909 ¿Cuál es nuestra idea? Pues que convertir una serie de clases en entidades para Doctrine. 30 00:02:30,409 --> 00:02:34,129 Hay toda una serie de ficheritos que vemos aquí que hay que generar. 31 00:02:34,590 --> 00:02:39,050 Porque lo que queremos de acto de este fichero generar es el gestor de entidades. 32 00:02:39,050 --> 00:03:07,150 Este gestor es el que nos va a servir. Si analizamos un poco la información vemos que arrancamos unos espacios de nombres, los usamos, arrancamos un ficherito que se va a instalar ahora, después ponemos el modo de desarrollo, establecemos que las anotaciones, la configuración de anotaciones lo vamos a hacer dentro de ese directorio SRC y que vamos a utilizar SQLite como nuestro gestor de base de datos. 33 00:03:07,150 --> 00:03:10,409 y este fichero va a ser donde guardemos la información. 34 00:03:11,330 --> 00:03:14,610 Bueno, podemos generar este fichero que se llama bootstrap.php 35 00:03:14,610 --> 00:03:19,590 en lo que está haciendo el otro, vamos a generarlo, vamos, en lo que está instalando 36 00:03:19,590 --> 00:03:23,069 ya ha acabado la instalación, ¿vale? Pues vamos a generar aquí 37 00:03:23,069 --> 00:03:28,590 este ficherito, bootstrap.php 38 00:03:28,590 --> 00:03:33,430 y en este fichero vamos a copiar justo esta 39 00:03:33,430 --> 00:03:38,349 información. Si no tenemos ningún interés en cambiar nada, pues ya vemos que aquí está 40 00:03:38,349 --> 00:03:43,430 Vendor Autolog y que esto ya se ha generado, con lo cual eso nos vale. Vamos a cerrar esta 41 00:03:44,009 --> 00:03:53,090 ventanita y ya tenemos este fichero generado. ¿Cuál es nuestro siguiente paso? Pues nuestro 42 00:03:53,090 --> 00:04:01,389 siguiente paso es generar la estructura de base de datos para que después vayamos creando 43 00:04:01,389 --> 00:04:06,129 nuestras entidades en formato de base de datos. Con lo cual nos hace falta crear este ficherito 44 00:04:06,129 --> 00:04:16,250 que se llama click-config.php con este contenido. Con lo cual lo vamos a generar, vamos a generar 45 00:04:16,250 --> 00:04:28,350 el click-config.php con ese contenido. Una vez que tenemos esto lo guardamos y nos dice 46 00:04:28,350 --> 00:04:31,730 que tenemos que ejecutar esta creación de este esquema 47 00:04:31,730 --> 00:04:35,889 vale, pues vamos a crear esa generación 48 00:04:35,889 --> 00:04:40,269 y entonces vemos aquí que es vendor, dentro de vendor 49 00:04:40,269 --> 00:04:44,290 hay un directorio que es bin y dentro de esto está doctrina 50 00:04:44,290 --> 00:04:48,230 y hay que poner ORM 51 00:04:48,230 --> 00:04:52,069 esquema tool 52 00:04:52,069 --> 00:04:55,610 create, vale, le damos 53 00:04:55,610 --> 00:05:00,670 y efectivamente nos dice que hay algo ahí que no está bien. 54 00:05:01,750 --> 00:05:08,870 Posiblemente nos esté hablando algo de que no existe el directorio ESRC, ¿de acuerdo? 55 00:05:09,649 --> 00:05:16,769 Entonces yo voy a crear ese directorio, a ver si es que al no existir, pues no me permite. 56 00:05:17,970 --> 00:05:23,050 No me permite trabajar. Vamos a ver si ahora lo generamos y efectivamente era eso. 57 00:05:23,050 --> 00:05:25,610 porque ahora dice que no hay ninguna clase 58 00:05:25,610 --> 00:05:29,490 perfecto, es verdad que este src lo acabamos de crear y no tiene ninguna clase 59 00:05:29,490 --> 00:05:33,050 pero ya ha permitido aquí montar 60 00:05:33,050 --> 00:05:34,709 con la estructura que le haga falta 61 00:05:34,709 --> 00:05:36,930 vamos a entrar en el src y vemos que no hay nada 62 00:05:36,930 --> 00:05:40,689 pero bueno, ya tenemos eso preparado 63 00:05:40,689 --> 00:05:43,850 ya veremos que hay más métodos de post para crear y actualizar 64 00:05:43,850 --> 00:05:46,269 vamos a crear nuestra primera clase 65 00:05:46,269 --> 00:05:48,550 nuestra primera clase es Product 66 00:05:48,550 --> 00:05:51,089 y la tenemos que crear aquí en el src 67 00:05:51,089 --> 00:05:53,050 con lo cual vamos a decir que no hago archivo 68 00:05:53,050 --> 00:05:54,769 y la vamos a llamar 69 00:05:54,769 --> 00:05:57,449 product.php 70 00:05:57,449 --> 00:05:58,509 muy bien 71 00:05:58,509 --> 00:06:01,029 vuelvo a cerrar esto 72 00:06:01,029 --> 00:06:02,129 para que no nos incordie 73 00:06:02,129 --> 00:06:04,050 y voy a copiarme este contenido 74 00:06:04,050 --> 00:06:07,149 este contenido es el que 75 00:06:07,149 --> 00:06:09,170 tendríamos en cualquier clase 76 00:06:09,170 --> 00:06:11,009 normal que programáramos 77 00:06:11,009 --> 00:06:12,250 con sus comentarios 78 00:06:12,250 --> 00:06:14,589 esta es una clase muy simple que tiene un id 79 00:06:14,589 --> 00:06:17,050 y un nombre, surdetes 80 00:06:17,050 --> 00:06:18,269 y su set 81 00:06:18,269 --> 00:06:19,970 y se acabó, no tiene más 82 00:06:19,970 --> 00:06:28,850 Nos hace falta utilizar una anotación para que después el ORM sepa qué significa cada uno de estos campos 83 00:06:28,850 --> 00:06:30,149 Con qué se identifica 84 00:06:30,149 --> 00:06:39,829 Entonces, pues bueno, nosotros lo que vamos a decir es, en primer lugar, que este producto PHP 85 00:06:39,829 --> 00:06:49,509 Este producto PHP es una entidad que está relacionada con la tabla products 86 00:06:49,509 --> 00:06:55,209 Vale, aquí estamos viendo además que hemos utilizado un espacio de nombres que a partir de ahora llamaremos ORM 87 00:06:55,209 --> 00:07:01,389 Y fíjense que aquí aparece siempre arroba ORM barra lo que sea 88 00:07:01,389 --> 00:07:07,189 Esto va a ser lo que indica que son unas anotaciones de esta clase 89 00:07:07,189 --> 00:07:11,389 Ahora vamos a identificar cuál es cada uno de los atributos 90 00:07:11,389 --> 00:07:14,069 Entonces vamos a ir al primero y este primero 91 00:07:14,069 --> 00:07:17,990 Borramos estos comentarios que eran propios de la documentación 92 00:07:17,990 --> 00:07:50,529 Bueno, he borrado tanto, tanto, que por aquí he perdido el protected ir, ya le tengo. Bueno, continúo, ha habido una pequeña interrupción, pero continúo. Entonces, aquí lo que me está diciendo es que este campo va a ser el identificador, que es de tipo entero y que va a ser un valor generado, es decir, como he dicho en el lenguaje MySQL, autoincrement, ¿vale? 93 00:07:50,529 --> 00:08:20,509 Bien, vamos a ver este campo name como lo definimos, entonces seguramente no va a ser muy distinto a decirle algo así como que este campo va a ser de tipo string, ¿vale? Vamos a comprobarlo, vamos a comprobarlo con los apuntillos y efectivamente justo justo nos dice que es una columna de tipo string, perfecto, bueno, pues ya tenemos aquí generado este ficherito, ese recio. 94 00:08:20,529 --> 00:08:39,549 Con esto hemos contado sus características. Entonces lo que nos hace falta ahora, vamos a saltarnos todo esto, es actualizar nuestro esquema. Para esto utilizamos esta estructura de aquí. Vamos a copiarla para no complicarnos mucho la vida. 95 00:08:39,549 --> 00:08:42,470 este ficherito ya está grabado 96 00:08:42,470 --> 00:08:44,789 con lo cual lo que vamos a hacer aquí es ejecutar 97 00:08:44,789 --> 00:08:45,970 esa instrucción 98 00:08:45,970 --> 00:08:47,330 ponemos aquí 99 00:08:47,330 --> 00:08:50,450 y efectivamente nos dice 100 00:08:50,450 --> 00:08:51,769 que va a hacer un 101 00:08:51,769 --> 00:08:54,950 crear tabla con esas características 102 00:08:54,950 --> 00:08:56,830 y que lo ejecuta 103 00:08:57,590 --> 00:08:58,690 satisfactoriamente 104 00:08:58,690 --> 00:09:00,549 entonces ya hemos visto aquí 105 00:09:00,549 --> 00:09:02,870 que se ha creado en db 106 00:09:02,870 --> 00:09:04,250 ese culite pues 107 00:09:04,250 --> 00:09:06,669 estará esta estructura creada 108 00:09:06,669 --> 00:09:08,389 vamos a comprobarlo de todas maneras 109 00:09:08,389 --> 00:09:28,620 Como imagino que tenemos aquí el programa para verlo. Vamos a ver si es verdad. Vamos a ver el esquema que tenemos. Y efectivamente ha creado esta tabla que seguramente esta tabla no tenga ningún producto, lógicamente. 110 00:09:28,620 --> 00:09:47,059 ¿De acuerdo? Muy bien. Pues ya tenemos generada la tabla. Ahora es el momento de empezar a consultar esta tabla. Entonces, vamos a hacer un primer programa. Los programas los vamos a hacer aquí directamente en este directorio, en el directorio del proyecto. 111 00:09:47,059 --> 00:10:14,389 Entonces, bueno, pues vamos a empezar a ver cómo crear un producto. Vamos a copiar esto de aquí, vamos a hacer un programita que se llame añadir o crear, crear, vamos a poner producto PHP, copiamos esto y vamos a entenderlo primero. 112 00:10:14,389 --> 00:10:32,110 Lo que nos dice lo primero es que requiere bootstrap.php, que ya lo tenemos aquí, que vamos a leer desde la línea de comandos el primer argumento que va a ser el nuevo nombre de producto y vamos a utilizar una clase producto en el cual ponemos este nombre. 113 00:10:32,110 --> 00:10:49,289 Muy bien, ahora como el EntityManager lo tiene Bootstrap, recordamos como es Bootstrap que lo último que devuelve es un EntityManager, pues entonces lo que vamos a hacer es llamarle y que nos haga persistir este objeto y ya lo actualizamos. 114 00:10:49,289 --> 00:10:54,809 Cuando se cree el producto, pues efectivamente va a darle una ID a este producto 115 00:10:54,809 --> 00:10:56,909 Una ID nueva, ¿vale? 116 00:10:57,009 --> 00:10:59,250 Para eso ya le ha puesto su autoincremento 117 00:10:59,250 --> 00:11:03,110 Voy a guardar esto y vamos a ejecutar esta aplicación 118 00:11:03,110 --> 00:11:07,649 Voy a decir php, crear producto php 119 00:11:07,649 --> 00:11:11,309 Y por ejemplo, pues vamos a decir botella 120 00:11:11,309 --> 00:11:13,649 Vamos a crear el producto botella 121 00:11:13,649 --> 00:11:18,909 Muy bien, nos ha dicho que ha creado el producto ID 1, que es botella 122 00:11:18,909 --> 00:11:40,590 Antes de ir a hacer un programita para leer lo que hay dentro, vamos a ir a crear otro objeto, vaso, ¿vale? Y vamos a ver con ese culite, vamos a ver qué valores nos ha introducido a estos dos campos. 123 00:11:40,590 --> 00:11:43,789 id inane from products 124 00:11:43,789 --> 00:11:50,000 bueno, pues efectivamente ha dado una botella, dos vasos y así respectivamente 125 00:11:50,000 --> 00:11:52,980 perfecto, o sea que la información está perfectamente guardada 126 00:11:52,980 --> 00:11:56,759 entonces lo que vamos a hacer ahora es un programita, el siguiente programita 127 00:11:56,759 --> 00:12:01,100 que le llamaremos, pues, listar 128 00:12:01,100 --> 00:12:05,340 productos php 129 00:12:05,340 --> 00:12:10,100 lo que vamos a hacer en este programita, que lo tendremos por aquí seguramente 130 00:12:10,100 --> 00:12:13,179 algo así, es ver todos los productos 131 00:12:13,179 --> 00:12:18,080 que hemos almacenado, entonces para ello vamos a obtener 132 00:12:18,080 --> 00:12:21,480 la información del repositorio de productos y vamos a llamar 133 00:12:21,480 --> 00:12:26,039 a un método que es findAll, devuélveme todos los 134 00:12:26,039 --> 00:12:29,720 objetos que haya, entonces después para cada uno 135 00:12:29,720 --> 00:12:33,960 de ellos vamos a mostrar el nombre 136 00:12:33,960 --> 00:12:36,059 vamos a añadir aquí que también nos muestre 137 00:12:36,059 --> 00:12:37,820 que también nos muestre 138 00:12:37,820 --> 00:12:41,580 el ID 139 00:12:41,580 --> 00:12:43,240 ¿vale? 140 00:12:44,500 --> 00:12:46,259 muy bien, pues vamos a 141 00:12:46,259 --> 00:12:48,139 ya guardamos esta información 142 00:12:48,139 --> 00:12:50,419 y vamos a listar 143 00:12:50,419 --> 00:12:53,139 a listar todos los productos 144 00:12:53,139 --> 00:12:55,120 y efectivamente pues nos aparece 145 00:12:55,120 --> 00:12:57,559 uno vaso, una botella, dos vasos 146 00:12:57,559 --> 00:13:00,480 justamente lo que acabamos de programar 147 00:13:00,480 --> 00:13:03,019 ya ven que los métodos son muy fáciles 148 00:13:03,019 --> 00:13:05,799 trabajamos con el repositorio correspondiente al producto 149 00:13:05,799 --> 00:13:07,539 y sobre ese repositorio 150 00:13:07,539 --> 00:13:10,179 aplicamos el método findAll 151 00:13:10,179 --> 00:13:12,659 busca todos los que hay 152 00:13:12,659 --> 00:13:16,779 vamos a hacer un programita que busque un único producto 153 00:13:16,779 --> 00:13:19,580 entonces para que busque un único producto 154 00:13:19,580 --> 00:13:25,000 pues vamos a crear un programita que busque un único producto 155 00:13:25,000 --> 00:13:29,740 y vamos a ver cómo lo haríamos 156 00:13:29,740 --> 00:13:32,360 nos podemos venir aquí directamente 157 00:13:32,360 --> 00:13:34,340 seguramente es este de aquí 158 00:13:34,340 --> 00:13:44,480 y en este caso nos pide que le digamos el ID, el identificador, la clave del producto 159 00:13:44,480 --> 00:13:52,059 y él, llamando directamente al gestor de entidades, al entity manager, con find, 160 00:13:52,779 --> 00:13:55,320 le decimos que busque un producto, es identificado. 161 00:13:55,320 --> 00:14:01,039 Puede ocurrir que esto devuelva null, con lo cual no ha encontrado nada y no saldríamos 162 00:14:01,039 --> 00:14:03,960 o puede ser que lo haya encontrado y lo muestre. 163 00:14:04,340 --> 00:14:20,389 Vamos a poner aquí lo mismo de antes, pues me parece que queda bastante mejor ver las dos informaciones e ir volviendo y vamos a ejecutar este programa. 164 00:14:20,669 --> 00:14:32,950 Entonces, php, buscar, vamos a buscar el 1 y efectivamente nos dice 1 botella, vamos a buscar el 2, 2 vaso y vamos a buscar el 3 y nos dice que no ha encontrado ningún producto. 165 00:14:32,950 --> 00:14:36,629 con lo cual esto está funcionando correctamente 166 00:14:36,629 --> 00:14:43,919 lo siguiente que vamos a hacer en nuestro cruz particular 167 00:14:43,919 --> 00:14:45,559 es actualizar un producto 168 00:14:45,559 --> 00:14:49,139 entonces vamos a crear un programita que se llame 169 00:14:49,139 --> 00:14:51,759 actualizar producto 170 00:14:51,759 --> 00:14:57,740 y seguramente será lo que tengamos 171 00:14:57,740 --> 00:15:01,259 un poco más abajo, efectivamente 172 00:15:01,259 --> 00:15:04,120 aquí tenemos un update producto, vamos a ver cómo se hace 173 00:15:04,120 --> 00:15:08,159 copiamos aquí el fichero 174 00:15:08,159 --> 00:15:10,879 y nos va a pedir dos argumentos en esta ocasión 175 00:15:10,879 --> 00:15:12,740 nos va a pedir el identificador del producto 176 00:15:12,740 --> 00:15:13,740 y el nuevo nombre 177 00:15:13,740 --> 00:15:16,000 encontramos el producto 178 00:15:16,000 --> 00:15:20,080 si el producto que devuelve es algo 179 00:15:20,080 --> 00:15:22,059 pues haremos esto y si es nulo 180 00:15:22,059 --> 00:15:23,179 pues dirá que no existe 181 00:15:23,179 --> 00:15:26,279 si el producto que nos devuelve existe 182 00:15:26,279 --> 00:15:27,980 pues entonces lo que vamos a hacer es cambiar 183 00:15:27,980 --> 00:15:29,659 el nombre y 184 00:15:29,659 --> 00:15:32,000 simplemente flush, ni siquiera hace falta persis 185 00:15:32,000 --> 00:15:33,840 simplemente ya que lo grabe 186 00:15:33,840 --> 00:15:36,080 ¿de acuerdo? tan simple como eso 187 00:15:36,080 --> 00:15:38,220 vamos a ver si esto 188 00:15:38,220 --> 00:15:39,100 nos funciona 189 00:15:39,100 --> 00:15:52,600 Entonces, pues, php, actualizar producto, por ejemplo, el 1, que es la botella, vamos a poner cualquier cosa, teclado, un teclado, ¿vale? 190 00:15:52,600 --> 00:16:07,500 Y entonces, pues, no nos ha dado ningún error. Imaginen que voy a poner que el 5 es, pues, yo qué sé, un ratón. Pues entonces nos dice que el producto 5 no existe. 191 00:16:07,500 --> 00:16:13,779 Podríamos comprobar perfectamente que hemos cambiado el 1 de botella que tenemos aquí a teclado 192 00:16:13,779 --> 00:16:17,919 Pues listando directamente todos los productos 193 00:16:17,919 --> 00:16:21,639 Y efectivamente vemos que el 1 es teclado y el 2 vaso 194 00:16:21,639 --> 00:16:25,919 Así que parece que esto lo hemos conseguido perfectamente 195 00:16:25,919 --> 00:16:31,009 Para finalizar el cruz, esta primera parte del cruz 196 00:16:31,009 --> 00:16:33,669 Lo que vamos a hacer es borrar un elemento 197 00:16:33,669 --> 00:16:39,049 No viene ningún ejemplo hecho en esa página que estamos siguiendo 198 00:16:39,049 --> 00:16:49,529 pero vamos a aprovecharnos de que teníamos el buscar un producto y vamos a crear un ficherito que se llame eliminar producto ph. 199 00:16:51,330 --> 00:16:53,830 Una vez que lo tenemos aquí creado, vamos a ir a él. 200 00:16:54,009 --> 00:17:00,169 Ya estamos aquí, voy a quitar aquí, voy a poner aquí un comentario para que sepa que es otra cosa 201 00:17:00,169 --> 00:17:04,029 y vamos a cerrar esto para que lo veamos. 202 00:17:04,029 --> 00:17:14,250 Aquí nos pide el identificador, lo buscamos el producto, si no hay pues no hay ningún problema, pero lo que sí podemos querer hacer es eliminarlo. 203 00:17:14,470 --> 00:17:26,829 Para eliminarlo iremos al entityManager y llamaremos al método remove, con lo cual le pasamos el producto que queremos borrar y ya está. 204 00:17:26,829 --> 00:17:43,769 En este caso, pues ya estaría borrado. ¿Qué nos faltaba? Siempre nos falta poner el entity manager flush para que nos lo actualice la información. Muy bien, vamos a probarlo. 205 00:17:43,769 --> 00:17:46,630 entonces vemos que productos tenemos 206 00:17:46,630 --> 00:17:49,049 listar productos y por ejemplo vamos a eliminar 207 00:17:49,049 --> 00:17:51,349 el producto 1 208 00:17:51,349 --> 00:17:54,789 eliminar producto el 1 209 00:17:54,789 --> 00:17:56,950 bueno, no da ningún error 210 00:17:56,950 --> 00:17:59,470 vamos a listarlos y efectivamente 211 00:17:59,470 --> 00:18:01,269 ha desaparecido