I have two modules. 1) User Module and 2) RbacUser Module. RbacUser Module is depended on User Module. I extend my "User entity" from User Module in RbacUser Module and add some new attributes to User Entity like roles etc.
What i am to do is, When i used RbacUser Module, make RbacUser Module User Entity default. So schema tool know that which entity should use to create table ?
In Short Words:
if Only User Module is used then make its User Entity Default
or
if RbacUser Module is used then make its User Entity Default and ignore User's entity.
I found the solution
These are the configuration of my both modules
User Module Config file
User\Config\module.config.php
'driver' => array(
'user_driver' => array(
'class' => 'Doctrine\ORM\Mapping\Driver\AnnotationDriver',
'cache' => 'array',
'paths' => array(
__DIR__.'/../src/User/Entity',
),
),
'orm_default' => array(
'drivers' => array(
'User\Entity\User' => 'user_driver'
)
)
),
RbacUser Module config file
RbacUser\Config\module.config.php
'doctrine' => array(
'driver' => array(
'rbacuser_driver' => array(
'class' => 'Doctrine\\ORM\\Mapping\\Driver\\AnnotationDriver',
'cache' => 'array',
'paths' => array(
__DIR__.'/../src/RbacUser/Entity',
),
),
'orm_default' => array(
'drivers' => array(
'RbacUser\Entity\User' => 'rbacuser_driver'
)
)
)
)
If i don't use "User" Module doctrine driver config then my problem is solved. Is their any way to check if RbacUser Module is used then don't use doctrine driver configuration in "User" Module
You must implement an IdentityProvider in your RbacUser module and specify this configuration key
Related
I'm working with Zend 2 from a few days, and I have a little trouble. We are using doctrine, and trying to generate the data base schema from the entities. I specify in each module where doctrine should find the entities using module.config.php file of each module. Currently I have 2 modules with 2 diferent module.config files and these are the lines where I specify the paths where Doctrine should find the entities:
module.config.php (MailTemplates (Module))
'doctrine' => array(
'driver' => array(
'application_entities' => array(
'class' => 'Doctrine\ORM\Mapping\Driver\AnnotationDriver',
'cache' => 'array',
'paths' => (__DIR__ . '/../src/MailTemplates/Model')
),
'orm_default' => array(
'drivers' => array(
'MailTemplates\Model' => 'application_entities'
),
),
),
),
and module.config.php (Application (Module))
'doctrine' => array(
'driver' => array(
'application_entities' => array(
'class' => 'Doctrine\ORM\Mapping\Driver\AnnotationDriver',
'cache' => 'array',
'paths' => (__DIR__ . '/../src/Application/Entity')
),
'orm_default' => array(
'drivers' => array(
'Application\Entity' => 'application_entities'
),
),
),
),
);
When I execute the command to generate the schema from the entities (./vendor/bin/doctrine-module orm:schema-tool:create) it only creates the MailTemplate tables, and ignore the Application module ones. If I comment the lines of the module.config.php of MailTemplate module, and execute the command again, I can se that tables from the Application Module entity have been created succesfully. So I suppose that somehow the info from the 2 module.config files is being overwritten.
I need to generate the DB shema from diferent entities from different modules and I don't know how.
Thanks!!
The reason for this is that you are setting the same name to the drivers. Although zend merge the configurations, it will override configurations with same names.
module.config.php (MailTemplates (Module))
[...]
'drivers' => array(
'MailTemplates\Model' => 'application_entities' <-- rename this
)
[..]
module.config.php (Application (Module))
[...]
'drivers' => array(
'Application\Entity' => 'application_entities'
)
[..]
Zf2 module.config.php file is not overwrite. zf2 merge all module.config.php into a single file.
Zend\ModuleManager\Listener\ConfigListener triggers a special event, Zend\ModuleManager\ModuleEvent::EVENT_MERGE_CONFIG, after merging all configuration, but prior to it being passed to the ServiceManager. By listening to this event, you can inspect the merged configuration and manipulate it.
See how zend merge configuration files https://framework.zend.com/manual/2.4/en/tutorials/config.advanced.html#configuration-mapping-table
I have several modules in my zf2 application, they all have their own entities and all on the same connection.
A little diagram to explain the situation :
-Module 1
-Entity A
-Entity B
-Module 2
-Entity C
-Entity B
(all on the same database connection)
The problem is all the entities are working, i can fetch, update them, etc. but some are "invisible". I have some cross-module relations and they are working fine too.
For exemple, all entities from module 2 does not appear when I use the php public/index.php orm:info command nor in the Zend Developer Toolbar.
When I edit an entity, I have to manually update the database as php public/index.php orm:schema-tool:update says Nothing to update - your database is already in sync with the current entity metadata.
The entities can be fetched, they are just not "seen" by the ZDT nor the terminal, I don't know what I did wrong.
Thanks for your help
This is often caused when the path to the entities has not been declared in your config:
<?php
return array(
'doctrine' => array(
'driver' => array(
// defines an annotation driver with two paths, and names it `my_annotation_driver`
'my_annotation_driver' => array(
'class' => 'Doctrine\ORM\Mapping\Driver\AnnotationDriver',
'cache' => 'array',
'paths' => array(
'path/to/my/entities',
'another/path'
),
),
// default metadata driver, aggregates all other drivers into a single one.
// Override `orm_default` only if you know what you're doing
'orm_default' => array(
'drivers' => array(
// register `my_annotation_driver` for any entity under namespace `My\Namespace`
'My\Namespace' => 'my_annotation_driver'
)
)
)
)
);
Configuration of doctrine in Zend Framework:
This is the configuration to use mysql driver but i want tu use the PDO database driver for ibase.
<?php
return array(
'doctrine' => array(
'connection' => array(
'orm_default' => array(
'driverClass' => 'Doctrine\DBAL\Driver\PDOMySql\Driver',
'params' => array(
'driver_options' => array(
PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES UTF8'
),
),
),
)
));
?>
Dbal Doctrine driver for firebird is a work in progress not yet merged on github
http://www.doctrine-project.org/jira/browse/DBAL-95
I have requested the patch and it will be integrated soon
On the Zend Framework side it should be possible to use the pdo addapter without dbal (unsupported yet)
https://zf2.readthedocs.org/en/latest/modules/zend.db.adapter.html#zend-db-adapter
Thanks!
Looks like meanwhile i can use the PDO for Ibase with a Zend Adapter
return array(
'db' => array(
'driver' => 'PDO_FIREBIRD',
'database' => 'localhost:C:\Base.FDB',
'username' => 'SYSDBA',
'password' => 'masterkey',
),
);
Well the question pretty much lies in the title. I've read the docs and what I can't find out is how to register the function to my ORM Configuration.
Any help here? Thanks!
Edit: Okay I've done it as Sam said, and made my own class and registered it like
'numeric_functions' => array(
'LOG10' => 'Admin\Model\Log10',
),
However it can't find the class and gives the error
Class 'Admin\Model\Log10' not found in C:\webserver\apache\htdocs\test\vendor\doctrine\orm\lib\Doctrine\ORM\Query\Parser.php on line 3322
Any idea on why this happens?
Actually the link that #foozy gave you is all that you'd need. You simply extend your doctrine configuration array:
return array(
'doctrine' => array(
'connection' => array(
'orm_default' => array(
// Foo
)
),
'configuration' => array(
'orm_default' => array(
'numeric_functions' => array(
'MD5' => 'DoctrineExtensions\Query\Mysql\Md5'
),
'datetime_functions' => array(),
'string_functions' => array(),
'metadata_cache' => 'filesystem',
'query_cache' => 'filesystem',
'result_cache' => 'filesystem',
)
)
)
);
The error is connected to DoctrineExtensions autoload. For me both solutions from How to implement beberlei doctrine extensions in zend framework 2 (manual injection of custom functions and applying via config) worked.
I have a ZF2 2.1.3 app with Doctrine 2.
I installed using composer:
"zendframework/zendframework": "2.*"
,"doctrine/doctrine-orm-module": "dev-master"
A create a file config/autoload/database.local.php with the following:
return array(
'doctrine' => array(
'connection' => array(
// Default connection name
'orm_default' => array(
'driverClass' => 'Doctrine\DBAL\Driver\PDOMySql\Driver',
'params' => array(
'host' => 'localhost',
'port' => '3306',
'dbname' => 'zf2-experimental',
'user' => 'root',
'password' => '',
),
),
),
),
);
I create my entity Bar under Foo module (src/Business/Entity/Bar.php) and configure it on module.config.php like this:
'doctrine' => array(
'driver' => array(
__NAMESPACE__ . '_driver' => array(
'class' => 'Doctrine\ORM\Mapping\Driver\AnnotationDriver',
'cache' => 'array',
'paths' => array(__DIR__ . '/../src/' . __NAMESPACE__ . '/Business/Entity'),
),
'orm_default' => array(
'drivers' => array(
__NAMESPACE__ . '\Business\Entity' => __NAMESPACE__ . '_driver',
),
),
),
),
Ok! It's exactly at Sam says here!
Then I create a simple Foo entity and run the doctrine cli tool:
c:\wamp\www\zf2-Experimental>.\vendor\bin\doctrine-module.bat orm:validate-schema
[Mapping] OK - The mapping files are correct.
[PDOException]
SQLSTATE[28000] [1045] Access denied for user 'username'#'localhost' (using password: YES)
orm:validate-schema
c:\wamp\www\zf2-Experimental>
Looks like the cli tool can get my connection parameters in my config/autoload/database.local.php!
On Application index I tested my config:
$config = $this->getServiceLocator()->get('config');
\Zend\Debug\Debug::dump($config['doctrine']['connection']['orm_default']);
And this returned:
array (size=4)
'configuration' => string 'orm_default' (length=11)
'eventmanager' => string 'orm_default' (length=11)
'params' =>
array (size=5)
'host' => string 'localhost' (length=9)
'port' => string '3306' (length=4)
'user' => string 'root' (length=4)
'password' => string '' (length=0)
'dbname' => string 'zf2-experimental' (length=16)
'driverClass' => string 'Doctrine\DBAL\Driver\PDOMySql\Driver' (length=36)
Someone can, please, help me?! :)
Thanks you all!
Well, I waste a lot of time trying to solve this and finally did.
I forgot to mention that I using ZF1 environment-specific configurations style!
You can see here!
I create my database config file in the following structure (I didn't mention this before, because I thought It wouldn't interfere on the question):
'module_listener_options' => array(
'config_glob_paths' => array(
'config/autoload/{,*.}{global,local}.php',
// Here! My config path is config/autoload/app_env/development/
'config/autoload/app_env/' . (getenv('APPLICATION_ENV') ?: 'production') . '{,*.}.local.php',
),
So, my database configs actually are in config/autoload/app_env/development/database.local.php!
When I copy-paste the file to config/autoload/database.local.php my CLI Tool works!
But WHY? Why the Cli Tool can't look for the config file inside another directory?
There is a way to work with sub-folders?
Thanks for the help!