bases de datos

Ejemplo práctico con MongoDB y PHP: agenda

Acabamos de ver las operaciones básicas que podemos hacer con PHP y MongoDB. Ahí vimos cómo hacer un CRUD, pero no lo aplicamos. Es por eso que decidí hacer un ejemplo con una agenda que simplemente guarda contactos.

CRUD de MongoDB y PHP, agenda

Dicho ejemplo de MongoDB y PHP está hecho con Bootstrap y puedes clonarlo o descargarlo en el repositorio de GitHub.

Requisitos y recomendaciones

Únicamente lee el post anterior, pues aquí partiré con la idea de que ya sabes cómo hacer las operaciones básicas.

¿Por qué no hay ejemplo en línea?

Intenté pero al final decidí no perder más tiempo, y por ahora la única manera de probarlo es descargarlo por ti mismo. Recuerda seguir los tutoriales del post anterior para habilitar la extensión y todas esas cosas.

El paradigma

Intenté abstraer todo en un paradigma de tipo MVC. No se usa ningún framework, es PHP puro. Para la gestión de paquetes utilizo composer, y un tema de Bootstrap.

El modelo

Es un modelo que se encarga de interactuar con la base de datos y las operaciones de la agenda. Se ve así:

<?php
class ContactosModel
{
    private static function obtenerBaseDeDatos()
    {
        $host = "127.0.0.1";
        $puerto = "27017";
        $usuario = rawurlencode("parzibyte");
        $pass = rawurlencode("hunter2");
        $nombreBD = "agenda";
        # Crea algo como mongodb://parzibyte:hunter2@127.0.0.1:27017/agenda
        $cadenaConexion = sprintf("mongodb://%s:%s@%s:%s/%s", $usuario, $pass, $host, $puerto, $nombreBD);
        $cliente = new MongoDB\Client($cadenaConexion);
        return $cliente->selectDatabase($nombreBD);
    }

    /**
     * @param $contacto Contacto: un objeto de la clase Contacto
     * @return bool indicando si la inserción fue correcta
     */    public static function insertar($contacto)
    {
        $baseDeDatos = self::obtenerBaseDeDatos();
        # Acceder a la colección contactos
        $coleccion = $baseDeDatos->contactos;
        $resultado = $coleccion->insertOne([
            "nombre" => $contacto->getNombre(),
            "direccion" => $contacto->getDireccion(),
            "correoElectronico" => $contacto->getCorreoElectronico(),
        ]);
        return $resultado->getInsertedCount() === 1;
    }

    public static function obtenerPorId($id)
    {
        $baseDeDatos = self::obtenerBaseDeDatos();
        $coleccion = $baseDeDatos->contactos;
        return $coleccion->findOne(["_id" => new MongoDB\BSON\ObjectId($id)]);
    }

    public static function obtenerTodos()
    {
        $baseDeDatos = self::obtenerBaseDeDatos();
        $coleccion = $baseDeDatos->contactos;
        return $coleccion->find(); // Sin criterio de búsqueda
    }

    public static function actualizar($id, $contacto)
    {
        echo "id => $id";
        $baseDeDatos = self::obtenerBaseDeDatos();
        $coleccion = $baseDeDatos->contactos;
        $resultado = $coleccion->updateOne(
            // El criterio, algo así como where
            ["_id" => new MongoDB\BSON\ObjectId($id)],
            // Nuevos valores
            [
                '$set' => [
                    "nombre" => $contacto->getNombre(),
                    "direccion" => $contacto->getDireccion(),
                    "correoElectronico" => $contacto->getCorreoElectronico(),
                ],
            ]
        );
        # Recuerda que puedes ver a cuántos afectó con $resultado->getModifiedCount()
        return true;
    }

    public static function eliminar($id)
    {
        $baseDeDatos = self::obtenerBaseDeDatos();
        $coleccion = $baseDeDatos->contactos;
        $resultado = $coleccion->deleteOne(
            // El criterio, algo así como where
            ["_id" => new MongoDB\BSON\ObjectId($id)]
        );
        return $resultado->getDeletedCount() === 1;
    }
}

Nota: tal vez con el paso del tiempo ya actualicé el código, pero no te preocupes, el archivo actualizado siempre estará en el repositorio de GitHub.

El controlador

Un simple pegamento. Evalúa la url y dependiendo de ello incluye las vistas. También se encarga de definir variables que son “pasadas” a las vistas, gracias al modelo.

Todo eso está en el index.

Las vistas

Simples archivos de PHP que renderizan y proveen una interfaz gráfica. Están separadas por la acción que hacen, y la mayoría de veces son incluidas con el encabezado y pie.

La seguridad

No he validado nada, es un simple ejercicio. Me parece que la seguridad es la cosa más importante en los sistemas, pero no lo he puesto por simplicidad.

Una clase

Para simplificar cosas, hice una clase que permitirá que las funciones queden más cortas (como cuando conectamos MySQL con Go).

 

Estoy aquí para ayudarte 🤝💻


Estoy aquí para ayudarte en todo lo que necesites. Si requieres alguna modificación en lo presentado en este post, deseas asistencia con tu tarea, proyecto o precisas desarrollar un software a medida, no dudes en contactarme. Estoy comprometido a brindarte el apoyo necesario para que logres tus objetivos. Mi correo es parzibyte(arroba)gmail.com, estoy como@parzibyte en Telegram o en mi página de contacto

No te pierdas ninguno de mis posts 🚀🔔

Suscríbete a mi canal de Telegram para recibir una notificación cuando escriba un nuevo tutorial de programación.
parzibyte

Programador freelancer listo para trabajar contigo. Aplicaciones web, móviles y de escritorio. PHP, Java, Go, Python, JavaScript, Kotlin y más :) https://parzibyte.me/blog/software-creado-por-parzibyte/

Ver comentarios

  • Hola que tal amigo, yo estoy haciendo algo parecido a lo que muestras en este tutorial, quiero ver como funciona para tratar de adaptarlo a mi proyecto. Descargue tu codigo de GitHub y al intentar ejecutarlo me muestra el siguiente error:

    Fatal error: Uncaught MongoDB\Driver\Exception\AuthenticationException: Authentication failed. in C:\xampp\htdocs\ClasesMongoDB\vendor\mongodb\mongodb\src\Operation\Find.php:299 Stack trace: #0 C:\xampp\htdocs\ClasesMongoDB\vendor\mongodb\mongodb\src\Operation\Find.php(299): MongoDB\Driver\Server->executeQuery('agenda.contacto...', Object(MongoDB\Driver\Query), Array) #1 C:\xampp\htdocs\ClasesMongoDB\vendor\mongodb\mongodb\src\Collection.php(624): MongoDB\Operation\Find->execute(Object(MongoDB\Driver\Server)) #2 C:\xampp\htdocs\ClasesMongoDB\ContactosModel.php(45): MongoDB\Collection->find() #3 C:\xampp\htdocs\ClasesMongoDB\index.php(16): ContactosModel::obtenerTodos() #4 {main} thrown in C:\xampp\htdocs\ClasesMongoDB\vendor\mongodb\mongodb\src\Operation\Find.php on line 299

    Note que tu codigo no tiene la carpeta de vendor con las dependencias de MongoDB, asi que la instale yo mismo, pero el error aun sigue, como puedo corregirlo?

    Gracias de antemano

    • Hola, qué tal. La excepción te está diciendo el problema: falló la autenticación. Verifica que tus credenciales sean correctas, que el host y puerto estén correctos, y que el servicio de Mongo se esté ejecutando. También intenta conectarte con Robomongo: https://parzibyte.me/blog/2018/10/29/instalar-robomongo-en-windows-10-mongodb/
      Espero que se solucione tu problema :) te invito a seguirme en mis redes sociales para estar al tanto de mis actualizaciones.

      • Gracias por responder, no me di cuenta del mensaje de autenticacion, ya he empezado a ver tu blog, estoy precisamente viendo el post de creacion de usuarios en MongoDB, y tengo instalado Robo 3T, una duda cuando termine de hacer mi usuario y habilite la autenticacion Robo 3T detectará estos cambios automaticamente? o Debo hacer algo mas?

        • Crea tus usuarios normalmente y cierra Robo 3T, luego de eso vuelve a abrirlo y crea una nueva conexión; coloca tus credenciales y la conexión se guardará, más tarde simplemente conecta y ya podrás administrar tu base de datos

          • Que tal, ya he podido probar tu ejemplo, esta genial, pero tengo unas dudas, cuando haces el guardado desde el formulario, los datos de los campos a donde se envían, veo que usas "action=?q=guardar", pero no entiendo como es esta parte, me supongo que lo envias a Contacto.php, y posteriormene en ContactModel.php traes los datos para insertarlos a la BD con los getters.

            Podrías explicar mejor esa parte porfavor?

Entradas recientes

Desplegar PWA creada con Vue 3, Vite y SQLite3 en Apache

Ya te enseñé cómo convertir una aplicación web de Vue 3 en una PWA. Al…

3 días hace

Arquitectura para wasm con Go, Vue 3, Pinia y Vite

En este artículo voy a documentar la arquitectura que yo utilizo al trabajar con WebAssembly…

3 días hace

Vue 3 y Vite: crear PWA (Progressive Web App)

En un artículo anterior te enseñé a crear un PWA. Al final, cualquier aplicación que…

3 días hace

Errores de Comlink y algunas soluciones

Al usar Comlink para trabajar con los workers usando JavaScript me han aparecido algunos errores…

3 días hace

Esperar promesa para inicializar Store de Pinia con Vue 3

En este artículo te voy a enseñar cómo usar un "top level await" esperando a…

3 días hace

Solución: Apache – Server unable to read htaccess file

Ayer estaba editando unos archivos que son servidos con el servidor Apache y al visitarlos…

4 días hace

Esta web usa cookies.