在Symonfy 3.3中使用parameters.yml

时间:2017-10-18 09:25:52

标签: symfony global-variables symfony-3.3

我仍然试图知道哪种方式使用参数是最合乎逻辑和最有效的方式。

我意识到我可以从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获取参数的方法?

你通常怎么做?谢谢你的帮助。

3 个答案:

答案 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');