Использование параметров.yml в Symonfy 3.3

Я до сих пор пытаюсь узнать, какой способ использования параметров является наиболее логичным и эффективным.

Я понимаю, что могу получить параметры из параметров.yml в контроллере благодаря "расширяет контроллер" и "использовать Symfony\Bundle\FrameworkBundle\Controller\Controller;" Я добавил в файл контроллера.

С этого контроллера я создаю экземпляр нового User() из файла User.php в AppBundle\Model\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 также по параметрам.

Мой вопрос... существует ли какой-либо способ избежать передачи параметров соединения от контроллера к модельным объектам все время? Возможно, способ получить параметры из parameters.yml прямо из функции open_database_connection или какого-либо другого решения?

Как ты это делаешь обычно? Спасибо за помощь.

2 ответа

Решение

Наконец, я обнаружил, как использовать связь с Доктриной. Я разоблачу, что я буду делать. Если вы думаете, что я не прав, пожалуйста, ответьте мне снова.

Что я сделаю, так это то, что каждый раз, когда мне нужно поиграть с БД, я отправлю соединение по параметру в экземпляр модели.

Из контроллера внутри функции действия:

$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');
       ...
    }
...
}

Я надеюсь, что это начинает выглядеть лучше.

Я пытаюсь избежать концепции сопоставления и сущностей из Доктрины. Я просто хочу установить связь с остальными вещами о БД, я хочу контролировать их самостоятельно.

Если вы думаете, что я могу почистить мой код, пожалуйста, не прекращайте говорить мне это

Чтобы получить доступ к arguments.yml var, вы должны быть внутри контроллера. Таким образом, вы просто должны сделать:

$this->getParameter('_param_name');

и отправьте это значение в организацию.

Поэтому, если вы посмотрите явно, вы увидите, что getParameter() является функцией-членом класса Controller:

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 хотел, чтобы сущности были...

Для нескольких подключений я рекомендую вам определить их в файлах 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:  ~

В контроллере call de connection

$em   = $this->getDoctrine()->getEntityManager('database2'); 
 $em   = $this->getDoctrine()->getEntityManager('default'); 

или

Другие вопросы по тегам