Отдельный Data Mapper на более глубоком уровне & amp; Класс одиночного действия

Я видел много примеров 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);
// ...
}
}

Мои вопросы:

  1. Разделяет их так, будто это ненужно или плохо?
  2. Есть ли термин, относящийся к классу, который делает только одну вещь? Это считается плохой практикой?

1

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …