我仍然试图知道哪种方式使用参数是最合乎逻辑和最有效的方式。
我意识到我可以从Controller中的parameters.yml获取参数,这要归功于"扩展控制器"和"使用Symfony \ Bundle \ FrameworkBundle \ Controller \ 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获取参数的方法?
你通常怎么做?谢谢你的帮助。
答案 0 :(得分:0)
要访问parameters.yml var,您必须在Controller中。 这样,你只需要:
$this->getParameter('_param_name');
并将该值发送给实体。
因此,如果你看起来很明显,你会发现 getParameter()是控制器类的成员函数:
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的意思是实体是......
答案 1 :(得分:0)
所以最后我发现了如何使用Doctrine中的连接。我将揭露我将要做的事情。如果您认为我错了,请再次回答我。
我要做的是,每次我需要使用db时,我都会通过参数将连接发送到模型的实例。
来自动作函数内的Controller:
$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的映射和实体概念我只是想建立关于db的其余部分的连接我想自己控制它们。
如果您认为我可以清理更多代码,请不要再这样说了。
答案 2 :(得分:0)
对于多个连接,我建议您在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');
或