Accesso al database da metodi statici e non statici

0

Attualmente sto costruendo una API REST in PHP & MySQL, e ora sono bloccato su come dovrei strutturare le classi e la connessione al database.

Diciamo che ho un tavolo nel mio database per i film. Come dovrei strutturare il mio codice per la connessione al database?

Attualmente ho questo:

<?php
//Db.php

class Db
{
    private $db;
    private $table = '';
    private $where = '';

    public function __construct()
    {

        $json = json_decode(file_get_contents(INC_ROOT . '/app/db.json'), true);

        $this->db = new \PDO(
            'mysql:host='.$json['host'].';dbname='.$json['dbname'].';charset=utf8',
            $json['username'],
            $json['password']
        );
        $this->db->setAttribute(\PDO::ATTR_EMULATE_PREPARES, false);
    }

    public function table($tbl)
    {
        $this->table = $tbl;
        $this->where = '';
        return $this;
    }

    ...
}
<?php
//Movie.php

class Movie
{
    public $db;
    public $id;
    public $title;

    public static function getById($id)
    {
        $instance = new self();
        $result = $db->table('movies')->where("id = $id")->select();
        $instance->id = $result[0]['id'];
        $instance->title = $result[0]['title'];
        return $instance;
    }

    public static function getAll()
    {
        $instances = array();
        $results = $db->table('movies')->select();
        foreach($results as $movie){
            $instance = new self();
            $instance->id = $movie['id'];
            $instance->title = $movie['title'];
            $instances[] = $instance;
        }
        return $instances;
    }

    public function updateTitle($title)
    {
        $this->title = $title;
        //update in database
    }
}

Il resto della api è costruito usando Slim quindi è fondamentalmente

$app = new Slim();
$app->container->singleton('db', function() {
    return new Db();
});

$app->get('/movies', function() use ($app) {
    $db = $app->container['db'];
    $movies = Movie::getAll();
}

$app->get('/movies/:id', function($id) use ($app) {
    $db = $app->container['db'];
    $movie = Movie::getById($id);
}

Il problema qui è che non so come accedere al database da entrambi i metodi statici e non statici nella classe Movie. Non voglio inviare un'istanza della classe del database a ciascun metodo Movie. Ma creare una nuova istanza di db all'interno di ogni metodo non sembra neanche ottimale.

Quindi dove dovrei creare l'istanza di DB e come posso accedervi?

    
posta Oskar Persson 13.07.2015 - 19:19
fonte

1 risposta

1

Quello che probabilmente vuoi fare qui è usare un repository ... Questo avrebbe i tuoi metodi di interrogazione direttamente correlati al tuo oggetto e userebbe e l'istanza del DB come parte del suo costruttore:

$repo = new MovieRepository($db);
$movies = $repo->findAll();

E o scrivere potresti avere:

$repo = new MovieRepository($db);
$movie = $repo->findById($id);
$movie->setTitle('A new Title');
$repo->update($movie);

Quindi nel tuo controller Slim, ad esempio:

$app->get('/movies/:id', function($id) use ($app) {
    $repo = new MovieRepository($app->container['db']);
    $movie = $repo->findById($id);
}
    
risposta data 13.07.2015 - 22:04
fonte

Leggi altre domande sui tag