Что касается критики в моем посте, я подумал, что дам пост о том, как я склонен создавать MVC паттерн в PHP
В PHP я разбил фреймворк на несколько разделов, некоторые из которых являются нормальными, когда дело доходит до MVC.
Праймериз:
вторичность
- ModelLayer
- ViewLoader
- Библиотека
- ErrorLayer
В контроллере я обычно разрешаю всем доступ к вторичным слоям, а также к представлению и модели из основного.
Вот как я бы это структурировал
|---------| |------------| |------------|
| Browser | ----> | Controller | ----> | Model |
|---------| |------------| |------------|
| | | |
| | |----------------|
| |
| |------------|
-------------| View |
|------------|
Из моей схемы я обычно обхожу соединение View <-> Model
и делаю Controller <-> Model
, а затем ссылка из Controller <-> View
назначает данные.
В моей структуре я стремлюсь создать систему хранения объектов, чтобы я мог легко получать объекты и так далее. пример хранения моего объекта выглядит так
class Registry
{
static $storage = array();
public static function get($key)
{
return isset(self::storage[$key]) ? self::storage[$key] : null;
}
public static function set($key,$object)
{
self::"storage[$key] = $object;
}
}
Несколько более продвинутый в этом плане, поэтому, когда я впервые инициализирую объекты, я сохраняю их как Registry::set("View",new View());
, так что они всегда доступны.
Итак, в моем контроллере находится базовый контроллер, я создаю несколько магических методов __get()
__set()
, так что любой класс, расширяющий контроллер, я могу легко вернуть запрос, например:
abstract class Controller
{
public function __get($key)
{
//check to make sure key is ok for item such as View,Library etc
return Registry::get($key); //Object / Null
}
}
И пользовательский контроллер
class Controller_index extends Controller
{
public function index()
{
$this->View->assign("key","value"); // Exucutes a method in the View class
}
}
Модель также будет помещена в реестр, но ее можно будет вызывать только из ModelLayer
class Model_index extends ModelLayer_MySql
{
}
или
class Model_index extends ModelLayer_MySqli
{
}
или файловая система
class Model_file extends ModelLayer_FileSystem
{
}
, чтобы каждый класс мог быть специфичным для типа хранилища.
Это не традиционный тип шаблона MVC, но его можно назвать Adoptive MVC.
Другие объекты, такие как View Loader, не следует помещать в реестр, поскольку они не предназначены специально для интересов пользователей, а используются другими объектами, такими как View
abstract class ViewLoader
{
function __construct($file,$data) //send the file and data
{
//Include the file and set the data to a local variable
}
public function MakeUri()
{
return Registry::get('URITools')->CreateURIByArgs(func_get_args());
}
}
поскольку файл шаблона включен в загрузчик View, а НЕ в класс View, он отделяет пользовательские методы от системных методов, а также позволяет использовать методы в самих представлениях для общей логики.
Пример файла шаблона.
<html>
<body>
<?php $this->_include("another_tpl_file.php"); ?>
<?php if(isset($this->session->admin)):?>
<a href="<?php echo $this->MakeUri("user","admin","panel","id",$this->session->admin_uid) ?>"><?php echo $this->lang->admin->admin_link ?></a>
<?php endif; ?>
</body>
</html>
Я надеюсь, что мои примеры помогут вам понять это немного больше.