在 Symfony 3.3 中使用 parameters.yml
Using parameters.yml in Symonfy 3.3
我仍然想知道哪种方式使用参数是最合乎逻辑和最有效的方式。
我意识到我可以从控制器中的 parameters.yml 中获取参数,这要归功于我在控制器文件中添加的 "extends Controller" 和 "use Symfony\Bundle\FrameworkBundle\Controller\Controller;"。
在这个控制器中,我从 AppBundle\Model\User 中的文件 User.php 中实例化了一个新的 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 .
我的问题是...是否存在任何方法来避免始终将连接参数从控制器传递到模型对象?也许是一种直接从函数 open_database_connection 或其他解决方案内部从 parameters.yml 获取参数的方法?
你平时是怎么做的?谢谢你的帮助。
要访问 parameters.yml 变量,您必须在控制器内。
这样,您只需要做:
$this->getParameter('_param_name');
并将该值发送给实体。
因此,如果你看得很清楚,你会发现 getParameter() 是 Controller class 的成员函数:
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 意味着实体是这样的......
所以我终于发现了如何使用 Doctrine 中的连接。我会揭露我会做什么。如果你觉得我说错了请再回答我。
我要做的是,每次我需要使用数据库时,我都会通过参数将连接发送到模型实例。
来自动作函数内的控制器:
$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');
...
}
...
}
我希望它看起来越来越好。
我试图避免 Doctrine 中的映射和实体概念我只想将有关数据库的其余部分联系起来我想自己控制它们。
如果您认为我可以清理更多我的代码,请不要停止这样说我。
对于多个连接,我建议您在 config.yml 和 paramerter.yml 文件中定义它们
parameter.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');
或
我仍然想知道哪种方式使用参数是最合乎逻辑和最有效的方式。
我意识到我可以从控制器中的 parameters.yml 中获取参数,这要归功于我在控制器文件中添加的 "extends Controller" 和 "use Symfony\Bundle\FrameworkBundle\Controller\Controller;"。
在这个控制器中,我从 AppBundle\Model\User 中的文件 User.php 中实例化了一个新的 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 .
我的问题是...是否存在任何方法来避免始终将连接参数从控制器传递到模型对象?也许是一种直接从函数 open_database_connection 或其他解决方案内部从 parameters.yml 获取参数的方法?
你平时是怎么做的?谢谢你的帮助。
要访问 parameters.yml 变量,您必须在控制器内。 这样,您只需要做:
$this->getParameter('_param_name');
并将该值发送给实体。
因此,如果你看得很清楚,你会发现 getParameter() 是 Controller class 的成员函数:
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 意味着实体是这样的......
所以我终于发现了如何使用 Doctrine 中的连接。我会揭露我会做什么。如果你觉得我说错了请再回答我。
我要做的是,每次我需要使用数据库时,我都会通过参数将连接发送到模型实例。
来自动作函数内的控制器:
$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');
...
}
...
}
我希望它看起来越来越好。
我试图避免 Doctrine 中的映射和实体概念我只想将有关数据库的其余部分联系起来我想自己控制它们。
如果您认为我可以清理更多我的代码,请不要停止这样说我。
对于多个连接,我建议您在 config.yml 和 paramerter.yml 文件中定义它们
parameter.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');
或