¿Cómo se estructura un proyecto en PHP con Composer?
Para emprender un proyecto en PHP con seguridad y profesionalismo, la estructura del proyecto es una piedra angular. Composer se convierte aquí en nuestro aliado, facilitando la incorporación de componentes de terceros y asegurando una gestión eficaz de las dependencias.
El proceso comienza con la organización adecuada de carpetas y archivos. Se destaca la carpeta "vendor", crucial para los archivos de Composer y PHPUnit. La ejecución correcta de comandos a través de los directorios de PHPUnit asegura que tengamos un entorno de pruebas robusto, fundamental para trabajar sobre proyectos reales y no sobre archivos sueltos como "index.php".
¿Por qué es esencial crear tests en PHP?
La creación de tests en PHP no se trata solo de complicarnos la vida con más código; es, de hecho, una práctica vital para asegurar la calidad y funcionalidad del software a largo plazo. Los tests permiten validar que las funcionalidades, como la verificación de correos electrónicos a través de nuestro método "email" en la clase de validación, realmente cumplen con los estándares deseados incluso antes de ser utilizadas en un entorno de producción.
¿Cómo nombrar y estructurar los tests?
El estándar de PHP exige que los archivos y métodos de test lleven la palabra "test" al final o al inicio de su nombre, respectivamente:
Los archivos terminan en "Test": ValidacionTest.php.
Los métodos comienzan con "test": testEmailValidacion().
Esto asegura que PHPUnit reconozca los tests y los ejecute correctamente.
¿Cuál es el flujo para utilizar estos tests?
Una vez que hemos escrito y ejecutado nuestros tests con éxito, podemos integrar nuestros componentes en un archivo index sin preocuparse de errores imprevistos. La estructura propuesta asegura que el método funciona de manera aislada, y los tests nos garantizan que aceptará correos electrónicos válidos y rechazará los incorrectos.
require'vendor/autoload.php';// Cargamos el autoloader de Composer// Validar email con la clase Validacion$emailValido=(newValidacion)->email("ejemplo@correo.com");echo$emailValido?'Email válido':'Email inválido';
¿Cómo extender las pruebas para otras validaciones?
Además del correo electrónico, el sistema necesita validar otros datos cruciales como URLs o contraseñas. La metodología es similar: se crea un método de test, se verifica el comportamiento esperado y posteriormente se desarrolla el método necesario en la clase de validación para que pase el test.
Ejemplo de validación de URLs
Aquí mostramos cómo se implementa una validación para URLs, utilizando métodos propios de PHP, como FILTER_VALIDATE_URL.
// Método en Validacion para validar URLpublicfunctionurl($url){returnfilter_var($url,FILTER_VALIDATE_URL)!==false;}// Test para validar una URLpublicfunctiontestValidarURL(){$validacion=newValidacion();$this->assertTrue($validacion->url("https://platzi.com"));$this->assertFalse($validacion->url("no es una url válida"));}
Al implementar estos tests, aumentamos la fiabilidad de nuestro sistema. Cada método y funcionalidad queda respaldado por pruebas automatizadas que nos informan de errores antes siquiera de cargar la aplicación en un navegador.
¿Cómo asegurarte de que tu sistema sigue funcionando al añadir nuevas funcionalidades?
Al trabajar en proyectos grandes, como lo sería Platzi.com, es crucial no probar cada nueva funcionalidad en un navegador porque podría quebrar otras partes del sistema inadvertidamente. En vez, al integrar tests unitarios, garantizas que el resto del sistema sigue operativo. Este proceso automatiza la validación, ahorrando tiempo y reduciendo riesgos.
Al implementar prácticas de testeo desde el inicio, se fortalece la estructura del proyecto y permite la expansión con confianza. No olvides, te animo a aceptar el reto de validar una contraseña utilizando expresiones regulares, y compartir tu progreso en los comentarios. ¡Sigue aprendiendo y te veo en la próxima clase!
De hecho prácticamente lo que hace PHP Unit es crear pequeños casos de pruebas y dejarlos programados para testearlos siempre, así puedes usar tus clases sin preocupación, literal te está ahorrando el trabajo de ir a navegador y poner los datos de prueba tu mismo para empezar a depurar jaja
Agregando un poco a esto, es valioso para que cada vez que agreguemos nuevos desarrollos nos aseguremos que no hemos dañado nada de lo anteriormente construido.
Estoy siguiendo la ruta de aprendizaje "Desarrollo Web Backend con PHP" todo iba bien hasta el curso de Git y GitHub, pero a partir de ahí esta ruta no es nada amigable, tanto el curso de "introducción a PHP con composer" y este curso (Manejo de datos en PHP) hacen que el proceso de aprendizaje sea más complicado que estudiar con videos en youtube con distintos tutoriales. Creo que la idea de platzi es todo lo contrario, no? Crear rutas de aprendizaje donde se vaya de menos a más para que de esta forma se optimice el tiempo y el aprendizaje sea más fácil, pero por lo menos para mí, que no conozco nada de PHP se me hace super complicado entender al profesor; o por lo menos los dos cursos mencionados anteriormente no he logrado entender nada.
Mencionando esto, aquí mi pregunta:
Realmente esta ruta está diseñada para personas que no tienen conocimientos en PHP y quieren aprender ?
Hola
Ciertamente aprender programación no es nada sencillo y requiere de mucho estudio y práctica. La ruta de PHP no la conozco a fondo, pero no está tan desarrollada como otras escuelas.
Las bases de programación son en esencia las mismas para los diferentes lenguajes. Hay cursos excelentes que te enseñan estas bases utilizando otros lenguajes que después podrás implementar en PHP.
Programar es más práctica que teoría. Tienes que complementar con ejercicios, otras rutas, y documentación oficial para dominarlo.
En el caso de la ruta de php, el profesor solo explica nuevas cosas, pero no da ejercicios para que practiques. Si quieres aprender, tienes que tomar las cosas que el explica, complementar con la documentación oficial (https://www.php.net/manual/es/langref.php) y hacer experimentos con las funciones y métodos hasta que lo entiendas (aunque tome más tiempo).
Luego, tienes que practicar. Él en la introducción con composer recomienda hacer estos desafíos para agarrarle el hilo al lenguaje: https://platzi.com/blog/como-aprender-a-programar/
También puedes combinarlo con los proyectos de otras escuelas para complementar. Por ejemplo, si trabajas con php, podrías intentar hacer plugins o temas para wordpress. Esos pueden ser proyectos personales interesantes.
Finalmente, recuerda que un backend también debe conocer algo del frontend. Estudia un poco sobre html / css / y JavaScript. Estoy seguro de que aprendiendo comprenderás mucho de lo que te encontrarás con php. Al fin y al cabo hay muchos lenguajes, pero la lógica es universal.
Mucho éxito en la ruta que sigas. ten paciencia, ve a un ritmo que te funcione, y nunca pares de aprender 💚
Reto cumplido!
La expresión regular /^(?=.\d)(?=.[\u0021-\u002b\u003c-\u0040])(?=.[A-Z])(?=.[a-z])\S{8,16}$/ significa:
La contraseña debe tener al entre 8 y 16 caracteres, al menos un dígito, al menos una minúscula y al menos una mayúscula. Puede tener otros símbolos.
Es importante resaltar que existen 2 tipos de filtros, uno de validación y otro de saneamiento como los podemos ver en https://www.php.net/manual/es/filter.filters.php
Gracias, muy buen aporte y documentación
Para Password lo que hice fue utilizar el método password_hash() y PASSWORD_BCRYPT. Quedando de la siguiente manera:
password_hash retorna un hash de una contraseña, por lo tanto la función de validación contraseña debería comprobar si la contraseña corresponde con el hash de '1234567'.
$hash='$2y$10$g6hTqydxZVtzhPfo7JxxTuaUb5mnOZlWz4vTzLGCEYxsiBggz9pQ6';// generado por password_hash('1234567', PASSWORD_BCRYPT);$check=password_verify('1234567',$hash);$this->assertTrue($check);
Cierto, se me paso eso. Gracias :)
La pedagogía de Italo y la paciencia con la que explica le da un plus enorme a sus cursos.
No solo transmite el conocimiento sino también la experiencia, eso ayuda mucho.
Segundo curso que llevo con él.
Validar un password con mínimo ocho caracteres, al menos una letra mayúscula, una letra minúscula, un número y un carácter especial:
Podemos crear un alias para no tener que escribir toda la ruta hacia el ejecutable de phpunit:
alias t="vendor/phpunit/phpunit/phpunit"
Gracias! xD
Si desean profundizar un poco más les deseo leer sobre TDD (Test Driven Development). Es una metodología que nos permite desarrollar en base a nuestras pruebas.
¿en que se diferencia el uso de filtros y el uso de preg_match?
Hola Jorge
Es una buena pregunta, sobre todo si vienes de versiones anteriores de PHP.
La función filter_var nos ayuda a filtrar una variable con muchas opciones distintas. PHP ha incluido varios filtros para ayudarnos a validar y sanear datos según estándares.
Por tanto ese return (bool) filter_var($value, FILTER_VALIDATE_EMAIL) revisará si el valor de $value cumple con la sintaxis de email RFC 822. Honestamente es mucho más práctico que usar preg_match y crear o buscar una expresión regular que valide emails (te aseguro que encontraras muchas expresiones regulares para esto, por lo que ¿cuál es la estándar?).
Dicho de otro modo, los filtros ya están construidos con las expresiones, patrones y condiciones necesarias para validar urls, números, booleanos, ip, direcciones mac, o también eliminar caracteres especiales, etiquetas... y sólo cambiando el nombre del filtro, ahorrando un montón de tiempo para que no tengas tú que construir estas validaciones
Puedes revisar la documentación de los tipos de filtros para ver todas las posibilidades.
Que saltos cuanticos tan feos da el profe...
Parare mi aprendizaje en este curso hasta aqui vengo en el futuro a retomarlo :(
x2. La verdad no me agrada como explica el curso. Dice oralmente crear la clase validacion.php y termine escribiendo validate.php. Incluso su traduccion de espaniol a inlges es erronea. ya que validacion = validation. validate =validar.
Ya me imagino que otros conceptos erroneos a de usar.
gracias
Nosotros aprendemos diferentes funciones y cosas propias de PHP, pero la manera de trabajar no es sobre un index.php; es sobre la estructura de un proyecto real apoyándose en composer y componentes de terceros.
Totalmente de acuerdo! Está bien aprender PHP desde lo básico, pero en la práctica real no se trabaja todo en un solo index.php. Composer y los paquetes de terceros ayudan muchísimo a organizar y reutilizar el código. Al final, lo importante es ir más allá del lenguaje y aplicar una buena estructura de proyecto. Buen punto el que mencionaste.
en caso de que sigas sin entender que estamos haciendo, te dejo el siguiente link
Vengo respetando la ruta de desarrollo de software y estos ultimos dos cursos se me estan haciendo del todo random... No les entiendo nada, el profe y talvez los de platzi piensan que tenemos el mismo conocimiento que ellos peor no es asi y eso es un error. Todos los demas cursos bien y talvez regrese a este cuando ya sienta que se lo necesario.
Se me voló la cabeza 🤯, antes de iniciar esta carrera de php hice un curso básico de php e hice un proyecto con programación estructurada, realmente me costo hacerlo y cree un código espagueti horrible pero viendo como funciona phpunit todo esto cambia, no puedo esperar Laravel.
ValidateTest.php
Creé un test para validar el password y pruebo lo siguiente:
En este caso, revisando la documentación de los FILTER_VALIDATE, vi que existe el FILTER_VALIDATE_REGEXP y se debe usar con un array de esa forma.
Por último, en mi index.php:
$VALIDATION_PASS=App\Validate::password('87289a');if($VALIDATION_PASS===true){ echo "Su contraseña es válida <br>";}else{ echo 'Su contraseña no cumple con los requisitos <br>';}