I'm trying to set a different entity listener resolver because I want to use a couple of services among a few lifecycle callbacks. I googled out some answers that say it should be set in config the way similar to this one:
doctrine:
dbal:
driver: "%database_driver%"
host: "%database_host%"
port: "%database_port%"
dbname: "%database_name%"
user: "%database_user%"
password: "%database_password%"
charset: UTF8
orm:
auto_generate_proxy_classes: "%kernel.debug%"
auto_mapping: true
entity_listener_resolver: {HERE!}
However, when I do it this way, I get the following error:
Unrecognized options "entity_listener_resolver" under "doctrine.orm.entity_
managers.default"
Moreover, when I look at the configuration reference, I don't see such option anywhere or an option to set it: http://symfony.com/doc/current/reference/configuration/doctrine.html
So how do I change the entity listener resolver?
I'm using the newest Sf 2.5 version.
I'm running into the same issue, when using "doctrine/doctrine-bundle": "~1.2".
You have two options.
1) Use doctrine/doctrine-bundle 1.3 Beta, where the key entity_listener_resolver exists.
2) Or use the following gist to get it working without using the key: https://gist.github.com/vadim2404/9538227
More infos: http://egeloen.fr/2013/12/01/symfony2-doctrine2-entity-listener-as-serice/
Thx to the guy from the irc channel.
You can use it like this only in the services.yml for a specific bundle:
orm:
entity_listener_resolver: {your_entity_listener_resolver}
But in the config.yml file you need to set the entity listener resolver for a specific entity manager for example the default one:
orm:
entity_managers:
default:
entity_listener_resolver: {your_entity_listener_resolver}
Related
I use doctrine ORM in a Symfony 2.8 project.
My project contains several Bundles. For one Bundle, which generates Reports I want to use the db server with the slave replication as not to stress the master db server.
How to set this up?
What I tried so far:
In the config.yml
Doctrine Configuration
doctrine:
dbal:
default_connection: default
connections:
default:
driver: pdo_mysql
host: '%database_host%'
port: '%database_port%'
dbname: '%database_name%'
user: '%database_user%'
password: '%database_password%'
charset: UTF8
slave:
driver: pdo_mysql
host: '%database_host_slave%'
port: '%database_port_slave%'
dbname: '%database_name_slave%'
user: '%database_user_slave%'
password: '%database_password_slave%'
charset: UTF8
Here I created my second db connection with the values stored in my parameters.yml.
I seem to get the orm configuration I tried to setup in the same file not correctly.
Let my first explain what I need:
I have a "ReportingBundle" which runs a console command. The entity manager is only needed to provide the proper authorization to the needed db server. The queries itself are oure SQL and I don't use the entities.
my service.yml for this bundle:
services:
myproject.reporting.service.csv_report_attachment:
class: Myproject\ReportingBundle\Service\DefaultCsvReportAttachmentService
arguments: ['#doctrine.orm.slave_entity_manager', '#logger', '#myproject.reporting.service.php_template_engine', 'reportingHtmlMailTemplate.php']
Now my non functioning orm setup in the config.yml:
ORM configuration
orm:
auto_generate_proxy_classes: '%kernel.debug%'
# naming_strategy: doctrine.orm.naming_strategy.underscore
default_entity_manager: default
entity_managers:
slave:
connection: slave
mappings:
MyprojectReportingBundle: ~
default:
connection: default
auto_mapping : true
metadata_cache_driver: redis
query_cache_driver: redis
result_cache_driver: redis
This results in
[Doctrine\ORM\ORMException]
Unknown Entity namespace alias 'MyprojectReportingBundle'.
I tried to follow the documentation here:
http://symfony.com/doc/current/reference/configuration/doctrine.html#custom-mapping-entities-in-a-bundle
Question:
What is the correct syntax, so that my query is run on the slave server instead of the default server?
I believe you have everything configured correctly. However, you need to make sure the Entity classes are defined in the Bundle namespace. So for example you'd want to have all the entities defined within Myproject\ReportingBundle\Entity in your example.
I am using symfony 2.6 (composer.json equal to its github repo) and I am trying to use the schema filter of DBAL.
in config.yml
# Doctrine Configuration
doctrine:
dbal:
schema_filter: ^sf2_
but error returned on shell:
[Symfony\Component\Config\Definition\Exception\InvalidConfigurationException]
Unrecognized option "schema_filter" under "doctrine.dbal"
What am I missing?
EDIT:
config.yml (doctrine part only)
doctrine:
dbal:
default_connection: default
connections:
default:
driver: "%database.driver%"
host: "%database.master.host%"
port: "%database.master.port%"
dbname: "%database.master.dbname%"
user: "%database.master.user%"
password: "%database.master.password%"
charset: UTF8
options:
1002: "SET NAMES 'UTF8'"
# if using pdo_sqlite as your database driver, add the path in parameters.yml
# e.g. database_path: "%kernel.root_dir%/data/data.db3"
# path: "%database_path%"
slaves:
slave1:
host: "%database.slave1.host%"
port: "%database.slave1.port%"
dbname: "%database.slave1.dbname%"
user: "%database.slave1.user%"
password: "%database.slave1.password%"
mapping_types:
enum: string
set: string
bit: boolean
types:
# some types
orm:
auto_generate_proxy_classes: "%kernel.debug%"
default_entity_manager: default
entity_managers:
default:
connection: default
(POST) CONSIDERATION:
Anyway the schema_filter does not fit my requirements it is too vague to define with a reg exp (I mean for my actual schema is required a too complex reg exp and it is not pratical at all). I posted in doctrine2 groups a request for "enhancing" this option.
https://groups.google.com/forum/#!topic/doctrine-user/Tr4kkpIxwRk
What is your exact symfony version? I tried this config option with Symfony 2.6.5 and everything works fine.
Do you happen to have multiple connections? There is a note in documentation about this, at the end of the page:
Note that if you have multiple connections configured then the schema_filter configuration will need to be placed per-connection.
Manual tables
The schema_filter parameter is part of the Doctrine Migrations bundle. Do you have that installed?
I have setup a SonataAdminBundle on my Symfony 2.1.2 project and it works correctly. Now I´m trying to setup a SonataMediaBundle but I get this error:
==> php app/console sonata:easy-extends:generate SonataMediaBundle
[Symfony\Component\DependencyInjection\Exception\ParameterNotFoundException]
You have requested a non-existent parameter "doctrine.connections".
I copied the config parameters to config.yml as indicates the documentation. You can see it there: http://pastebin.com/wys11net
Any help or clue?
Thanks in advance
Looks like you're missing the Connections node inside the Doctrine > DBAL's node, aswell the specification of a default connection (among multiple connections, if that would be the case).
An example of the right template would be like
doctrine:
dbal:
default_connection: default
connections:
default:
driver: %database_driver%
host: %database_host%
port: %database_port%
dbname: %database_name%
user: %database_user%
password: %database_password%
charset: UTF8
I just ran into this problem as well, and found that the "connections" node is not actually required in the config (see http://symfony.com/doc/current/reference/configuration/doctrine.html#doctrine-dbal-configuration ... you only need the connections node when you have multiple connections).
In my case, it was that I had the SonataCacheBundle in the AppKernel.php file before Doctrine. Doctrine sets the "doctrine.connections" parameter when Doctrine initializes, so if you try to access it in SonataCacheBundle before Doctrine has initialized then "doctrine.connections" is not in the container yet.
Reordering the entries in AppKernel.php fixed the issue for me.
I have an app that talks to two different databases. For one of my entities, School, I get the following error:
SQLSTATE[42S02]: Base table or view not found: 1146 Table 'pressbox.schools' doesn't exist
That makes sense because there is no pressbox.schools. It's fnt.schools. It's trying to talk to the wrong database.
How do I tell my entity which mapping I want it to use? I would of course rather refer to the mappings than to the database names themselves, which can be different depending on the environment.
First, declare your connections in a config file (config.yml would be fine):
doctrine:
dbal:
default_connection: pressbox # change it as you wish
connections:
pressbox:
driver: %database_driver%
host: %database_host%
port: %database_port%
dbname: pressbox
user: pressbox_usr
password: pressbox_pwd
charset: UTF8
fnt:
driver: %database_driver%
host: %database_host%
port: %database_port%
dbname: fnt
user: fnt_usr
password: fnt_pwd
charset: UTF8
Then declare the entity managers:
doctrine:
orm:
default_entity_manager: pressbox
entity_managers:
pressbox:
connection: web
fnt:
connection: fnt
Now, in a controller, you can tell Doctrine which entity manager to use by passing its name to getEntityManager():
$fntEm = $this->getDoctrine()->getEntityManager('fnt');
Assuming the entity manager for the fnt table is called that same name.
i think cross database relations are pretty complicated or you have to code by hand through some plugin.
i found this question about the same topic which might help you:
Multiple database connection in Doctrine2 and Zend framework
I have two connections in config. And one of my bundles will use them together, but how i can specify which is used by entity class in that class?
Thanks for answering!
I'm not sure if one of your bundle will use one connection and another bundle will use the other one. Because you talking about class in your question:
... but how i can specify which is used by entity class in that class?
I will assume that one of your bundle which has entities will use a specific connection to map those entities to your database. To do this, you should provide the connection key in your configuration, something like this:
doctrine:
default_connection: default
connections:
default:
driver: "%database_driver%"
host: "%database_host%"
port: "%database_port%"
dbname: "%database_name%"
user: "%database_user%"
password: "%database_password%"
charset: UTF8
other:
driver: "%database_driver%"
host: "%database_host%"
port: "%database_port%"
dbname: "%database_name%"
user: "%database_user%"
password: "%database_password%"
charset: UTF8
orm:
auto_generate_proxy_classes: "%kernel.debug%"
default_entity_manager: default # The default entity manager if you specify more than one
entity_managers:
default:
# The name of a DBAL connection (the one marked as default is used if not set)
connection: other
mappings: # Required
AcmeHelloBundle: ~
# You can specify more bundle here
Moreover, I think it is even possible to specify specific classes as a list below the node AcmeHelloBundle. You will need to investigate this further to see if it possible.
You can check the doctrine configuration reference here for more configuration options for doctrine.
Hope this helps and that was what you were looking for.
Regards,
Matt