Я думаю, что я передаю слишком много параметров в методе
Когда пользователь отправляет форму, например:
public function addServer(CreateRequest $request)
{
$created = $this->server->create(
$request->name,
$request->location,
$request->plan,
$request->php_version,
$request->install_mysql,
$request->database_name,
$request->do_backup,
);
}
Иногда мне не нужны все эти параметры, только несколько.
В классе сервера:
class Server {
public function create($name, $location, $plan, $phpVersion, $installMysql, $databaseName, $doBackup) {
$server = $this->create($name, $location, $plan);
if ($server) {
}
}
}
Решит ли это передача объекта (объекта)?
Посмотрите на образец строителя:
намерение шаблона построения состоит в том, чтобы найти решение для анти-шаблона телескопического конструктора. Анти-шаблон телескопического конструктора возникает, когда увеличение комбинации параметров конструктора объекта приводит к экспоненциальному списку конструкторов. Вместо использования многочисленных конструкторов в шаблоне компоновщика используется другой объект — компоновщик, который шаг за шагом получает каждый параметр инициализации, а затем сразу возвращает полученный построенный объект.
В основном с помощью шаблона компоновщика вы гарантируете, что ваш объект всегда инициализируется правильно, с дополнительными свойствами или без них.
Вы бы создали дополнительный ServerBuilder
класс, который будет иметь установщик для каждого свойства / параметра для сервера и build()
метод, который возвращает Server
пример.
class ServerBuilder {
private $name = "";
private $location = null;
public function name($name) {
$this->name = $name;
return $this;
}
public function location($location) {
$this->location = $location;
return $this;
}
/* add other setters here .. */
public function build() {
// here you ensure all properties have sane values
// if no php_version then set default etc
return new Server($name, $location, ..., ..., etc);
}
}
Вы бы использовали это как:
$builder = new ServerBuilder();
$server = $builder
->name("foo")
->location("bar")
->build();
Вы можете передать $request
переменная к Server->create
, или же Sever->createFromObject
, что вы хотите. CreateRequest
или другой объект может содержать любые данные, которые вам нужны, а затем вы проверяете, например, null
, какие параметры не были переданы.
Создайте больше методов для каждой разделяемой части. Например. createServer($name, $location, $plan), setBackup(bool), setMysql($dbName)
, и так далее. И вы звоните только тем, кто вам нужен, когда вы создаете сервер.