1

私は実際に答えを知っているphpのタグが付けられた質問に答えるのに遅れているので、自分で質問してみることにしました。

私は非常に長い間、php でカスタム テンプレート エンジンを完全に書き直す作業を何度も行ってきたので、意見を求めたいと思いました。

要するに、これは私がこれまでに実装した最も重要な部分です。

  1. http リクエストはすべて handler.php にルーティングされます
  2. 要求された URL に基づいてコントローラーがインスタンス化され、そのコントローラーのメソッドが呼び出されます。
  3. コントローラー メソッドは、IView互換性のあるクラス インスタンスを返す必要があります (メソッドIViewを定義しますRender()) 。
    1. テンプレート エンジンは、'serverside' で終わる名前空間ごとに xpath を実行します。sprintf('//%s:*[@runat="server"]', $namespaceprefix )
    2. 見つかったタグごとに、によって識別される php クラスを検索し、$tag.localNameインスタンス化して元のテンプレートに添付します。
    3. アタッチされると、元のテンプレート ノードが「ServerTag」に供給されるため、適切に初期化できます。
    4. 完全に完全な IView 互換インスタンスは、コントローラ メソッドの一時変数に割り当てられます。
  4. コントローラーは、Model クラスからビューにデータをプッシュするように要求します。ビューは、気の利いた xpath DOM 置換を行います。
  5. コントローラーは、完全に塗りつぶされたビューを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&amp;s=32&amp;r=pg" alt="Gravatar"/>
    &#xA0;Kris
</a>
<br/>
<small>
&#xA0;Rep:&#xA0;1
</small>
</div></div>
    </div>
</body>
</html>
  • ここで触れたのは氷山の一角にすぎません。はい、機能に満足したら、未使用の xmlns 属性を出力から削除します。
  • 現在、私の mvc とコア フレームワークには 200 を超えるクラスがあります。
  • 同様のことを実行できる既存のソリューションがあることは承知していますが、独自のソリューションを構築したいと考えています。

重要な質問は次のとおりです。必須の機能について意見はありますか?

PS 誰かが完全なソース コードに興味を持っている場合は、コメントを残してください。適切な開発者のユーザビリティ レベルに達したら、自分のサイトで提供します。

4

3 に答える 3

6

PHP をテンプレート システムとして使用してみませんか。PHPはテンプレートシステムです。

<?php=$variable;?>HTML テンプレートにダンプするだけの何が問題なのですか? foreach ループなどを使用できます。不要な変数にアクセスできないスコープ内から実行するようにしてください。

Java/Struts の悪夢以来、私はこのような過度に複雑なテンプレート システムに対して非常に根深い憎悪を抱いています。必要なものを 1 つだけ変更するには、名前空間、xpath、カスタム名前空間などすべてに飛び込む必要があります。

于 2008-10-13T09:40:35.673 に答える
1

テンプレートエンジンに関する記事は次のとおりです。http://massassi.com/php/articles/template_engines/

あなたはそれを間違っています。

于 2008-10-13T10:32:17.177 に答える
1

私には、Phil Reif だけが実際に質問とその意図を読んで理解したようです。

PHPがテンプレート エンジンであると主張する人々は、あまりにも多くの事実を無視しており、堅実なフレームワークが重要な現実の世界から目をそらしています。

したがって、ポイントにはこれまでに (まだ実装されていない) 機能が必要です。

  1. リスト。次のようなコントロールでそれらを処理します<asp:DataGrid>
  2. 検証。検証コントロールで処理されます。正規表現、比較など
  3. 出力は、少なくとも html 5 が浸透するまで、強制的に有効な xhtml 1.0 です。
  4. 複合カスタム コントロール (コードではなく xml テンプレートに基づく)
  5. インライン php コード...<?php ... ?>有効な xml DOMProcessingInstruction ノードであると考えていますが、審査員は未定です。
  6. 構成可能なグローバル例外処理。

私はオンラインで最初の草案を作成したので、あなたが見て、いくつかの素晴らしいアイデアを私に返してくれるかもしれません.

ちなみに、数日以内にフォームを作成して実行する予定です。現時点では、デザインの最初のドラフトにすぎません (コードとスタイルの両方で)

ここでさらに意見を求めているのですが、皆さんはどのような種類のコントロールを使用し、気に入っていますか? (任意のフレームワーク/言語から)

クリス

于 2008-10-15T23:50:48.983 に答える