How to create doctrine DBAL default connection? - php

I want to create my own handler for monolog using this tutorial.
Now as my handler required PDO connection like this
$logger->pushHandler(new LogHandler(new PDO("mysql:host=$host;dbname=$dbname", $user, $pass)));
$logger->addInfo('My logger is now ready');
Then this guy told me insert that connection as service
LIke this
doctrine.dbal.default.wrapped_connection:
factory_service: doctrine.dbal.default_connection
factory_method: getWrappedConnection
class: PDO
my.monologhandler.pdo:
class: sojeans\BackBundle\Monolog\Handler\PDOHandler
arguments:
- '#doctrine.dbal.default.wrapped_connection'
tags:
- { name: log_handler }
But i am getting circular reference error so other guy told to do this
there is a circular reference here: you need to create the doctrine.dbal.default_connection service to create the doctrine.dbal.default.wrapped_connection`` (as it is used a factory service) and this service uses the logger.
But I don't know how to do that.

Try to add a new connection to your doctrine configuration that has no debug nor profiling:
doctrine:
dbal:
connections:
default:
driver: %database_driver%
host: %database_host%
port: %database_port%
dbname: %database_name%
user: %database_user%
password: %database_password%
charset: UTF8
logger:
driver: %database_driver%
host: %database_host%
port: %database_port%
dbname: %database_name%
user: %database_user%
password: %database_password%
charset: UTF8
logging: false
profiling: false
Then use the new logger_connection services:
doctrine.dbal.logger.wrapped_connection:
factory_service: doctrine.dbal.logger_connection
factory_method: getWrappedConnection
class: PDO
my.monologhandler.pdo:
class: sojeans\BackBundle\Monolog\Handler\PDOHandler
arguments:
- #doctrine.dbal.logger.wrapped_connection
tags:
- { name: log_handler }
Let me know if this works.

Related

No transport supports the given Messenger DSN doctrine

I am getting an error No transport supports the given Messenger DSN "doctrine://default" when executing command messenger:setup-transports for Symfony messenger.
Handling messages synchronously for the message, handler, and dispatcher works.
Symfony: 4.4.2
Symfony/messenger: 4.4
doctrine/orm: 2.7
messenger.yml
messenger:
default_bus: messenger.bus.default
transports:
async: 'doctrine://default'
doctrine.yml
doctrine:
dbal:
default_connection: default
connections:
default:
driver: "%database_driver%"
port: "%database_port%"
host: "%database_host%"
dbname: "%database_name%"
user: "%database_user%"
password: "%database_password%"

Codeception acceptance tests with Symfonys MasterSlaveConnection throws Exception

I'm using codeception (acceptance tests) in combination with the Symfony and Doctrine2 modules.
When I configure Symfony to use a single database connection, everything works fine and my tests finish. But as soon as I add database slave connections, the following exception appears and the test failes:
1) SomeCest: Some test
Test tests/acceptance/SomeCest.php:someTest
[PHPUnit\Framework\Exception] Undefined property: Doctrine\DBAL\Connections\MasterSlaveConnection::$_conn
#1 /var/www/vendor/doctrine/dbal/lib/Doctrine/DBAL/Connections/MasterSlaveConnection.php:154
#2 Codeception\Subscriber\Module->before
#3 /var/www/vendor/symfony/symfony/src/Symfony/Component/EventDispatcher/EventDispatcher.php:184
#4 /var/www/vendor/symfony/symfony/src/Symfony/Component/EventDispatcher/EventDispatcher.php:46
I cannot understand how this error arises, because in the stated file (MasterSlaveConnection.php) the class is clearly extended from Connection, in which the property $_conn is defined.
Can someone help me with that? Is this a bug and I should open up a bug report on the codeception github page? Or am I doing something wrong? Thank you in advance!
acceptance.suite.yml:
actor: AcceptanceTester
modules:
enabled:
- Symfony:
part: SERVICES
environment: 'prod'
- Doctrine2:
depends: Symfony
cleanup: false
- WebDriver:
url: 'http://localhost/'
browser: phantomjs
restart: true
clear_cookies: true
log_js_errors: true
window_size: 1960x1080
app/config/config.yml with single database configuration:
doctrine:
dbal:
driver: "%database_driver%"
host: "%database_host%"
port: "%database_port%"
dbname: "%database_name%"
user: "%database_user%"
password: "%database_password%"
charset: UTF8
app/config/config.yml with multiple database configuration:
doctrine:
dbal:
driver: "%database_driver%"
host: "%database_host%"
port: "%database_port%"
dbname: "%database_name%"
user: "%database_user%"
password: "%database_password%"
charset: UTF8
slaves:
slave1:
host: "%database_host2%"
dbname: "%database_name%"
user: "%database_user%"
password: "%database_password%"
slave2:
host: "%database_host3%"
dbname: "%database_name%"
user: "%database_user%"
password: "%database_password%"
I'm using symfony 2.8.25 and codeception 2.3.4

Doctrine. Injecting additional parameter into dbal configuration

I have MySQL cluster with master server and 4 slaves.
The site based on Symfony3, Doctrine is used as ORM and DBAL.
My config for Doctrine looks like this:
doctrine:
dbal:
default_connection: default
connections:
default:
dbname: "%default_db_master_name%"
host: "%default_db_master_host%"
port: "%default_db_master_port%"
user: "%default_db_master_user%"
password: "%default_db_master_password%"
charset: UTF8
driver: "%default_db_master_driver%"
logging: "%kernel.debug%"
profiling: "%kernel.debug%"
wrapper_class: AppBundle\Connection\AppMasterSlaveConnection
mapping_types:
enum: string
slaves:
slave1:
host: "%default_db_slave1_host%"
port: "%default_db_slave_port%"
dbname: "%default_db_slave_name%"
user: "%default_db_slave_user%"
password: "%default_db_slave_password%"
slave2:
host: "%default_db_slave2_host%"
port: "%default_db_slave_port%"
dbname: "%default_db_slave_name%"
user: "%default_db_slave_user%"
password: "%default_db_slave_password%"
I would like to add weights for slaves, because they hardware is not equal, some of them are more productive, some less.
Also I would like to inject memcache service (or inject params for creating cache service object) for putting temporarely dns which are overloaded by requests and give them chance to back to normal.
For example, I want to inject weight param for slaves following way:
slave1:
host: "%default_db_slave1_host%"
port: "%default_db_slave_port%"
dbname: "%default_db_slave_name%"
user: "%default_db_slave_user%"
password: "%default_db_slave_password%"
weight: "%default_db_slave1_weight%"
slave2:
host: "%default_db_slave2_host%"
port: "%default_db_slave_port%"
dbname: "%default_db_slave_name%"
user: "%default_db_slave_user%"
password: "%default_db_slave_password%"
weight: "%default_db_slave2_weight%"
When I add this option, I receive an error
InvalidConfigurationException in ArrayNode.php line 317:
Unrecognized option "weight" under "doctrine.dbal.connections.default.slaves.slave1"
I don't know how to do it. I have just one idea, transfer all these params via Driver options,something like this
logging: "%kernel.debug%"
profiling: "%kernel.debug%"
wrapper_class: AppBundle\Connection\AppMasterSlaveConnection
options:
slave1: 5
slave2: 25
slave3: 45
slave4: 25
cache: '%memcached_db%'
mapping_types:
enum: string
slaves:
slave1:
But it looks awful.
Help me please.

Cannot connect database oracle with symfony2

what i need
i need to connect oracle database with symfony2.
i have checked by php -m
oci8
pdo_odbc
odbc
here is the link i follow https://gist.github.com/johnkary/6481664
a.)config.yml
Doctrine Configuration
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: "%database_charset%"
b.) parameter.yml
# If connecting via SID
parameters:
database_driver: oci8
database_host: abc
database_port: '1521'
database_name: test
database_user: aa
database_password: aa
database_charset: AL32UTF8
mailer_transport: smtp
mailer_host: 127.0.0.1
mailer_user: null
mailer_password: null
locale: en
secret: zzzz
c.)services.orcale.yml
services:
acme.doctrine.dbal.events.oracle_session_init.listener:
class: %doctrine.dbal.events.oracle_session_init.class%
tags:
- { name: doctrine.event_listener, event: postConnect }
acme.doctrine.dbal.oracle_platform.type_mapping.listener:
class: Acme\MisBundle\Listener\OracleDoctrineTypeMappingListener
tags:
- { name: doctrine.event_listener, event: postConnect }
then run symfony database cmd
php bin/console doctrine:database:create
error:
cannot create database test for connection named default.
notice: undefined index dbname
i have googled a day but i think there are few developer who works with symfony2 and oracle.
i had made simple php script that works to test connections
$userName = ""; $password = ""; $dtabasePort = "1521"; $serverName = "";
$databaseName = "testingdb";
$c = oci_connect($userName, $password, '(DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = host)(PORT = 1521)) (CONNECT_DATA = (SERVICE_NAME = ) (SID =)))');
print_r($c);
output
Resource id #3
tsnames.ora
test=
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = sss)(PORT = 1521))
(CONNECT_DATA = (SID = test))
)
i have worked sf3 and mysql but im new to oracle thats why i don"t knew how to connect oracle db with symfony.
please give some solution where i have done wrong.
Can anyone suggest in steps how to connect oracle db with sf2/3 is most appreciated.
link of github relies same issue that im facing https://github.com/doctrine/dbal/issues/1564
i have also changed the parameter.yml file
parameters:
database_driver: oci8
database_user: <user>
database_password: <password>
database_charset: WE8MSWIN1252
database_name: (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=<host>)(PORT=<port>))(CONNECT_DATA=(SERVICE_NAME=<service_name>)))
then error you have requested non-existence parameter "database_host"
last & final solution i tried but didn"t worked i think there bug in sf2 for oracle
parameters:
database_driver: oci8
database_host:
database_port: 1521
database_name:
database_user:
database_password:
domain_name:
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
persistent: true
orm:
auto_generate_proxy_classes: "%kernel.debug%"
auto_mapping: true
services:
pdo:
class: PDO
arguments:
- "oci8:Server=%database_host%;Database=%database_name%"
- "%database_user%"
- "%database_password%"
calls:
- [setAttribute, [3, 2]] # \PDO::ATTR_ERRMODE, \PDO::ERRMODE_EXCEPTION
session.handler.pdo:
class: ESERV\MAIN\FrameworkChanges\MtlPdoSessionHandler
arguments: ["#pdo", "%pdo.db_options%"]
here is what I use to connect MSSQL : https://github.com/realestateconz/MssqlBundle
config.yml :
doctrine:
dbal:
types:
string: ***\BacsManagementBundle\Type\StringType
default_connection: default
connections:
default:
host: "%database_host%"
dbname: "%database_name%"
user: "%database_user%"
password: "%database_password%"
driver_class: Realestate\MssqlBundle\Driver\PDODblib\Driver
mapping_types:
enum: string
string: string
hope it helps.
This might be a little old but I think it is still useful. I am working on a Symfony 5 project connected to a legacy Oracle 11G database. For the most part Doctrine works fine. In some cases you need to perform a raw query.
Your env file:
DATABASE_URL2="oci8://USERNAME:PASSWORD#HOSTNAME:1521/DATABASENAME"
Note: if you are using Oracle 11G Express Edition your database name most likely will be XE
Next update your doctrine.yaml file. In my case I have two databases. The default one is MySQL and the 2nd database is Oracle 11G. It would also be a good idea to install the DoctrineExtensions package that gives a little more support to Oracle and MySQL in Doctrine.
doctrine:
dbal:
default_connection: default
connections:
default:
# configure these for your database server
url: '%env(resolve:DATABASE_URL)%'
driver: 'pdo_mysql'
server_version: '5.7'
charset: utf8mb4
mapping_types:
enum: string
default_table_options:
charset: utf8mb4
collate: utf8mb4_unicode_ci
oracle:
# configure these for your database server
url: '%env(resolve:DATABASE_URL2)%'
driver: 'oci8'
server_version: '11'
charset: AL32UTF8
orm:
auto_generate_proxy_classes: '%kernel.debug%'
default_entity_manager: default
entity_managers:
default:
naming_strategy: doctrine.orm.naming_strategy.underscore_number_aware
connection: default
auto_mapping: true
dql:
numeric_functions:
rand: DoctrineExtensions\Query\Mysql\Rand
datetime_functions:
DATE_FORMAT: DoctrineExtensions\Query\Mysql\DateFormat
mappings:
App:
is_bundle: false
type: annotation
dir: '%kernel.project_dir%/src/Entity'
prefix: 'App\Entity'
alias: App
oracle:
naming_strategy: doctrine.orm.naming_strategy.underscore_number_aware
connection: oracle
dql:
datetime_functions:
TO_CHAR: DoctrineExtensions\Query\Oracle\ToChar
TO_DATE: DoctrineExtensions\Query\Oracle\ToDate
mappings:
Oracle:
is_bundle: false
type: annotation
dir: '%kernel.project_dir%/src/Entity/Oracle'
prefix: 'App\Entity\Oracle'
alias: Oracle
Now this is where it gets tricky. My database does not have any primary keys so I had to add them manually to each table in order to import the entities. Once I imported the entities I then removed the primary keys and updated the entities manually.
php bin/console doctrine:mapping:import "App\Entity\Oracle" annotation --path=src/Entity/Oracle --em=oracle
You should now be able to use Doctrine to perform a query. I like using repositories so I do not use Query Builder.
Example:
public function getEmployeeInfo($clientID)
{
$sql =
"
SELECT
p.employeeId,
p.clientId,
p.firstname,
p.lastname
FROM
Oracle:Phoneext p
WHERE
p.clientId = :clientID
ORDER BY p.lastname ASC
"
;
$query = $this->getEntityManager()->createQuery($sql);
$query->setParameter('clientID', $clientID);
$results = $query->getResult();
return ($results);
}
In a case you need to perform a RAW query:
public function getMultiStatusRowId($employeeID, $status, $date, $time, $em)
{
$conn = $em->getConnection();
$sql =
"
SELECT
ROWIDTOCHAR(ROWID) as row_id
FROM
MULTI_STATUS
WHERE
EMPLOYEE_ID = ?
AND STATUS = ?
AND IN_DATE = ?
AND IN_TIME = ?
ORDER BY ORDER_NUM ASC
"
;
$result = $conn->prepare($sql);
$result->bindValue(1, $employeeID);
$result->bindValue(2, $status);
$result->bindValue(3, $date);
$result->bindValue(4, $time);
$result->execute();
$data = array();
$i = "0";
while ($row = $result->fetch()) {
$data[$i]['ROW_ID'] = $row['ROW_ID'];
$i++;
}
return $data;
}
One final item if you need help setting up a local system on a Mac you can use this to help setup Lando. Note I had to setup Oracle 11G on AWS EC2 then was able to use the IMP tool to import my dump files.
If you setup RDS Amazon will default to Oracle 20 or some newer version. AWS RDS does not support the older backups from IMP. RDS will only support data pump using S3.
https://github.com/rsaylor73/lando-apache-php-mysql-oci8

The class 'ScheduleBundle\Entity\schedule' was not found in the chain configured namespaces StudentsBundle\Entity

I am making a application with multiply bundels and database connections.
I keep getting this error:
The class 'ScheduleBundle\Entity\schedule' was not found in the chain configured namespaces StudentsBundle\Entity
500 Internal Server Error - MappingException
Here is the code from the controller
<?php
namespace ScheduleBundle\Controller;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;
use Symfony\Component\HttpFoundation\Response;
//Json Response
use Symfony\Component\HttpFoundation\JsonResponse;
//Class Controller
use Symfony\Bundle\FrameworkBundle\Controller\Controller;
//Request
use Symfony\Component\HttpFoundation\Request;
use ScheduleBundle\Entity\schedule;
class ApiController extends Controller
{
/**
* #Route("/api/{week}")
*/
public function roosterApi(Request $request, $week)
{
$rooster = array('week' => '1');
$entityManager = $this->get('doctrine')->getManager();
$roosterConnection = $this->get('doctrine')->getRepository('ScheduleBundle:schedule', 'schedule');
$dataRooster = $roosterConnection->findOneByStudentId('36838');
$dataRooster->setSchedule($rooster);
$entityManager->persist($dataRooster);
$entityManager->flush();
$out = array('1' => $week);
return new JsonResponse($out, 200, array('Content-Type' => 'application/json'));
}
}
?>
I think the problem is with my orm mapping so i include the doctrine code from config.yml
# Doctrine Configuration
doctrine:
dbal:
default_connection: StudentDB
connections:
StudentDB:
driver: '%database_driver%'
host: '%database_host%'
port: '%database_port%'
dbname: '%database_students%'
user: '%database_user%'
password: '%database_password%'
charset: UTF8
TeacherDB:
driver: '%database_driver%'
host: '%database_host%'
port: '%database_port%'
dbname: '%database_teachers%'
user: '%database_user%'
password: '%database_password%'
charset: UTF8
GradesDB:
driver: '%database_driver%'
host: '%database_host%'
port: '%database_port%'
dbname: '%database_grades%'
user: '%database_user%'
password: '%database_password%'
charset: UTF8
ScheduleDB:
driver: '%database_driver%'
host: '%database_host%'
port: '%database_port%'
dbname: '%database_schedule%'
user: '%database_user%'
password: '%database_password%'
charset: UTF8
SpecialGroupDB:
driver: '%database_driver%'
host: '%database_host%'
port: '%database_port%'
dbname: '%database_specialgroup%'
user: '%database_user%'
password: '%database_password%'
charset: UTF8
ToDoListDB:
driver: '%database_driver%'
host: '%database_host%'
port: '%database_port%'
dbname: '%database_todolist%'
user: '%database_user%'
password: '%database_password%'
charset: UTF8
orm:
default_entity_manager: students
entity_managers:
students:
connection: StudentDB
mappings:
StudentsBundle: ~
teachers:
connection: TeacherDB
mappings:
TeachersBundle: ~
grades:
connection: GradesDB
mappings:
GradesBundle: ~
schedule:
connection: ScheduleDB
mappings:
ScheduleBundle: ~
specialgroup:
connection: SpecialGroupDB
mappings:
SpecialGroupBundle: ~
todolist:
connection: ToDoListDB
mappings:
ToDoListBundle: ~
I am using symfony 3.0.3 and doctrine
edit: changed use ScheduleBundle\Entity to use ScheduleBundle\Entity\schedule this did not fix the problem
You need to use the correct doctrine entity manager service. In your code you refer to the doctrine service which is an alias of the default entity manager. For the schedule entity manager you need to use the following service:
doctrine.orm.schedule_entity_manager
So try using this:
$this->get('doctrine.orm.schedule_entity_manager')
Instead of this:
$this->get('doctrine')
For dump current service definition you can use the console command:
app/console debug:container |grep entity
Hope this help

Categories