MongoDB e CodeIgniter [fechado
-
20-09-2019 - |
Pergunta
Alguém pode ajudar a me apontar para um tutorial, biblioteca etc. que me permitirá trabalhar com o MongoDB da CodeIgniter?
Solução
Não tenho certeza se é o "Codeigniter Way", mas criei uma biblioteca CodeIgniter que estende a classe Mongo com uma propriedade extra para armazenar a conexão atual do banco de dados.
Aqui estão os arquivos de código relevantes do meu projeto.
Config/Mongo.php
$config['mongo_server'] = null;
$config['mongo_dbname'] = 'mydb';
Bibliotecas/Mongo.php
class CI_Mongo extends Mongo
{
var $db;
function CI_Mongo()
{
// Fetch CodeIgniter instance
$ci = get_instance();
// Load Mongo configuration file
$ci->load->config('mongo');
// Fetch Mongo server and database configuration
$server = $ci->config->item('mongo_server');
$dbname = $ci->config->item('mongo_dbname');
// Initialise Mongo
if ($server)
{
parent::__construct($server);
}
else
{
parent::__construct();
}
$this->db = $this->$dbname;
}
}
E um controlador de amostra
Controladores/posts.php
class Posts extends Controller
{
function Posts()
{
parent::Controller();
}
function index()
{
$posts = $this->mongo->db->posts->find();
foreach ($posts as $id => $post)
{
var_dump($id);
var_dump($post);
}
}
function create()
{
$post = array('title' => 'Test post');
$this->mongo->db->posts->insert($post);
var_dump($post);
}
}
Outras dicas
MongoDB é muito bem suportado na comunidade CodeIgniter, reserve um tempo e mergulhe em: P
Eu gosto do exemplo de Stephen Curran, pois é simples e permite que uma interface seja Mongo sem muita funcionalidade escrita no PHP, eu tendem a encontrar enormes clases de abstração um pouco às vezes para o que estou procurando.
Eu estendi o exemplo dele para incluir a autenticação do banco de dados. Vá aqui: http://www.mongodb.org/display/docs/security+and+authentication Para ler sobre autenticação Mongo, não se esqueça de ativar a autenticação para o servidor Mongo ao qual você está se conectando.
Também mudei a função de construtor de estilo antigo para ser __construct e estou lidando com exceções de conexão Mongo, pois elas podem revelar seu nome de usuário e senha.
Config/Mongo.php
<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
$config['mongo_server'] = 'localhost';
$config['mongo_dbname'] = 'my_mongo_db';
$config['mongo_username'] = 'mongo_user';
$config['mongo_password'] = 'password1234';
/* End of file mongo.php */
Bibliotecas/Mongo.php
<?php
class CI_Mongo extends Mongo{
protected $db;
function __construct()
{
// Fetch CodeIgniter instance
$ci = get_instance();
// Load Mongo configuration file
$ci->load->config('mongo');
// Fetch Mongo server and database configuration
$server = $ci->config->item('mongo_server');
$username = $ci->config->item('mongo_username');
$password = $ci->config->item('mongo_password');
$dbname = $ci->config->item('mongo_dbname');
// Initialise Mongo - Authentication required
try{
parent::__construct("mongodb://$username:$password@$server/$dbname");
$this->db = $this->$dbname;
}catch(MongoConnectionException $e){
//Don't show Mongo Exceptions as they can contain authentication info
$_error =& load_class('Exceptions', 'core');
exit($_error->show_error('MongoDB Connection Error', 'A MongoDB error occured while trying to connect to the database!', 'error_db'));
}catch(Exception $e){
$_error =& load_class('Exceptions', 'core');
exit($_error->show_error('MongoDB Error',$e->getMessage(), 'error_db'));
}
}
}
Trabalhar com o MongoDB no Codeigniter não seria muito diferente do que trabalhar com ele em nenhum outro lugar.
Você pode bater juntos uma biblioteca MongoDB que se conectaria no construtor e armazenaria $ this-> Conn para ser usado nos métodos posteriormente.
Em seguida, trabalhe diretamente com a propriedade Conn em seus controladores ou crie alguns métodos na biblioteca do MongoDB para fazer isso por você.
Dê uma olhada aqui Para ver o tutorial de PHP simples para trabalhar com MongoDB.
Felizmente, eu criaria uma biblioteca para você, mas isso viria com um preço. :-p
Estou usando o MongoDB com CI e criei o seguinte. Funciona para mim, mas tenho certeza de que pode ser aprimorado um pouco. Vou me preocupar em ajustar mais tarde, mas agora faz o que eu quero.
Criei um modelo chamado "Database_Conn.php"
class Database_Conn extends Model {
function _connect() {
$m = new Mongo();
$db = $m->selectDB( "YOUR DATABASE NAME" );
return $db;
}
}
Então, se eu precisar me conectar a uma coleção dos meus modelos.
$collection = Database_Conn::_connect()->selectCollection( "COLLECTION NAME" );