我仍在努力知道哪种方式使用参数是最合乎逻辑和最有效的方式。
我意识到我可以从Controller中的parameters.yml中获取参数,这要归功于我在Controller文件中添加的"extended Controller"one_answers"use Symfony\Bundle\FrameworkBundle\Controller\Controller;"。
从这个控制器中,我从AppBundle\Model\User;我创建的,看起来像这样:
namespace AppBundleModel;
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_tabase($parametersConnection),最后通过参数传递到open_database_connection。
我的问题是……是否有任何方法可以避免一直将连接的参数从控制器传递到模型对象?也许是从函数open_database_connection或其他解决方案中直接从parameters.yml获取参数的一种方法?
你通常是怎么做的?谢谢你的帮助。
要访问parameters.yml-var,您必须在控制器内部。这样,你只需要制作:
$this->getParameter('_param_name');
并将该值发送给实体。
因此,如果你看得很清楚,你会发现getParameter()是Controller类的成员函数:
namespace SymfonyBundleFrameworkBundleController;
abstract class **Controller** implements ContainerAwareInterface
所以,你必须试试这个:
<?php
namespace AppBundleModel;
use PDO;
use SymfonyBundleFrameworkBundleControllerController;
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的意思是实体…
所以我终于发现了如何使用来自Doctrine的连接。我会揭露我的所作所为。如果你认为我错了,请再回答我。
我要做的是,每次我需要玩数据库时,我都会通过参数将连接发送到模型的实例。
来自动作功能内的控制器:
$user = new User($this->container->get('database_connection'));
$something = $user->get_something_from_db_options();
从上一个被解释为"用户"的模型开始,我会这样离开:
namespace AppBundleModel;
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');
...
}
...
}
我希望情况开始好转。
我试图从条令中避免映射和实体的概念——我只想把它与数据库的其他东西联系起来——我想自己控制它们。
如果你认为我可以清理更多的代码,请不要停止这样说。
对于多个连接,我建议您在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: ~
在控制器中调用取消连接
$em = $this->getDoctrine()->getEntityManager('database2');
$em = $this->getDoctrine()->getEntityManager('default');
或