$searchCriteria = new CustomerSearchCriteria;
$searchCriteria->setByName("москва");
$customers = $customerRepository->findByCriteria($searchCriteria);//->CustomerCollectionРепозитории это имплиметация интерфейса доменной области,по работе с хранилищем домена
Они не описывают хранение в базах данных или кэширование или решение любой другой технической проблемы. Репозитории представляют коллекции. Как вы храните эти коллекции — это просто деталь реализации.
Вероятно, наиболее важным отличием репозиториев является то, что они представляют собой коллекции объектов.
$customers = new Collection(new Customer());
$customers->createCollectionByFields(array('somefield'=>'somevalue'));
$customersArray = $customers->getArray(); //return array of objects
класс Customer работатет со своей таблицей в бд. Делает в ней все сам и возвращает данные в виде массива. Разве не такая должна быть идея?нет, идея взять таблицу, получить из нее данные, данные хранить в свойствах объекта, ничего возвращать не нужно, данные и так будут доступны из свойств объекта.
class Customer {
protected $db;
//public $data = [];
public function __construct(PDO $db){
$this->db = $db;
}
public function create(array $data){
$query = "INSERT INTO `customers` VALUE (?, ?, ?, ?)";
$stmt = $this->db->prepare($query);
//$data check
return $stmt->execute($data);
}
public function update(array $data){
//return bool
}
public function delete(int $id){
//return bool
}
public function get($query, array $params = []){
$stmt = $this->db->prepare($query);
$stmt->execute($params);
//$this->data = $stmt->fetchAll();
return $stmt->fetchAll();
}
}
class CollectionCustomer {
protected $obj;
public function __construct(Customer $obj){
$this->obj = $obj;
}
public function getAll(){
$query = "SELECT * FROM `customers`";
return $this->obj->get($query);
}
public function getById(int $id){
$query = "SELECT * FROM `customers` WHERE `id` = :id";
return $this->obj->get($query, [':id' => $id]);
}
public function getByName($str){
$query = "SELECT * FROM `customers` WHERE `name` LIKE :name";
return $this->obj->get($query, [':name' => '%'.$str.'%']);
}
//и тд.
}
$db = new PDO();
$customer = new Customer($db);
$collection = new CollectionCustomer($customer);
//var_dump($collection->getAll());
var_dump($collection->getById(1));
public function save(){
return $this->db->save($this->getDataSet());
}class Customer extends BaseObject{...). Так как данные для всех примерно одинаково читаются/сохраняются. Как выше написал dmitriy, креэйт и упдэйт по сути отличаются мало, в модели их не нужно разделять, а в объекте дб уже смотрите - если есть поле id - то упдэйт, если нет - инсерт.
public function save(){
return $this->db->save($this);
}
public function save(){
return $this->db->save($this->getDataSet());
}public function save(){
try{
$this->db->save($this->getDataSet());
}
catch(\DbDriverException $ex){
throw new RepositoryException($ex->getMessage(),$ex->getCode(),$ex);
}
}