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?