Hola David, la idea de la inversión de dependencia es evitar instanciar directamente clases dentro de otra clase que los utiliza.
Te dejo un ejemplo de como masomenos lo manejo yo, aplico la inversión en el controlador, posiblemente el UserModel también debería un constructor para el manejador de DB, en mi caso por ejemplo es doctrine.
Depende de como accedas a DB.
Espero te ayude.
Saludos.
interface UserModelInterface
{
public function getEntity($id);
}
class UserModel implements UserModelInterface
{
//Acá podrías tener inseccion de dependencia de tu manejador de BD
//Depende de cómo accedas a tu DB
public function getEntity($id)
{
//Acceso a la DB
}
public function changePassword($user, $password)
{
//Aplicar cambio a la entidad y guardas en DB
}
}
class Entity
{
private $name;
private $sname;
private $mail;
private $password;
public function setPassword($password)
{
$this->password = $password;
}
}
User Controller
{
private $userModel;
public function __construct(UserModelInterface $userModel)
{
$this->userModel = $userModel;
}
public function viewAction()
{
$id = 1; //id de usuario
//Obtener usuario de DB
$user = $userModel->getEntity($id)
$newPassword = "123545";
//Actualizar password (forma 1)
$user = $this->userModel->getEntity($id)
$user->setPassword($newPassword);
$this->userModel->save($user);
//Actualizar password (forma 2)
$this->userModel->changePassword($user, $newPassword) // O pasar $id en vez de user
//Actualizar password (forma 3)
//Usando una capa intermedia "UserService" el cuál tendra acceso a tu modelo,
//así evitas que tu controlador acceda a tu modelo directamente, lo uso para proyectos grandes, y donde tengas mucha lógica antes de guardar en BD.
$this->userService->changePassword($id, $newPassword);
}
}