Я разрабатываю приложение с использованием концепции MVC и хочу ограничить класс View от вызова методов модели, но дать ему доступ к свойствам модели, чтобы он мог просто получать данные, когда это необходимо. Вместо этого я хочу дать классу Controller возможность вызывать методы модели (и, если возможно, ограничить доступ к свойствам, потому что это действительно не нужно делать).
Мой вопрос: как мне спроектировать отношения классов для достижения этой цели или я могу просто как-то сказать php запретить этому классу вызывать методы другого?
В настоящее время отношения моих классов выглядят так:
контроллер
class Controller
{
protected $_model; //has access to model so it can call model's methods to modify it
protected $_view;
public function __construct($model, $view)
{
$this->_model = $model;
$this->_view = $view;
}
}
Посмотреть
class View
{
protected $_model; //has access to model so it can get model's properties when needed
public function __construct($model)
{
$this->_model = $model;
}
}
И есть другие классы, которые наследуются от классов Controller и View, например:
class UserController extends Controller
{
public function modifyData()
{
$this->_model->modifyX(1); //this works and it should be working because i need the controller to be able to call model's methods
$someVar = $this->_model->x; //this works and it should not be working because i don't need the controller to be able to get model's properties
}
}
а также
class UserView extends View
{
public function getData()
{
$this->_model->modifyX(1); //this works and it should not be working because i don't need the view to be able to call model's methods
$someVar = $this->_model->x; //this works and it should be working because i do need the view to be able to get model's properties
}
}
Итак, что вы предлагаете в качестве лучшего способа достижения этого?
Игнорируя, является ли ваша структура MVC правильной конструкцией программного обеспечения, вы можете решить свою проблему, предоставляя классам только те данные, которые им необходимы. Например, если вы хотите, чтобы ваш View
иметь доступ только к Model
его свойства, не создавать экземпляры View
с Model
в качестве аргумента, но только передать данные из Model
в View
,
Других решений пока нет …