4

PHP で CMS を構築しようとしていますが、テンプレート システムの構築に少し問題があります。自分で流暢にコーディングできるようになるまで、外部フレームワークに依存したくないので、Smarty や Twig を使用したくありません。それはすべて、私の学習を強化することです(私の観点から)。

そのため、テンプレートがどのように機能するかを計画していましたが、エラー チェックで問題が発生しました。

これがどのように機能するかの基本的な概要です。

(非常に) シンプルなサンプル テンプレート:

<html>
<p>{output $randomNumber}</p>{output $databaseDump}
<div>{output $databaseAndUsersPasswords}</div>
</html>

私のパーサーによって解析されます:

<html>
<p><?php echo $randomNumber?></p><?php echo $databaseDump?>
<div><?php echo $databaseAndUsersPasswords?></div>
</html>

次に、eval を使用して解析済みのテンプレートを実行します。

私の問題はエラーチェックにあります。設計者が何か間違ったことをした場合、エラーに対する保護はほとんどありません。エラー抑制を有効にすると、ページの一部のコンテンツが失われます。オール オア ナッシングにしたいのです。エラーをチェックできる簡単な解決策が思い浮かびません。

また、正規表現と str_replace を使用してテンプレートを解析しても問題ないと思いますか? 私は他のいくつかのフレームワークのソリューションを読んでいますが、すべてがひどく複雑に見えます.解析システムのコアを見つけることができません.

好きなだけ私のテクニックを批判してください。私は学ぶためにここにいます。

4

2 に答える 2

4

すべてかゼロかが必要な場合は、単純にエラー ハンドラーを構成して、例外をスローさせることができます。

function exception_error_handler($errno, $errstr, $errfile, $errline ) {
    if (error_reporting()) {
        // the @ operator wasn't used, throw it.
        throw new ErrorException($errstr, $errno, 0, $errfile, $errline);
    }
}
set_error_handler("exception_error_handler");

この後include()、ブロック内で生成されたスクリプトを作成し、try { } catch出力バッファリングを使用して不要な出力を防ぐことができます。

try {
    ob_start(); // stop output

    include '/path/to/script';

    ob_end_flush(); // flush buffer and stop output buffering
} catch (ErrorException $e) {
    ob_end_clean(); // clear buffer and stop output buffering
}

以下も参照してください。ErrorException


独自のテンプレート エンジンの作成に関しては、次のルールを使用します。

PHPのように見える場合は、PHPを使用してください。

ほぼ PHP に似た構文は、PHP 自体と同じくらいデザイナーが習得するのが難しいものですが、テンプレートが独自のパーサーにつまずかないようにするために費やした努力は確かに目に見えます。

デザイナーが作業するものによりよく織り込むものが必要な場合は、PHPTALXHTML 属性を使用して変数置換を行い、ループ ブロック、マクロなどを宣言するこのプロジェクトをチェックしてください。


エラーの報告とログの詳細:エラーのログをスムーズに

于 2012-12-28T08:10:09.210 に答える
1

まず第一に、必要で他に選択肢がない場合を除き、使用しないでください (注意evalを読んでください)。もう1つのことは、テンプレートシステムの場合、ビューを取得し、phpに変換してから含める(実行する)のはやり過ぎです。

私はMVC パターンを使用し、コントローラーにビューをロードさせ、スクリプトとして処理せずに必要な情報を渡します。

サンプル:


ベースコントローラー:

abstract class Controller {
    protected function Render($view, $data = array()) {
        $viewStr = file_get_contents(__PATH_TO_VIEW__.$view.'.html');

        $viewStr = preg_replace_callback('/\{(\w+)\}/',
                                        function ($matches) use ($data) {
                                            return isset($data[$matches[1]]) ?
                                                          $data[$matches[1]] : '';
                                        }, $viewStr);
        echo $viewStr;
    }
}

カスタム コントローラー:

class MyController extends Controller {
    public function index() {
        $this->Render('myView', array('test' => 'some test string'));
    }
}

カスタム ビュー (myView.htmlこの例では):

<b>{test}</b>

出力は次のようになります。

いくつかのテスト文字列


ご覧のとおり、文字列を操作していて、何も実行していないため、ビューを完全に制御できるようになり、デザイナーは php エラーを生成できません。

PS このアンプルを既存のコードに自由に適応させてください。;)

于 2012-12-28T08:16:31.630 に答える