Так как я опаздываю на ответы на вопросы, помеченные php, где я на самом деле знаю ответ, который, как я полагал, попробую задать вопрос сам.
Я так долго и много раз работал над полным переписыванием пользовательского шаблонизатора в php, что думал, что буду спрашивать мнения.
Короче, это самая важная часть, которую я реализовал:
- Любой http-запрос направляется на handler.php
- на основе запрошенного URL-адреса создается экземпляр контроллера и вызывается метод для этого контроллера.
- Метод контроллера должен возвращать
IView
совместимый экземпляр класса (IView
определяет метод Render()
)
- Механизм шаблонов делает некоторый xpath для каждого пространства имен, которое заканчивается на 'serverside'
sprintf('//%s:*[@runat="server"]', $namespaceprefix )
- Для каждого найденного тега он ищет класс php, обозначенный
$tag.localName
, создает его экземпляр и присоединяет его к исходному шаблону.
- После подключения исходный узел шаблона подается в 'ServerTag', чтобы он мог правильно инициализироваться
- полностью завершенный экземпляр, совместимый с IView, назначается временной переменной в методе контроллера.
- Контроллер запрашивает передачу данных из класса Model в представление, которое выполняет некоторую изящную замену xpath DOM.
- Контроллер возвращает полностью заполненное представление
main()
обработчику, который его отображает.
Я основываю свой шаблон на xml. простой шаблон в настоящее время выглядит так:
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:red="http://www.theredhead.nl/serverside">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title>Title will be filed by the View depending on the Controller</title>
<link rel="stylesheet" type="text/css" href="/Stylesheet/Get/Main/" />
</head>
<body>
<!-- the entire body may be reset by the view using it, using XPath and DOM functions -->
<!-- Usually the PageHeader and PageFooter would be put back after clearing the body -->
<div id="PageHeader">
<img src="/Image/Get/theredhead_dot_nl.png" alt="Site Logo" />
</div>
<h1>www.theredhead.nl :: Test Template</h1>
<p>
Lorum ipsum dolar sit amet. blah blah blah yackadee schmackadee.
</p>
<div id="PageFooter">
Built by
<br />
<red:UserProfileLink runat="server" Username="kris" />
</div>
</body>
</html>
При токе это выводит (включая сломанный отступ):
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:red="http://www.theredhead.nl/serverside">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
<title>Welcome to my site</title>
<link rel="stylesheet" type="text/css" href="/Stylesheet/Get/Main/"/>
<link rel="stylesheet" type="text/css" href="/Stylesheet/Get/Custom/"/>
<link rel="stylesheet" type="text/css" href="/Stylesheet/Get/Profile/"/>
</head>
<body>
<!-- the entire body may be reset by the view using it, using XPath and DOM functions -->
<!-- Usually the PageHeader and PageFooter would be put back after clearing the body -->
<div id="PageHeader">
<img src="/Image/Get/theredhead_dot_nl.png" alt="Site Logo"/>
</div>
<h1>www.theredhead.nl :: ModelViewController</h1>
<p>
Lorum ipsum dolar sit amet. blah blah blah yackadee schmackadee.
</p>
<div id="PageFooter">
Built by
<br/>
<div><div xmlns:profile="http://www.theredhead.nl/profile" class="ProfileBadge" style="font-size : .8em;">
<a style="text-decoration : none; border: none;" href="/Profile/View/kris">
<img style="float : left;" src="http://www.gravatar.com/avatar/5beeab66d6fe021cbd4daa041330cc86?d=identicon&s=32&r=pg" alt="Gravatar"/>
 Kris
</a>
<br/>
<small>
 Rep: 1
</small>
</div></div>
</div>
</body>
</html>
- Я затронул только верхушку айсберга, и да, я уберу неиспользуемые атрибуты xmlns из вывода, как только я буду доволен функциональностью
- на данный момент в моих инфраструктурах mvc и core есть чуть более 200 классов
- Я знаю, что существуют решения, которые могут делать подобные вещи, но я хочу создать свое собственное.
Итак, большой вопрос: Есть ли у вас какие-либо комментарии по поводу обязательных функций?
P.S. если кто-то заинтересован в полном исходном коде, оставьте комментарий, я буду размещать его на своем сайте, когда достигну разумного уровня юзабилити разработчика.