hi have some problems with zend framework 2 + doctrine2 and DoctrineDataFixtureModule (https://github.com/Hounddog/DoctrineDataFixtureModule)
the module is not loading my fixtures
this is my config
'doctrine' => array(
'eventmanager' => array(
'orm_default' => array(
'subscribers' => array(
'Gedmo\Tree\TreeListener',
'Gedmo\Timestampable\TimestampableListener',
'Gedmo\Sluggable\SluggableListener',
'Gedmo\Loggable\LoggableListener',
'Gedmo\Sortable\SortableListener'
),
),
),
'driver' => array(
__NAMESPACE__.'_driver' => array(
'class' =>'Doctrine\ORM\Mapping\Driver\AnnotationDriver',
'cache' => 'array',
'paths' => array(
__DIR__ . '/../src/'.__NAMESPACE__.'/Entity',
)
'data-fixture' => array(
__NAMESPACE__.'_fixture' => __DIR__ . '/../src/'.__NAMESPACE__.'/Fixtures',
),
),
'translatable_metadata_driver' => array(
'class' => 'Doctrine\ORM\Mapping\Driver\AnnotationDriver',
'cache' => 'array',
'paths' => array(
'vendor/gedmo/doctrine-extensions/lib/Gedmo/Translatable/Entity',
),
),
'orm_default' => array(
'drivers' => array(
__NAMESPACE__.'\Entity' => __NAMESPACE__.'_driver',
// 'Gedmo\Translatable\Entity' => 'translatable_metadata_driver',
)
),
)
),
the problem is i dont know how set the fixtures path or what exactly key in the array i have to set the fixtures path
in the documentation the developer says:
To register drivers with Doctrine module simply add the drivers to the
doctrine.driver key in your configuration.
return array(
'data-fixture' => array(
'ModuleName_fixture' => __DIR__ . '/../src/ModuleName/Fixture',
),
);
You actually need to add the data-fixture array to the root of the configuration array, not in the doctrine array. Like so:
return array(
...
'doctrine' => array(
'eventmanager' => array(
'orm_default' => array(
'subscribers' => array(
'Gedmo\Tree\TreeListener',
'Gedmo\Timestampable\TimestampableListener',
'Gedmo\Sluggable\SluggableListener',
'Gedmo\Loggable\LoggableListener',
'Gedmo\Sortable\SortableListener'
),
),
),
'driver' => array(
__NAMESPACE__.'_driver' => array(
'class' =>'Doctrine\ORM\Mapping\Driver\AnnotationDriver',
'cache' => 'array',
'paths' => array(
__DIR__ . '/../src/'.__NAMESPACE__.'/Entity',
)
),
'translatable_metadata_driver' => array(
'class' => 'Doctrine\ORM\Mapping\Driver\AnnotationDriver',
'cache' => 'array',
'paths' => array(
'vendor/gedmo/doctrine-extensions/lib/Gedmo/Translatable/Entity',
),
),
'orm_default' => array(
'drivers' => array(
__NAMESPACE__.'\Entity' => __NAMESPACE__.'_driver',
// 'Gedmo\Translatable\Entity' => 'translatable_metadata_driver',
)
),
)
),
'data-fixture' => array(
__NAMESPACE__.'_fixture' => __DIR__ . '/../src/'.__NAMESPACE__.'/Fixtures',
),
...
);
I'll admit the wording in the documentation is a bit confusing.
Related
my config value are
'controllers' => array(
'invokables' => array(
'System\Controller\Index' => 'System\Controller\IndexController',
'System\Controller\Config' => 'System\Controller\ConfigController'
),
),
'view_manager' => array(
'template_path_stack' => array(
'system' => __DIR__ . '/../view',
)
),
'router' => array(
'routes' => array(
// using the path /application/:controller/:action
'system' => array(
'type' => 'segment',
'options' => array(
'route' => '/system/index[/:action][/:id]',
'constraints' => array(
'action' => '[a-zA-Z][a-zA-Z0-9_-]*',
'id' => '[0-9]+',
),
'defaults' => array(
'controller' => 'System\Controller\Index',
'action' => 'index',
),
),
),
),
),
and directory stutrue are in pics.
Is there any things else I am missing ? because i am getting error msg in zf2 application .
Error Msg :
Zend\View\Renderer\PhpRenderer::render: Unable to render template "system/index/index"; resolver could not resolve to a file
Try this:
'view_manager' => array(
'template_path_stack' => array(
'system' => array(__DIR__ . '/../view'),
)
),
plz i need some help here , i've goolged a lot but without result :/
how can i exploit the query and their result stored in the memcache , i'm working with zend framework 2 and doctrine 2 ? and here is my configuration in module.config.php :
// Doctrine config
'doctrine' => array(
'driver' => array(
__NAMESPACE__ . '_driver' => array(
'class' => 'Doctrine\ORM\Mapping\Driver\AnnotationDriver',
'paths' => array(__DIR__ . '/../src/' . __NAMESPACE__ . '/Entity')
),
'orm_default' => array(
'drivers' => array(
__NAMESPACE__ . '\Entity' => __NAMESPACE__ . '_driver'
),
)
),
/***** enabling the memcache ****/
'configuration' => array(
'orm_default' => array(
'metadata_cache' => 'mycache',
'query_cache' => 'mycache',
'result_cache' => 'mycache',
)
/**** end ****/
)
),
'service_manager' => array(
'factories' => array(
'translator' => 'Zend\I18n\Translator\TranslatorServiceFactory',
'navigation' => 'Zend\Navigation\Service\DefaultNavigationFactory',
'doctrine.cache.mycache' => function ($sm) {
$cache = new \Doctrine\Common\Cache\MemcacheCache();
$memcache = new \Memcache();
$memcache->connect('localhost', 11211);
$cache->setMemcache($memcache);
return $cache;
},
),
),
any idea or link is appeciated , thanks.
Regards.
I suppose You are using DoctrineModule, right?
Change your configuration to this:
// Doctrine config
'doctrine' => array(
'driver' => array(
__NAMESPACE__ . '_driver' => array(
'class' => 'Doctrine\ORM\Mapping\Driver\AnnotationDriver',
'paths' => array(__DIR__ . '/../src/' . __NAMESPACE__ . '/Entity')
),
'orm_default' => array(
'drivers' => array(
__NAMESPACE__ . '\Entity' => __NAMESPACE__ . '_driver'
),
),
),
/***** enabling the memcache ****/
'configuration' => array(
'orm_default' => array(
'metadata_cache' => 'memcache',
'query_cache' => 'memcache',
'result_cache' => 'memcache',
)
),
/**** end ****/
'cache' => array(
'memcache' => array(
'instance' => 'doctrine.cache.mycache',
),
),
),
'service_manager' => array(
'factories' => array(
'doctrine.cache.mycache' => function ($sm) {
$cache = new \Doctrine\Common\Cache\MemcacheCache();
$memcache = new \Memcache();
$memcache->connect('localhost', 11211);
$cache->setMemcache($memcache);
return $cache;
},
),
),
How does this work?
In module configuration are predefined configurations for every supported cache adapter, including memcache. With this configuration, you are saying "use memcache for caching":
'configuration' => array(
'orm_default' => array(
'metadata_cache' => 'memcache',
'query_cache' => 'memcache',
'result_cache' => 'memcache',
)
),
This cache needs configured Memcache instance and this config saying "Memcache instance is available in ServiceManager with key 'doctrine.cache.mycache'"
'cache' => array(
'memcache' => array(
'instance' => 'doctrine.cache.mycache',
),
),
Update:
How to use result cache (documentation):
$cache = $entityManager->getConfiguration()->getResultCacheImpl();
$cacheItemKey = 'my-item';
// test if item exists in the cache
if ($cache->contains($cacheItemKey)) {
$item = $cache->fetch($cacheItemKey); // retrieve item from cache
} else {
$item = $repository->find($id); // retrieve item from repository
$cache->save($cacheItemKey, $item); // save item to cache
}
For a web application, I have to work with 3 seperate databases:
MySQL for all the application logic, such as login
MSSQL Server for inserting records
Oracle server for inserting records
Now i have read a lot of tutorials and manuals to configure those databases, so it now looks like this:
doctrine.global.php
return array(
'doctrine' => array(
'connection' => array(
'orm_default' => array(
'driverClass' => 'Doctrine\DBAL\Driver\PDOMySql\Driver',
'params' => array(
'host' => '123.123.123.123',
'port' => '3306',
'dbname' => 'db_name',
),
),
'orm_oracle' => array(
'driverClass' => 'Doctrine\DBAL\Driver\OCI8\Driver',
'params' => array(
'host' => '321.321.321.321',
'port' => '1521',
'dbname' => 'something',
'driver' => 'oci8',
'servicename' => 'something',
),
),
'orm_microsoft' => array(
'driverClass' => 'Doctrine\DBAL\Driver\SQLSrv\Driver',
'params' => array(
'host' => '231.231.231.231',
'port' => '1433',
'dbname' => 'something',
'driver' => 'sqlsrv',
),
),
)
)
);
doctrine.local.php*
return array(
'doctrine' => array(
'connection' => array(
'orm_default' => array(
'driverClass' => 'Doctrine\DBAL\Driver\PDOMySql\Driver',
'params' => array(
'user' => 'brportal',
'password' => '27607097b4',
),
),
//Alternative DB connection
'orm_oracle' => array(
'driverClass' => 'Doctrine\DBAL\Driver\OCI8\Driver',
'params' => array(
'user' => 'joost',
'password' => '4b58tL8DFv7G',
),
),
'orm_microsoft' => array(
'driverClass' => 'Doctrine\DBAL\Driver\SQLSrv\Driver',
'params' => array(
'user' => 'joost',
'password' => '4b58tL8DFv7G',
),
),
),
'entitymanager' => array(
'orm_default' => array(
'connection' => 'orm_default',
'configuration' => 'orm_default',
),
'orm_oracle' => array(
'connection' => 'orm_oracle',
'configuration' => 'orm_oracle',
),
'orm_microsoft' => array(
'connection' => 'orm_microsoft',
'configuration' => 'orm_microsoft',
),
),
// Use array cache locally, also auto generate proxies on development environment.
'configuration' => array(
'orm_default' => array(
'metadata_cache' => 'array',
'query_cache' => 'array',
'result_cache' => 'array',
'hydration_cache' => 'array',
'generate_proxies' => true,
),
'orm_oracle' => array(
'metadata_cache' => 'array',
'query_cache' => 'array',
'result_cache' => 'array',
'hydration_cache' => 'array',
'generate_proxies' => true,
),
'orm_microsoft' => array(
'metadata_cache' => 'array',
'query_cache' => 'array',
'result_cache' => 'array',
'hydration_cache' => 'array',
'generate_proxies' => true,
),
),
)
);
Module.php
'doctrine' => array(
'driver' => array(
__NAMESPACE__ . '_driver' => array(
'class' => 'Doctrine\ORM\Mapping\Driver\AnnotationDriver',
'cache' => 'array',
'paths' => array(__DIR__ . '\..\src\\' . __NAMESPACE__ . '\Entities')
),
'orm_default' => array(
'drivers' => array(
__NAMESPACE__ . '\Entities' => __NAMESPACE__ . '_driver'
)
),
'oracle_driver' => array(
'class' => 'Doctrine\ORM\Mapping\Driver\AnnotationDriver',
'cache' => 'array',
'paths' => array(__DIR__ . '\..\src\\' . __NAMESPACE__ . '\Entities\Oracle')
),
'orm_oracle' => array(
'drivers' => array(
__NAMESPACE__ . '\Entities\Oracle' => 'oracle_driver'
)
),
'microsoft_driver' => array(
'class' => 'Doctrine\ORM\Mapping\Driver\AnnotationDriver',
'cache' => 'array',
'paths' => array(__DIR__ . '\..\src\\' . __NAMESPACE__ . '\Entities\Microsoft')
),
'orm_microsoft' => array(
'drivers' => array(
__NAMESPACE__ . '\Entities\Microsoft' => 'microsoft_driver'
)
)
)
)
But now, i would really like to have a easy way to (re)generate the mssql and oracle database entities (annotations). It already worked with the MySQL database, but i can't find out how to specify a database connection with doctrine-module orm:convert-mapping.
I was wondering if anyone can help me with this?
Thanks in advance guys!
ps: I already read :
Zend Framework 2 and Doctrine 2 - Configuration for multiple databases
The bottom line is that it is not supported in the ZF2 DoctrineORM module. There is a feature request for it on the repo.
In the meantime there is a module that provides a shim module that add the --em option
https://github.com/SwissEngine/Doctrine-Module-Extension
Im' currently trying to integrate MongoDB with Doctrine in ZendFramework. I did a lot of tutorial (on StackOverflow or anywhere else) but nothing is really working.
I followed step by step a tutorial: http://www.bigwisu.com/2012/10/03/zend-framework-2-doctrine-odm and I got an error that I don't understand.
Fatal error: Class 'MongoId' not found in /home/prooxi/www/zframework/vendor/doctrine/mongodb-odm/lib/Doctrine/ODM/MongoDB/Types/IdType.php on line 38
The IdType.php is source code for the mongoDB, so the error must be somewhere else.
Here is the files I have. (Admin is the name of the module)
config/application.config.php
<?php
return array(
'modules' => array(
'Application',
'DoctrineModule',
'DoctrineMongoODMModule',
'Udmin',
'Listing',
'Admin',
),
'module_listener_options' => array(
'module_paths' => array(
'./module',
'./vendor',
),
'config_glob_paths' => array(
'config/autoload/{,*.}{global,local}.php',
),
),
);
config/autoload/module.doctrine-mongo-odm.local.php
<?php
return array(
'doctrine' => array(
'connection' => array(
'odm_default' => array(
'server' => 'MYDBADRESS',
'port' => '27017',
/* 'connectionString' => null, */
/* 'user' => null, */
/* 'password' => null, */
'dbname' => 'px_boutique_test27',
'options' => array()
),
),
'configuration' => array(
'odm_default' => array(
'metadata_cache' => 'array',
'driver' => 'odm_default',
'generate_proxies' => true,
'proxy_dir' => 'data/DoctrineMongoODMModule/Proxy',
/* 'proxy_dir' => __DIR__ . '/module/Admin/src/Admin/Model/Proxy', */
/* 'proxy_dir' => __DIR__ . '/module/Udmin/src/Udmin/Model/Proxy', */
'proxy_namespace' => 'DoctrineMongoODMModule\Proxy',
/* 'proxy_namespace' => 'Udmin\Model\Proxy', */
'generate_hydrators' => true,
'hydrator_dir' => 'data/DoctrineMongoODMModule/Hydrator',
/* 'hydrator_dir' => __DIR__ . '/module/Udmin/src/Udmin/Model/Hydrator', */
'hydrator_namespace' => 'DoctrineMongoODMModule\Hydrator',
/* 'hydrator_namespace' => 'Udmin\Model\Hydrator', */
'default_db' => 'test27',
'filters' => array(), // array('filterName' => 'BSON\Filter\Class'),
/* 'logger' => null // 'DoctrineMongoODMModule\Logging\DebugStack' */
)
),
'driver' => array(
'odm_default' => array(
'drivers' => array(
'Admin\Document' => 'aplikasi'
)
),
'aplikasi' => array(
'class' => 'Doctrine\ODM\MongoDB\Mapping\Driver\AnnotationDriver',
'cache' => 'array',
'paths' => array(
'module/Admin/src/Admin/Document'
)
)
),
'documentmanager' => array(
'odm_default' => array(
'connection' => 'odm_default',
'configuration' => 'odm_default',
'eventmanager' => 'odm_default'
)
),
'eventmanager' => array(
'odm_default' => array(
'subscribers' => array()
)
),
),
);
Module/Admin/Src/Admin/Controller/AdminController.php
<?php
namespace Admin\Controller;
use Zend\Mvc\Controller\AbstractActionController;
use Zend\View\Model\ViewModel;
use Mongo;
use Zend\Session\SaveHandler\MongoDB;
use Zend\Session\SaveHandler\MongoDBOptions;
use Zend\Session\SessionManager;
use Admin\Document\Boutique;
class AdminController extends AbstractActionController
{
public function indexAction()
{
$dm = $this->getServiceLocator()->get('doctrine.documentmanager.odm_default');
$b = new Boutique();
/* $dm->getRepository('Admin\Document\Boutique')->findAll(); */
$dm->find('Admin\Document\Boutique', '52e6c677362dca7fcd40ab09');
}
}
Module/Admin/config/module.config.php
<?php
return array(
'controllers' => array(
'invokables' => array(
'Admin\Controller\Admin' => 'Admin\Controller\AdminController',
),
),
'router' => array(
'routes' => array(
'admin' => array(
'type' => 'segment',
'options' => array(
'route' => '/admin[/][:action][/:id]',
'constraints' => array(
'action' => '[a-zA-Z][a-zA-Z0-9_-]*',
'id' => '[0-9]+',
),
'defaults' => array(
'controller' => 'Admin\Controller\Admin',
'action' => 'index',
),
),
),
),
),
'view_manager' => array(
'template_path_stack' => array(
'admin' => __DIR__ . '/../view',
),
),
);
The purpose of the module is to connect to an existing MongoDB databate and just make a list of all the document in it.
Thank you !
Gilles
If you are using the newer mongodb extension rather than mongo extension for PHP you will need to use MongoDB\BSON\ObjectID as detailed on the php.net page
I was following this tutorial
http://www.bigwisu.com/2012/10/03/zend-framework-2-doctrine-odm
when a get this error:
The class 'Application\Document\User' was not found in the chain configured namespaces
This is my module.doctrine-mongo-odm.local.php after a little bit of testing:
<?php
return array(
'doctrine' => array(
'connection' => array(
'odm_default' => array(
'server' => 'localhost',
'port' => '27017',
'user' => '',
'password' => '',
'dbname' => 'test',
'options' => array()
),
),
'configuration' => array(
'odm_default' => array(
'metadata_cache' => 'array',
'driver' => 'odm_default',
'generate_proxies' => true,
'proxy_dir' => 'data/DoctrineMongoODMModule/Proxy',
'proxy_namespace' => 'DoctrineMongoODMModule\Proxy',
'generate_hydrators' => true,
'hydrator_dir' => 'data/DoctrineMongoODMModule/Hydrator',
'hydrator_namespace' => 'DoctrineMongoODMModule\Hydrator',
'default_db' => 'test',
'filters' => array(), // array('filterName' => 'BSON\Filter\Class'),
'logger' => null // 'DoctrineMongoODMModule\Logging\DebugStack'
)
),
'odm_default' => array(
'drivers' => array(
'Application\Document' => 'odm_driver'
)
),
'odm_driver' => array(
'class' => 'Doctrine\ODM\MongoDB\Mapping\Driver\AnnotationDriver',
'cache' => 'array',
'paths' => array(
'module/Application/src/Application/Document'
),
),
'documentmanager' => array(
'odm_default' => array(
'connection' => 'odm_default',
'configuration' => 'odm_default',
'eventmanager' => 'odm_default'
)
),
'eventmanager' => array(
'odm_default' => array(
'subscribers' => array()
)
),
),
);
I could fix the error by adding this information to the the Application/config/module.config.php and remove it from the global conf:
<?php
namespace Application;
return array(
// routes, etc
'doctrine' => array(
'driver' => array(
'odm_driver' => array(
'class' => 'Doctrine\ODM\MongoDB\Mapping\Driver\AnnotationDriver',
'paths' => array(__DIR__ . '/../src/' . __NAMESPACE__ . '/Document')
),
'odm_default' => array(
'drivers' => array(
__NAMESPACE__ . '\Document' => 'odm_driver'
)
)
)
)
Can you explain me, why this is working? And what is the best way to go, since i need the odm in different modules? Define it in every module.config.php where its needed?
Played a little with the configs I managed to setup Global configruation.
'odm_driver' => array(
'class' => 'Doctrine\ODM\MongoDB\Mapping\Driver\AnnotationDriver',
'paths' => array(__DIR__ . '/../src/' . __NAMESPACE__ . '/Document')
),
'odm_default' => array(
'drivers' => array(
Change is here --> 'Admin\Document' => 'odm_driver'
)
)
As you can see, I've changed NAMESPACE to strict value, this made the trick. Really don't understand till the end new Namespaces in the ZF2.