Phalcon MongoDB

238
06 июля 2017, 03:44

php7.0, Phalcon 3.2, MongoDB 3.2.14

Хочу подключаться к базе, но в документации по Phalcon описана настройка подключения через MongoClient() и работа только через него, хотя он устарел давно и вообще deprecated в семёрке. Как мне подружить Phalcon с современным и уютным \MongoDB\Driver\Manager()? Потому что в services.php я ладно худо-бедно настроил, вроде не ругается, код такой:

/**
* MongoDB connection
*/
$di->set( "mongo", function () {
       $config = $this->getConfig();
        $db_string = sprintf( 'mongodb://%s:%s/%s', $config->mongodb->host, $config->mongodb->port, $config->mongodb->database );
        if( isset( $config->mongodb->user ) AND isset( $config->mongodb->password ) ) {
            $db_string = sprintf( 'mongodb://%s:%s@%s:%s/%s',
                $config->mongodb->user,
                (string)$config->mongodb->password,
                $config->mongodb->host,
                (string)$config->mongodb->port,
                $config->mongodb->database );
       }
        try {
            return new \MongoDB\Driver\Manager( $db_string );
        } catch (MongoConnectionException $e) {
            die( 'Failed to connect to MongoDB '.$e->getMessage() );
        }
    },
    true
);

А вот в моделях не нравится ему. Пишу в app/models/User.php:

use Phalcon\Mvc\Collection;
class User extends Collection
{
    public function initialize()
    {
        $this->setSource('users');
    }
}

Вызываю в контроллере:

class IndexController extends ControllerBase
{
    public function indexAction()
    {
        echo User::count();
    }
}

Пишет вот такое:

Call to undefined method ::selectcollection()
#0 [internal function]: Phalcon\Mvc\Collection::_getGroupResultset(Array, Object(User), Object(MongoDB\Driver\Manager))
#1 /var/www/testing/app/controllers/IndexController.php(8): Phalcon\Mvc\Collection::count()
#2 [internal function]: IndexController->indexAction()
#3 [internal function]: Phalcon\Dispatcher->callActionMethod(Object(IndexController), 'indexAction', Array)
#4 [internal function]: Phalcon\Dispatcher->_dispatch()
#5 [internal function]: Phalcon\Dispatcher->dispatch()
#6 /var/www/testing/public/index.php(42): Phalcon\Mvc\Application->handle()
#7 {main}

Как победить?

Answer 1

First I installed Phalcon incubator using composer into my vendor directory:

composer require phalcon/incubator

Then I make sure that vendor libraries are loaded:

include_once SITE_ROOT . 'vendor/autoload.php';

Then I use \Phalcon\Db\Adapter\MongoDB\Client() found in vendor/phalcon/incubator/Library/Phalcon/Db/Adapter/MongoDB/Client.php

In services.php:

$di->setShared('mongo', function () use ($config) {
    $mongo = new \Phalcon\Db\Adapter\MongoDB\Client();
    return $mongo->selectDatabase($config->mongodb->dbname);
});

Then ensure my MongoCollection extends \Phalcon\Mvc\MongoCollection (vendor/phalcon/incubator/Library/Phalcon/Mvc/MongoCollection.php).

models/MyCollectionStats.php:

<?php
namespace Common\Models;
class MyCollectionStats extends \Phalcon\Mvc\MongoCollection
{...

Ответ нашёлся здесь. Надеюсь, дальнейшем это кому-то поможет :)

READ ALSO
Как разбить json на ключ-значение в php?

Как разбить json на ключ-значение в php?

Есть такой ответ от сервера

264
Отрисовка выбранного radio батона

Отрисовка выбранного radio батона

Например, в массиве есть ключ answer, со значением 2 и надо сделать, что бы появилась форма, с радиокнопками и автоматически, была нажата вторая

221
Как выполнить скрипт только при первом просмотре страницы?

Как выполнить скрипт только при первом просмотре страницы?

Добрый день! Нужно поместить на страницу с заказом скрипт (js массив dataLayer с данными для GTM)Но, выполниться он должен при первом просмотре страници...

185
Выдернуть часть из массива

Выдернуть часть из массива

Есть код, на ответ выдаётся массив данных, как выдернуть содержимое строки title после знака =>

295