Practicar es muy importante, ya que te permitirá pulir tus habilidades de desarrollo y te animo a que realices el siguiente reto con todo lo que has aprendido.
Crea un ejemplo que ilustre la configuración de un post o artículo de un blog. Entendemos que este tipo de soluciones requieren un autor (quien crea el post) y el post (pieza de contenido creada por un autor). Este post tendrá categorías para segmentarlos y hacer un fácil filtrado.
¿Qué necesitas?
User: clase base para los autores.
Author: hereda de User y es quien creará a los post o artículos.
Post: clase protagonista, es quien servirá para dar vida al objetivo principal de un blog.
Category: clase que servirá para segmentar a nuestros artículos. Es un campo más de los artículos y permitirá por ejemplo que un artículo sea de PHP, Vue.js, JavaScript, etc.
No hay una única solución ni una solución correcta, el objetivo es pensar, practicar y entender poco a poco cómo funciona esta nueva forma de construir proyectos.
User.php
<?phpclassUser{# Code ...}
Author.php
<?phpclassAuthorextendsUser{# Code ...}
Post.php
<?phpclassPost{# Code ...}
Category.php
<?phpclassCategory{# Code ...}
Finalmente index.php.
Desarrolla todos estos archivos, pon en práctica lo aprendido.
Compárteme tus resultados en los comentarios y que más añadirías.
Si, de hecho este código tiene muuuuchas cosas que se pueden mejorar, como pasar los parámetros por el contructor, agregar cositas más chulas pero como práctica creo que está bien jaja
<?php
use PHPUnit\Framework\TestCase;use App\Author;use App\Category;use App\Post;classPostTestextendsTestCase{publicfunctiontest_post(){// Creamos un usuario $author =newAuthor();// Crear categoría $category =newCategory("PHP");// Crear post $post =newPost("Título","Contenido", $category);// Agregar post al autor $author->addPost($post);// Aserción o afirmación para comprobar que tenemos 1 post agregado $this->assertEquals(1, $author->countPosts());// Aserción o afirmación para comprobar que la categoría es una instancia de la clase Category $this->assertInstanceOf(Category::class, $post->getCategory()[0]);}}
index.php
<?php
require_once "vendor/autoload.php";use App\Author;use App\Post;use App\Category;// Crear un autor:$author =newAuthor();$author->setName("Carlos Betancourt");$author->setEmail("carlos@betancourt.com");$author->setPassword("mypassword");// Crear categorías:$categoryPHP =newCategory("PHP");$categoryJava =newCategory("Java");$categoryHTML =newCategory("HTML");// Crear tres post$postOne =newPost("Primer Post","Contenido del primer post.", $categoryPHP, $author);$postTwo =newPost("Segundo Post","Contenido del segundo post.", $categoryJava, $author);$postThree =newPost("Tercer Post","Contenido del tercer post.", $categoryHTML, $author);// Agregar otras categorías a cada post$postOne->setCategory($categoryJava);$postThree->setCategory($categoryJava);// Agregar posts al author$author->addPost($postOne);$author->addPost($postTwo);echo "<pre>";var_dump($author);
El reto esta genial, lo solucione a mi manera y conforme lo que llegue a aprender en los cursos que fue bastante. Reconozco que me falta mucho por mejorar y aprender. Les comparto mi repositorio con el reto y les prometo que volveré para resolver toda la deuda técnica que deje en el reto. Saludos.
Bien ahí. Solo recuerda que en la Programación Orientada a Objetos es importante el uso de getters y setters para manipular los atributos de una clase ;)
use PHPUnit\Framework\TestCase;use App\Post;use App\Comment;use App\User;use App\Author;use App\Category;classEjercicio18TestextendsTestCase{publicfunctiontest_user_and_author(){ $author =newAuthor('john.doe'); $this->assertEquals('john.doe', $author->name());}publicfunctiontest_add_categories(){ $category =newCategory('PHP Code'); $comment =newComment(); $comment->addCategory($category);// Las categorias deben asociarse a un slug basado en el texto original $this->assertEquals('php-code', $category->slug());}}
Tengo que decir que si me llevo sus dos horitas por que salieron muchos errores, y aunque implemente un poco de test no supe hacer algunos test pero espero en siguiente cursos aprender más.
<?php
include __DIR__ ."/vendor/autoload.php";use Blog\Author;use Blog\Category;use Blog\Post;// Primero creo las categorías// Categoría PHP$php_category =newCategory();$php_category->set_name("PHP");// Categoría VueJS$vue_category =newCategory();$vue_category->set_name("VueJS");// Ahora creo al autor$retaxmaster =newAuthor();$retaxmaster->set_name("Carlos","Gómez");// Ahora creo un post sobre PHP$php_functions_post =newPost();$php_functions_post->add_title("Post para hablar acerca de funciones en PHP");$php_functions_post->add_content("En este post hablaremos sobre cómo funcionan las funciones en PHP");$php_functions_post->add_category($php_category);// Ahora creo un post sobre VueJS$vue_app_post =newPost();$vue_app_post->add_title("Post sobre cómo crear una app con VueJS");$vue_app_post->add_content("En este post hablaremos sobre qué necesitamos para crear una app con VueJS");$vue_app_post->add_category($vue_category);// Ahora le asigno los posts al autor$retaxmaster->create_post($php_functions_post);$retaxmaster->create_post($vue_app_post);// Y por último listamos los posts$author_post = $retaxmaster->get_postst();foreach($author_post as $post){ echo "El usuario {$retaxmaster->get_full_name()} tiene el siguiente post: <br><br>"; echo $post->get_post(); echo "<br><br><br>";}?>
It works :D!
Excelente curso <3
Reto POO con PHP ✅
user.php
<?php
classUser{// Nombre completo del usuarioprotected $full_name;// Almacena todos los post creadosprotectedstatic $post_created =[];publicstatic $random =[];// Agrega el objeto post al array post_createdpublicfunctionagregarPost(Post $post){array_push(User::$post_created, $post);}// Muestra todos los array creadospublicstaticfunctionmostrarTodo(){ echo "<pre>";print_r(User::$post_created); echo "</pre>";}}?>
Author.php
<?php
classAuthorextendsUser{// Lo usamos como objeto para crear un postpublic $post;// Constructor que crea al Userpublicfunction__construct($full_name){ $this->full_name = $full_name;}publicfunctiongetFullName(){return $this->full_name;}}?>
Category.php
<?php
classCategory{// Será el arreglo que va a contener todas las categoríaspublicstatic $categorys =[];// Muestra todas las categorías creadaspublicstaticfunctionmostrar(){ echo "<pre>";print_r(Category::$categorys); echo "</pre>";}}?>
Post.php
<?php
include("Category.php");classPost{protected $date_create;// Fecha creadapublicfunction__construct(private string $full_name,protected $title,protected $comment,private string $category){// Establezco la fecha $this->date_create =date("d-n-Y");// paso a minuscula la categoría $category =strtolower($category);// Agrego la categoría al array categorysif(in_array($category,Category::$categorys)==false){array_push(Category::$categorys, $this->category);}// Se puede añadir desde aquí el post al arreglo de post_created, pero me dio flojera}publicfunctionshowPost(){?><!DOCTYPE html><html lang="es"><head><meta charset="UTF-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>MiPost</title><link rel="stylesheet" href="random.css"></head><body><section class="main-container"><div class="container"><div class="container-author"><p><?=$this->full_name?></p></div><div class="container-date"><!--<p>05-10-2022</p>--><p><?=$this->date_create?></p></div></div><div class="container"><div class="container-title"><p><?=$this->title?></p></div><div class="container-category"><p><?=$this->category?></p></div></div><div class="container container-content"><p><?=$this->comment?></p></div></section></body></html><?php
}}?>
index.php
<?php
include("User.php");include("Author.php");include("Post.php");// Primero creo al author quien es un usuario $Akeneth =newAuthor("Keneth Lopez Izaguirre");// objeto "Akeneth" de la clase "Author" $AMaria =newAuthor("Maria Angelica Del Sol");// objeto "AMaria" de la clase "Author" $APablo =newAuthor("Pablo Quispe Mamani");// objeto "APablo" de la clase "Author"// Creo el post// Creo el post con el atributo post $Akeneth->post =newPost( $Akeneth->getFullName(),"Mi primer título","Content: Lorem ipsum dolor sit, amet consectetur adipisicing elit. Nam, asperiores, sint libero, quisquam nesciunt minus placeat iure neque tempore quidem earum velit ducimus commodi a nobis aspernatur? Quam, odio ut!","VueJS");// Agrego todo el objeto al array posts $Akeneth->agregarPost($Akeneth->post); $AMaria->post =newPost( $AMaria->getFullName(),"Saludando","Content: Lorem ipsum dolor sit, amet consectetur adipisicing elit. Nam, asperiores, sint libero, quisquam nesciunt minus placeat iure neque tempore quidem earum velit ducimus commodi a nobis aspernatur? Quam, odio ut!","PHP");// Agrego todo el objeto al array posts $AMaria->agregarPost($AMaria->post); $APablo->post =newPost( $APablo->getFullName(),"Esto es otro título","Esto es el contenido de todo el post, lo mismo que lo anterior pero más corto","Mensaje random");// Agrego todo el objeto al array posts $APablo->agregarPost($APablo->post);// Muestro el post echo $Akeneth->post->showPost(); echo $AMaria->post->showPost(); echo $APablo->post->showPost();// Lo siguiente es solo para debuguear // Category::mostrar();// User::mostrarTodo();?>
{"name":"slasher/project","description":"just a simple project","autoload":{"psr-4":{"App\\":"src/"}},"require-dev":{"phpunit/phpunit":"^9.5"}}
AuthorTest
<?php
use PHPUnit\Framework\TestCase;use App\Author;classAuthorTestextendsTestCase{publicfunctiontest_add_author(){ $author =newAuthor('197O00045','Alexis','Vazquez','Morales',true); $this->assertInstanceOf(Author::class, $author);}}
CategoryTest
<?php
use PHPUnit\Framework\TestCase;use App\Category;classCategoryTestextendsTestCase{publicfunctiontest_add_category(){ $cateogry =newCategory('1','PHP'); $this->assertInstanceOf(Category::class, $cateogry);}}
PostTest
<?php
use PHPUnit\Framework\TestCase;use App\Post;classPostTestextendsTestCase{publicfunctiontest_add_post(){ $post =newPost(1,'este es un nuevo post','197O00045','1'); $this->assertInstanceOf(Post::class, $post);}}
UserTest
<?php
use PHPUnit\Framework\TestCase;use App\User;classUserTestextendsTestCase{publicfunctiontest_add_user(){ $user =newUser('Alexis','Vazquez','Morales'); $this->assertInstanceOf(User::class, $user);}}
<?php
include './vendor/autoload.php';use App\Author;use App\Category;use App\Post;// Creo al autor del post$author =newAuthor('Nestor','Velasquez');// Creo una categoría de ciencias$scienceCategory =newCategory('Ciencias');// Creo una categoría de Programación$programmingCategory =newCategory('Programacion');// Creo un primer post$firstPost =newPost('Las ciencias de la vida','La vida es una cienca y la ciencia es una vida... Eres lo que vives, somos ellos, somos aquellos, somos los hombres de negro');// Creo otro post$secondPost =newPost('Cómo ser un hacker con Python','Para ser un hacker en python tienes que ser un crack en python primero... asi como yo que soy un super crack');// Mensaje de bienvenida al usuario autorecho "<h2>Bienvenido {$author->getFirstName()} {$author->getLastName()}</h2>";// Le asigno un autor a los post creados$author->writePost($firstPost);$author->writePost($secondPost);echo "<p>Has creado hasta ahora {$author->countCreatedPosts()} Posts</p>";echo "<p>Tus Posts creados son: </p>";echo "<table>";for($i=0; $i < $author->countCreatedPosts(); $i++){ echo "<tr>"; echo "<td><h4>{$author->getCreatedPosts()[$i]->getTitle()}</h4><p>{$author->getCreatedPosts()[$i]->getDescription()}</p></td>"; echo "</tr>";}