Es más que claro que el uso de las tecnologías NOSQL está creciendo exponencialmente en los últimos años, por lo tanto surge la necesidad de ponerse al corriente y que mejor que MongoDB para dar inicio a está nueva aventura, yo suelo programar en PHP usando Zend Framework 3, y siempre he usado una base de datos relacional como MySQL, pero ahora por diferentes razones necesito usar MongoDB así que les dejo de forma sencilla y funcional como Integrar MongoDB y Zend Framework 3
Nota:
Vale resaltar que la forma más recomendada de usar MongoDB y Zend Framework es a través de Doctrine/MongoDB, lo cual es objeto de estudio por su propia cuenta.
En mi caso usaré la librería MongoDB para PHP.
Este tutorial ha sido creado usando:
- PHP 7.1.4
- MongoDB 3.4.9
- Driver PHP_MONGODB 1.3.0
- PHPLIB 1.1.2
- Zend Framework 3
Empecemos:
1) Tenemos que asegurarnos que tenemos el driver de MongoDb instalado en nuestro php, si no estamos seguros podemos ejecutar un php info y asegurarnos.
2) Si aún no tenemos instalado el Driver de MongoDB para PHP lo podemos descargar desde: https://pecl.php.net/package/mongodb
Tenemos que elegir la opción que se adapte a sus características, por ejemplo yo use le versión 1.3.0 para MongoDb 3.4.9 si tienen una versión superior o inferior deben elegir la más adecuada a sus necesidades.
Si estamos usando Window debes clickar en la opción DLL ello nos llevará a la siguiente página: https://pecl.php.net/package/mongodb/1.3.0/windows debemos desplazarnos hasta el apartado DLL List
Luego eligan la versión de PHP que usen y descargen, aquí debo hacer una aclaración solo descarguen la opción Thread Safe (TS) debido a que Non Thread Safe no funciona correctamente. Una vez descargado el archivo correctamente deben descomprimir y copiar el archivo php_mongodb.dll dentro de la carpeta de extensiones de PHP; en mi caso: C:\xampp\php\ext
Terminado el paso anterior deben abrir el archivo php.ini y agregar si no existe la siguiente linea: extension=php_mongodb.dll Luego reiniciar Apache y tendrán ahora ya instalado el Driver de MongoDB para PHP.
Para mayor información pueden revisar: http://php.net/manual/es/set.mongodb.php
3) En versiones más recientes para poder usar el Driver debemos hacer a través de la Librería de PHP para MongoDB llamada PHPLIB (Lo sé suena muy enredado, pero así es, que le vamos a hacer.) Las instrucciones para usar la librería la tienen en: http://php.net/manual/es/mongodb.tutorial.library.php
En http://php.net/manual/es/mongodb.tutorial.library.php se explica claramente como instalar la librería PHPLIB 1.0, en mi caso yo he instalado la última versión 1.1.2 (Octubre 2017) por lo que se darán cuenta que si ejecutan el siguiente código (ver imagen) no funcionará
[codesyntax lang=”php”]
<?php
require 'vendor/autoload.php'; // incluir lo bueno de Composer
$cliente = new MongoDB\Client("mongodb://localhost:27017");
$colección = $cliente->demo->beers;
$resultado = $colección->insertOne( [ 'name' => 'Hinterland', 'brewery' => 'BrewDog' ] );
echo "Inserted with Object ID '{$resultado->getInsertedId()}'";
?>
[/codesyntax]
Por tal motivo si usas la versión 1.1.2 debes guiarte de la siguiente documentación: http://php.net/manual/en/class.mongodb-driver-manager.php
Yo he creado el siguiente código para hacer una pequeña consulta la base de datos y asegurarme que funcione.
[codesyntax lang=”php”]
<?php
require ‘vendor/autoload.php’;
try{
// Manager Class
$manager = new MongoDB\Driver\Manager(“mongodb://localhost:27017”);
// Query Class
$query = new MongoDB\Driver\Query(array(‘a’ => 1));
// Output of the executeQuery will be object of MongoDB\Driver\Cursor class
$cursor = $manager->executeQuery(‘test.foo’, $query);
// Convert cursor to Array and print result
print_r($cursor->toArray());
}catch(MongoConnectionException $e){
die($e->getMessage());
}
[/codesyntax]
Recordar que deben instalar la librería a través de composer y usar con require.
Si todo está correcto deberán observar el siguiente resultado: Array ( [0] => stdClass Object ( [_id] => MongoDB\BSON\ObjectId Object ( [oid] => 59da6ea7d9769de18be8c29b ) [a] => 1 ) )
Antes de ejecutar el código yo he creado una base de datos llamada test y una biblioteca llamada foo con un atributo llamado a y el valor 1
4) Lo anterior fue un ejercicio para pasar ahora a Zend Framework ya que sin los pasos anteriores no podremos usar MongoDb.
Ahora para usar la librería en ZendFramework debemos agregarla de la misma forma, abrimos el archivo composer.json y agregamos la linea: “mongodb/mongodb” : “1.1.2” y actualizamos las dependencias.
5) Ahora dentro de cualquiera de nuestros controladores de Zend Framework 3 podemos ejecutar el siguiente código:
[codesyntax lang=”php”]
<?php namespace Empleos\Controller; use RuntimeException; use Zend\Mvc\Controller\AbstractActionController; use Zend\View\Model\ViewModel; use MongoDB\Driver\Manager; use MongoDB\Driver\Query; class MongoController extends AbstractActionController { public function indexAction() { $manager = new Manager("mongodb://localhost:27017"); $query = new Query(array('a' => 1)); $cursor = $manager->executeQuery('test.foo', $query); return new ViewModel([ 'cursor' => $cursor->toArray() ]); } }
[/codesyntax]
Debemos destacar el uso de MongoDB\Driver\Manager y MongoDB\Driver\Query el uso correcto lo pueden ver en el siguiente enlace: http://php.net/manual/en/book.mongodb.php
El código anterior muestra como salida el siguiente resultado:
Yo adicionalmente he creado una vista y he impreso el valor de cursor que devuelve el valor encontrado.
En resumen el uso es el mismo que haría sin usar Zend Framework 3. Pero como vuelvo a repetir el uso más adecuado es a través de un ORM como Doctrine/MongoDb el cual tienen un tutorial (En inglés) en el siguiente enlace: https://olegkrivtsov.github.io/using-zend-framework-3-book/html/en/Appendix_D__Introduction_to_Doctrine/Doctrine_Architecture.html