To initial a MongoDB connection in Zend_Application, a custom resource plugin is needed. After studying Matthew Weier O'Phinney's post and existing resource plugins, i create a basic one as follow. In this case, i only focus on single host connection. init() reads the parameters and returns a MongoCollection object.
<?php
// library/My/Application/Resource/Mongo.php
class My_Application_Resource_Mongo extends
Zend_Application_Resource_ResourceAbstract {
protected $_params = array();
public function setParams(array $params) {
$this->_params = $params;
return $this;
}
public function init() {
$dns = 'mongodb://';
if (isset($this->_params['dbname'])) {
if (isset($this->_params['username']) &&
isset($this->_params['password'])) {
$dns .= $this->_params['username'] .
':' . $this->_params['password'] . '@';
}
if (isset($this->_params['hostname'])) {
$dns .= $this->_params['hostname'];
}
if (isset($this->_params['port'])) {
$dns .= ':' . $this->_params['port'];
}
} else {
throw new Exception(__CLASS__ . ' is missing parameters.');
}
try {
$connection = new Mongo($dns);
return $connection->selectDB($this->_params['dbname']);
} catch (MongoConnectionException $e) {
throw new Exception($e->getMessage());
}
}
}
In configuration file, define autoloadernamespaces and pluginPaths so that bootstrap class can find the custom resource plugin.
; application/configs/application.ini [production] ;... autoloadernamespaces[] = "My_" pluginPaths.My_Application_Resource = "My/Application/Resource" resources.mongo.params.hostname = "localhost" resources.mongo.params.dbname = "test" ;...
i feel comfortable to directly work with MongoCursor object, its methods insert(), find(), update(),... are exactly what i want, so i simply call them in the Mapper without introducing an Application_Model_User class to handle User object, as in quick start example.
<?php
// application/models/UserMapper.php
class Application_Model_UserMapper {
private $_db;
private $_name = 'user';
private $_collection;
public function __construct() {
$frontController = Zend_Controller_Front::getInstance();
$this->_db = $frontController->getParam('bootstrap')
->getResource('mongo');
$this->_collection = $this->_db->selectCollection($this->_name);
}
public function insert($doc, $options = array()) {
return $this->_collection->insert($doc, $options);
}
public function find($query = array(), $fields = array()) {
return $this->_collection->find($query, $fields);
}
public function findOne($query = array(), $fields = array()) {
return $this->_collection->findOne($query, $fields);
}
public function update($criteria, $newObj, $options = array()) {
return $this->_collection->update($criteria, $newObj, $options);
}
//...
}
In controller, i can simply instantiate UserMapper object, and treat it as MongoCursor.
<?php
// application/controllers/IndexController.php
class IndexController extends Zend_Controller_Action {
public function indexAction() {
$userMapper = new Application_Model_UserMapper();
$cursor = $userMapper->find();
//...
}
}
It's great your work , I'll start with mongodb and I dont know idea of how start. thanks!.
ReplyDeleteit's mind blowing work.
ReplyDelete