Я видел много примеров DataMapper, сделанных так:
namespace DataMapper;
class UserMapper
{
protected $pdo;
public function __construct(\PDO $pdo)
{
$this->pdo = $pdo;
}
public function getByUserId($user_id) { /* ... */ }
public function store(User $user) { /* ... */ }
}
Я следовал за этим примером в течение некоторого времени. А потом я добавляю эти:
public function getFromSession() { /* ... */ }
public function storeToSession(User $user) { /* ... */ }
Что делает это немного странно, так как эти двое не используют $this->pdo
но \PDO
должны быть предоставлены на __construct()
тем не менее.
И затем я попытался разделить их (по каждому методу) на более мелкие классы:
\DataMapper\User\GetFromDbByUserId
\DataMapper\User\StoreToDb
\DataMapper\User\GetFromSession
\DataMapper\User\StoreToSession
Расширяет их от этого:
abstract class Invokable
{
public static function invoke(...$params)
{
$instance = new static(...$params);
return $instance();
}
abstract public function __invoke();
}
Затем используйте их так:
use DataMapper as Dm;
class SomeBusinessLogic
{
public function doStuff($user_id)
{
// ...
$db = new \PDO($dsn, $user, $pass);
// ...
$user = Dm\User\GetFromDbByUserId::invoke($db, $user_id);
// ...
Dm\User\StoreToSession::invoke($user);
// ...
$user = Dm\User\GetFromSession::invoke();
// ...
Dm\User\StoreToDb::invoke($db, $user);
// ...
}
}
Мои вопросы:
Задача ещё не решена.
Других решений пока нет …