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!
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 get the following error when I try to use an entity in my controller:
The class 'Application\Entity\User' was not found in the chain configured namespaces in C:\xampp\htdocs\zf2_pr6\vendor\doctrine\common\lib\Doctrine\Common\Persistence\Mapping\MappingException.php:37
My module.config.php configuration includes
'doctrine' => array(
'driver' => array(
'application_entities' => array(
'class' => 'Doctrine\ORM\Mapping\Driver\AnnotationDriver',
'cache' => 'array',
'paths' => array(__DIR__ . '/../src/Application/Entity')
),
),
'connection' => array(
'orm_default' => array(
'driverClass' => 'Doctrine\DBAL\Driver\PDOMysql\Driver',
'params' => array(
'host' => 'localhost',
'port' => '3306',
'user' => 'root',
'password' => '',
'dbname' => 'zf2',
),
),
),
),
'orm_default' => array(
'drivers' => array(
'Application\Entity' => 'application_entities',
),
),
I've also created a paste bin of other relevant files
Application\Entity\User
Application\Contorller\IndexController
How can I resolve this error add my driver to the chain of configured namespaces?
Your configuration is incorrect. At the moment you have the 'orm_default' config under the 'doctrine' key - Meaning the driver is never added to Doctrine.
You need to have the driver configuration and the 'orm_default' config sitting at the same level, under doctrine/driver.
'doctrine' => array(
'driver' => array(
'application_entities' => array(
'class' => 'Doctrine\ORM\Mapping\Driver\AnnotationDriver',
'cache' => 'array',
'paths' => array(__DIR__ . '/../src/Application/Entity')
),
'orm_default' => array(
'drivers' => array(
'Application\Entity' => 'application_entities',
),
),
)
),
i am using Zendframework 2 . i wonder if it possible to use both table gateway and doctrine 2 in the same application.
below is my configuration. i tried to run it but i noticed that the speed of my application slowed down considrable.
i was wondering if this was beucase there is a conflict between both applications or because i have not configured it properly.
global PHP file
return array(
'db' => array(
'driver' => 'Pdo',
'dsn' => 'mysql:dbname=thetable;host=localhost',
'driver_options' => array(
PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES \'UTF8\''
),
),
'service_manager' => array(
'factories' => array(
'Zend\Db\Adapter\Adapter'
=> 'Zend\Db\Adapter\AdapterServiceFactory',
),
),
);
local php
return array(
'db' => array(
'username' => 'user',
'password' => 'password',
),
'doctrine' => array(
'connection' => array(
'orm_default' => array(
'driverClass' => 'Doctrine\DBAL\Driver\PDOMySql\Driver',
'params' => array(
'host' => 'localhost',
'port' => '3306',
'user' => 'user',
'password' => 'password',
'dbname' => 'thetable'
)
)
)
),
);
I am using doctrine 2 within zend framework 2. To generate entities using database table, the console command used is:
php doctrine-module orm:convert-mapping --force --from-database annotation ./export
When i run above command, it throws an error:
Unknown database type enum requested
How to solve this issue?
You can add:
'doctrine_type_mappings' => array(
'enum' => 'string'
)
in your global configuration file located in /config/autoload/global.php.
Example code:
return array(
'doctrine' => array(
'connection' => array(
'orm_default' => array(
'driverClass' =>'Doctrine\DBAL\Driver\PDOMySql\Driver',
'params' => array(
'host' => 'localhost',
'port' => '3306',
'user' => 'username',
'password' => 'password',
'dbname' => 'DevBrew',
),
// To automatically convert enum to string
'doctrine_type_mappings' => array(
'enum' => 'string'
),
)
)
)
);
I'm using the DoctrineORMModule to integrate Doctrine2 with Zend2. Everything works just fine when I'm using the AnnotationDriver as described in various examples. However, I cannot get the YamlDriver to work. In my module.config.php I tried:
'doctrine' => array(
'driver' => array(
'ApplicationDriver' => array(
'class' => 'Doctrine\ORM\Mapping\Driver\AnnotationDriver',
'cache' => 'array',
'paths' => array(__DIR__ . '/../src/Application/Entity')
),
'YamlDriver' => array(
'class' => 'Doctrine\ORM\Mapping\Driver\YamlDriver',
'cache' => 'array',
'extension' => '.dcm.yml',
'paths' => array(__DIR__ . '/../src/Application/Mapping')
),
'orm_default' => array(
'drivers' => array(
'Application\Entity' => 'ApplicationDriver',
'Application\Mapping' => 'YamlDriver'
)
)
)
)
However, the EntityManager cannot find my classes. Cam you give me a working example of how to use yaml with doctrine2 and zend2?
I assume your entities are in namespace Application\Entity: this means your driver should be assigned for that namespace as in following example:
'doctrine' => array(
'driver' => array(
'MyYamlDriver' => array(
'class' => 'Doctrine\ORM\Mapping\Driver\YamlDriver',
'cache' => 'array',
'extension' => '.dcm.yml',
'paths' => array(__DIR__ . '/mappings')
),
'orm_default' => array(
'drivers' => array(
'Application\Entity' => 'MyYamlDriver',
)
)
)
)
Basically, the configuration maps a particular named driver to a namespace that you want to use. In this case, MyYamlDriver is assigned to handle any mapping for the namespace Application\Entity