Ваш вопрос начинается с простого, а затем строится со сложностью.Когда вы читаете ваш пост, это звучит так, как будто вы обеспокоены количеством аргументов, которые вам нужно будет передать методу для создания объекта.Это разумный страх, так как вам следует избегать функций, которые принимают более 2 или 3 аргументов, и потому что иногда вам нужно будет передать 1-й 3-й и 5-й аргумент, а не 2-й и 4-й, что просто становится неудобным.
Вместо этого я бы посоветовал вам взглянуть на шаблон строителя.
В конце концов, он не будет сильно отличаться от простого использования вашего User
объекта, однако это поможет вам избежать использования User
объект в недопустимом состоянии (обязательные поля не установлены)
1) Каков наилучший способ инкапсулировать эту логику в классе Factory?Если я создаю класс Factory, который будет создавать такие объекты, как объект Users, каждый раз, когда мне потребуется передавать большое количество параметров.
Именно поэтому я рекомендовал шаблон построителя.Чтобы избежать передачи большого количества параметров в одну функцию.Это также позволит вам проверять состояние в методе сборки и обрабатывать или генерировать исключения.
class UserBuilder {
protected $data = [];
public static function named($fname, $lname) {
$b = new static;
return $b
->withFirstName($fname)
->withLastName($lname);
}
public function withFirstName($fname) {
$this->data['first_name'] = $fname;
return $this;
}
public function withFirstName($lname) {
$this->data['last_name'] = $lname;
return $this;
}
public function withAge($age) {
$this->data['age'] = $age;
return $this;
}
public function build() {
$this->validate();
$d = $this->data;
$u = new User;
$u->setFirstName($d['first_name']);
$u->setLastName($d['last_name']);
$u->setAge($d['age']);
return $u;
}
protected function validate() {
$d = $this->data;
if (empty($d['age'])) {
throw new Exception('age is required');
}
}
}
тогда вы просто делаете ..
$user = UserBuilder::named('John','Doe')->withAge(32);
сейчас вместо числа аргументов функцииС каждым параметром число методов растет.
2) Даже если я реализую Factory так, как показано выше - должна ли Factory вставлять данные в БД?В моем примере вызов метода create ()?Или просто выполнить все операции установки?
нет, он не должен вставлять.это должно просто помочь вам построить объект, а не предполагать, что вы собираетесь с ним делать.Вы можете отпустить, что после того, как вы его построите, вы захотите сделать что-то еще с ним перед вставкой.
3) И даже больше, что если мне понадобится создавать объекты Users с отношениями, с другими связаннымиобъекты?
В Phalcon эти отношения являются частью сущности.Вы можете увидеть в их документах этот пример:
// Create an artist
$artist = new Artists();
$artist->name = 'Shinichi Osawa';
$artist->country = 'Japan';
// Create an album
$album = new Albums();
$album->name = 'The One';
$album->artist = $artist; // Assign the artist
$album->year = 2008;
// Save both records
$album->save();
Итак, чтобы связать это с примером пользователя, предположим, что вы хотели сохранить информацию об адресе пользователя, но адреса хранятся вдругой стол.Построитель может предоставлять методы для определения адреса, а метод сборки будет создавать обе сущности вместе и возвращать построенный объект User, который имеет ссылку на объект Address внутри него, из-за того, как работают модели Phalcon.