在 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');