Правильно ли я использую делегирование? Нужен совет правильно ли я использую делегирование . Есть на сайте регистрация , где осуществляется загрузка фото пользователя , есть возможность менять эти изображения в личном кабинете , и еще нужно выводить эти изображения в вюшке пользователю .
В общем есть модель User class User {

public $image;

public function __construct($image)
{
$this->image = $image;
}

public function getUser($id)
{

$db = Db::getConnection();

$sql = "SELECT * FROM user WHERE id = :id";
$stmt = $db->prepare($sql);
$stmt->bindParam(':id', $id, PDO::PARAM_INT);
$stmt->execute();

return $stmt->fetch();

}

}
Есть модель Image для работы с изображениямиclass Image {

private $user_id;

public function __construct($id)
{
$this->user_id = $id;
}
public function getImage()
{

$db = Db::getConnection();

$sql = "SELECT IF(image IS NULL or image = '','no_image.png',image) as image FROM `user` WHERE id = :id";


$result = $db->prepare($sql);
$result->bindParam(':id', $this->user_id, PDO::PARAM_INT);
$result->execute();

return $result->fetchColumn();
}

public static function UploadImage($image)
{

$usersImage = $image['userfile']['tmp_name'];

$imageName = $image['userfile']['name'];

if(is_uploaded_file($image['userfile']['tmp_name'])){

move_uploaded_file($usersImage, $_SERVER['DOCUMENT_ROOT']."/template/images/users/".$image['userfile']['name']);


}

return $imageName;

}
public function UpdateImage($image) {

$usersImage = $image['userphoto']['tmp_name'];

$imageName = $image['userphoto']['name'];

if(is_uploaded_file($image['userphoto']['tmp_name'])){

move_uploaded_file($usersImage, $_SERVER['DOCUMENT_ROOT']."/template/images/users/".$image['userphoto']['name']);


}
$db = Db::getConnection();

$sql = "UPDATE user SET image = '$imageName' WHERE id = $this->user_id ";

$db->query($sql);

return true;

}
}
Все эти операции(добавление , обновление и показ) контролируются в контроллере class UserController extends BaseController {


public function actionProfile($id) {

$user = new User(new Image($id));

if(isset($_POST['submit_photo'])) {

$user->image->updateImage($_FILES);

}

return $this->render('user/profile.php',[

'user' => $user->getUser($id),
'image'=> $user->image->getImage()
]);
}
Правильно ли я все делаю ?

21 Авг 2019 в 06:28
179 +1
0
Ответы
1

Да, вы правильно используете делегирование в вашем коде. Вы создали объект User, который содержит объект Image, и делегируете операции по работе с изображениями этому объекту Image. Такой подход помогает разделить ответственности между классами и улучшает читаемость кода.

Однако, я хотел бы сделать несколько замечаний:

В методе UploadImage класса Image, вы передаете параметры в виде массива $_FILES. Лучше было бы использовать именованные параметры для улучшения читаемости и поддерживаемости кода.

В методе UpdateImage класса Image, вы вставляете данные из $_FILES напрямую в запрос SQL. Это уязвимость к атакам внедрения SQL. Рекомендуется использовать подготовленные запросы для параметризации значений и предотвращения SQL-инъекций.

В методе actionProfile контроллера, у вас отсутствует проверка наличия файла во входных данных $_FILES перед вызовом метода updateImage объекта Image. Добавьте соответствующую проверку.

Надеюсь, эти замечания помогут вам улучшить ваш код.

20 Апр 2024 в 13:18
Не можешь разобраться в этой теме?
Обратись за помощью к экспертам
Гарантированные бесплатные доработки в течение 1 года
Быстрое выполнение от 2 часов
Проверка работы на плагиат
Поможем написать учебную работу
Прямой эфир