Использование параметров.yml в Symonfy 3.3
Я до сих пор пытаюсь узнать, какой способ использования параметров является наиболее логичным и эффективным.
Я понимаю, что могу получить параметры из параметров.yml в контроллере благодаря "расширяет контроллер" и "использовать Symfony\Bundle\FrameworkBundle\Controller\Controller;" Я добавил в файл контроллера.
С этого контроллера я создаю экземпляр нового User() из файла User.php в AppBundle\Model\User; что я создал и выглядит так:
namespace AppBundle\Model;
use \PDO;
class User
{
private function open_database_connection()
{
$link = new PDO("mysql:host=database_host;dbname=database_name","database_user","database_password");
return $link;
}
public function get_something_from_database()
{
$link = $this->open_database_connection();
//query's execution, fetch, etc...
...
}
...
}
На данный момент, как вы можете видеть, я просто записываю параметры прямо в новую функцию PDO, чтобы установить соединение, но я хочу использовать параметры из файла parameters.yml.
Как я вижу, я мог передавать параметры соединения из контроллера, создавая пользовательский объект и передавая в функцию get_something_from_database($parametersConnection) по параметрам и, наконец, в open_database_connection также по параметрам.
Мой вопрос... существует ли какой-либо способ избежать передачи параметров соединения от контроллера к модельным объектам все время? Возможно, способ получить параметры из parameters.yml прямо из функции open_database_connection или какого-либо другого решения?
Как ты это делаешь обычно? Спасибо за помощь.
2 ответа
Наконец, я обнаружил, как использовать связь с Доктриной. Я разоблачу, что я буду делать. Если вы думаете, что я не прав, пожалуйста, ответьте мне снова.
Что я сделаю, так это то, что каждый раз, когда мне нужно поиграть с БД, я отправлю соединение по параметру в экземпляр модели.
Из контроллера внутри функции действия:
$user = new User($this->container->get('database_connection'));
$something = $user->get_something_from_db_options();
Из последней объясненной модели под названием User я оставлю это так:
namespace AppBundle\Model;
use \PDO;
class User
{
private $connection;
public function __construct($connection)
{
$this->connection = $connection;
}
public function get_something_from_database()
{
$result = $this->connection->query('SELECT * FROM users');
...
}
...
}
Я надеюсь, что это начинает выглядеть лучше.
Я пытаюсь избежать концепции сопоставления и сущностей из Доктрины. Я просто хочу установить связь с остальными вещами о БД, я хочу контролировать их самостоятельно.
Если вы думаете, что я могу почистить мой код, пожалуйста, не прекращайте говорить мне это
Чтобы получить доступ к arguments.yml var, вы должны быть внутри контроллера. Таким образом, вы просто должны сделать:
$this->getParameter('_param_name');
и отправьте это значение в организацию.
Поэтому, если вы посмотрите явно, вы увидите, что getParameter() является функцией-членом класса Controller:
namespace Symfony\Bundle\FrameworkBundle\Controller;
abstract class **Controller** implements ContainerAwareInterface
Итак, вы должны попробовать это:
<?php
namespace AppBundle\Model;
use \PDO;
use Symfony\Bundle\FrameworkBundle\Controller\Controller;
class User extends Controller
{
private function open_database_connection()
{
// This
$param_X = $this->getParameter('_param_');
// Or this...
$param_X = $this->container->get('_param_');
$link = new PDO("mysql:host=database_host;dbname=database_name","database_user","database_password");
$link = new PDO("mysql:host=database_host;dbname=database_name","database_user","database_password");
return $link;
}
public function get_something_from_database()
{
$link = $this->open_database_connection();
//query's execution, fetch, etc...
// ...
}
//...
}
Но, честно говоря, я не думаю, что Symfony хотел, чтобы сущности были...
Для нескольких подключений я рекомендую вам определить их в файлах config.yml и paramerter.yml
параметр.yml
database_host: hostdatabase1
database_port: null
database_name: userdatabase1
database_user: preucv
database_password: passwordatabase1
database_host2: hostdatabase2
database_port2: null
database_name2: database2name
database_user2: databaseuser2
database_password2: databasepass2
config.yml
Define de conecctions
doctrine:
dbal:
default_connection: default
connections:
default:
server_version: 5.6.44
host: "%database_host%"
port: "%database_port%"
dbname: "%database_name%"
user: "%database_user%"
password: "%database_password%"
charset: UTF8
default_table_options:
charset: utf8
collate: utf8_general_ci
mapping_types:
enum: string
set: string
varbinary: string
tinyblob: text
database2:
server_version: 5.6.44
host: "%database_host2%"
port: "%database_port2%"
dbname: "%database_name2%"
user: "%database_user2%"
password: "%database_password2%"
charset: UTF8
default_table_options:
charset: utf8
collate: utf8_general_ci
mapping_types:
enum: string
set: string
varbinary: string
tinyblob: text
and define the mapping
orm:
default_entity_manager: default
entity_managers:
default:
connection: default
mappings:
YourEntitiesDatabase1Bundle: ~
database2:
connection:database2
mappings:
YourEntititiesDatabase2Bundle: ~
В контроллере call de connection
$em = $this->getDoctrine()->getEntityManager('database2');
$em = $this->getDoctrine()->getEntityManager('default');
или