2016-06-25 12 views
1

Ich versuche Doctrine DBAL in meinem Symfony-Web-Projekt zu verwenden.Php Symfony 3.1 Ausnahme mit Doctrine DBAL

Was ich getan habe:

config.yml

# Doctrine Configuration 
doctrine: 
    dbal: 
     driver: pdo_pgsql 
     host:  "%database_host%" 
     port:  "%database_port%" 
     dbname: "%database_name%" 
     user:  "%database_user%" 
     password: "%database_password%" 
     charset: UTF8 

parameters.yml

parameters: 
    database_host: 127.0.0.1 
    database_port: 5432 
    database_name: my_project_db 
    database_user: postgres 
    database_password: my_password 

Mein Controller für Firmenprofil

/** 
* @Route("/profile/{userId}/{sessionKey}", name="profile") 
*/ 

public function profileAction($userId=null, $sessionKey=null) 
{ 
    $securityController = new SecurityController(); 
    $securityController->userId = $userId; 
    $securityController->sessionKey = $sessionKey; 
    if ($securityController->sessionKeyIsValid()) 
    { 
     return new Response('Profile'); 
    } 
    else 
    { 
     return $this->redirectToRoute('login'); 
    } 
} 

Und mein securityController wher e Ich versuche, meine PostreSQL

class SecurityController extends Controller 
{ 
    public $userId; 
    public $sessionKey; 

    public function sessionKeyIsValid() 
    { 
     $conn = $this->get('database_connection'); 
     //$conn->fetchAll('select * from main.users;'); 
     return false; 
    } 
} 

Exception (Error: Call to a member function get() on null) erscheint auf dieser Zeichenfolge Code $conn = $this->get('database_connection'); zu verbinden Was mache ich falsch? Es scheint, dass ich Schritt für Schritt gefolgt bin, wie es in Symfony empfohlen wird. Cookbook http://symfony.com/doc/current/cookbook/doctrine/dbal.html

Antwort

3

In einem Symfony-Projekt, Sie nie instanziieren Sie sich einen Controller. Wenn Sie Ihre Logik von Ihrem Controller trennen wollen, create a service und injizieren, was Sie als Abhängigkeit benötigen.

Ihr Service zum Beispiel wie folgt aussehen:

namespace AppBundle\Service; 

use Doctrine\DBAL\Connection; 

class SecurityService 
{ 
    protected $db; 
    public $userId; 
    public $sessionKey; 

    public function __construct(Connection $db) 
    { 
     $this->db = $db; 
    } 

    public function sessionKeyIsValid() 
    { 
     // $this->db->fetchAll('select * from main.users;'); 
    } 
} 

Und Sie es in Ihrem services.yml wie folgt erklären: in jedem Controller

services: 
    app_security: 
     class:  AppBundle\Service\SecurityService 
     arguments: [ "@database_connection" ] 

Dann haben Sie Zugriff auf eine gemeinsame Instanz von :

public function profileAction($userId=null, $sessionKey=null) 
{ 
    $security = $this->get('app_security'); 

    // ... 
} 

Ich muss Sie jedoch warnen Der direkte Zugriff auf die Datenbankebene ist wahrscheinlich nicht der richtige Weg. Sie sollten zuerst den Abschnittaus der Dokumentation lesen.

+0

Vielen Dank für die ausführliche Antwort, aber ich bin nicht so weit gekommen, wie Serviceargument (Argumente: ["@database_connection"]) mit Datenbankverbindungsparameter in meiner Parameter.yml Datei zu verknüpfen. Wenn ich Ihr Beispiel "so wie es ist" nehme, bekomme ich einen Fehler (kann nicht in Zeile 15 (in der Nähe von "arguments: [" @database_connection "]").) –

+0

Es gab einen nicht gewünschten Platz in meiner vorherigen Antwort, ich habe es behoben. Die Syntax '" @database_connection "' bedeutet, dass der Dienst 'database_connection' durch den Konstruktor injiziert wird. Es wurde bereits instanziiert, siehe Abschnitt "config.yml" neben "doctrine". Ihre Datenbankparameter sind bereits registriert. Sie sollten wirklich die Abschnitte der Dokumentation lesen, die Sie interessieren. Symfony ist ein sehr leistungsfähiges Werkzeug, aber es ist eindeutig kontraproduktiv, wenn es nicht angemessen verwendet wird. – marc

+0

Danke, das Problem wurde gelöst, indem Sie zusätzlichen Speicherplatz wie erwähnt entfernen. Ich wusste nicht, dass Yml Config so von der Formatierung abhängt. –

3

Container ist nicht festgelegt, so dass Sie seine Methoden nicht aufrufen können.

$securityController = new SecurityController(); 
$securityController->userId = $userId; 
$securityController->sessionKey = $sessionKey 
$securityController->setContainer($this->container); 

Ich denke, dass es nicht sinnvoll verwenden SecurityController als Controller, es ist eine Dienstleistung.

Verwandte Themen