3

私は PHP で小さなページに取り組んできましたが、その背後には本格的なフレームワークの力は必要ありません。Ruby-on-Rails の以前の作業で本当に欠けていることの 1 つは、「content_for」を使用してコンテンツを効果的にページに渡す機能です。

私が疑問に思っていたのは、PHP でこれと同じ効果を達成するページ ライフサイクルをどのように作成できるかということです。

簡単な例を次に示します。

インデックス ページを定義するテンプレートがあり、すべてのページで使用したい繰り返しヘッダーとメニューがあるとします。したがって、index.phpファイルは基本的に次のようになります。

...header stuff...
<body>
<?php include $file.'.php'; ?>
</body>
...footer stuff...

編集: URL セキュリティに関するヒントをありがとうございます。ただし、ユーザー リクエストを安全に取得していると仮定しましょう :)

さて、これを入れたいヘッダーに言ってみましょう:

<head>
<title><?php echo $page_title; ?></title>
</head>

インクルードされたファイルでタイトルを指定できるとよいので、http://example.com/index.php?p=test読み込み中の URLtest.phpで、そのファイルは次のようになります。

<?php $page_title = 'Test Page'; ?>
... rest of content ...

変数が設定される前にインクルード ページ (index.php) が読み込まれるため、明らかにこれは機能しません。

Rails では、関数を使用して「ページの上に」何かを渡すことができcontent_forます。

私の質問は次のとおりです。PHP でこの種の「content_for」機能を実現するために、皆さんが考えることができる最も単純で無駄のない方法は何でしょうか?

理想的には、大きなフレームワークに縛り付けずに、多くの異なるアプリケーションで使用できる比較的軽いボイラープレート コードを提案してほしいと思います。

4

3 に答える 3

4
  1. 絶対にしないでくださいinclude $_GET['p']。インクルードはファイル名と URL を受け入れるので、これはサイトに巨大なセキュリティ ホールを開きます。そのため、誰でもサイト上のファイルを読み取ったり、サーバー上のコードを実行したりできます。最初に値を確認してサニタイズすることをお勧めします。
  2. 簡単なものが必要な場合は、ヘッダーとフッターを別々のファイルに入れtest.php、変数を設定するものを実行し、出力バッファリングを使用してその出力をキャプチャしてから、ヘッダーを含め、中間部分を出力し、フッターを含めます。例:

    <?php ob_start(); ?>
    <body>
    <?php include $filename.'.php'; ?>
    </body>
    <?php $content = ob_get_clean(); 
     include 'header.php';
     echo $content;
     include 'footer.php';
     ?>
    
于 2010-12-15T05:09:44.057 に答える
1

XSSが気になりますか?または、クエリ文字列から「ファイル名」をフィルタリング/ホワイトリストに登録しますか?

私の答えは、mod_rewrite を使用することです。PHP を使用している場合は、Apache を使用している可能性があります。

RewriteCond でファイルを除外でき、RewriteRule は次のようになります。

RewriteRule /index.php?p=(.*)$ $1 [L,QSA]

これは、探していた PHP 機能とは異なるアプローチかもしれませんが、思い浮かびます...

于 2010-12-15T05:15:09.177 に答える
1

私があなたを正しく理解していれば (私は RoR をあまり使用していません)、データを変数または関数に入れることができます。コンテンツが変数内にある場合、「test.php」は単純にすべての変数を保持することができ、インデックス ファイルの最初にロードすることができます (ニーズがどれほど複雑であるかに応じて関数の場合も同様です。多くの余分な作業を行う場合、変数が機能しないため、関数を使用する必要がある場合があります)。

たとえば、test.php は次のようになります。

<?php
$page_title = "Test Page";
$page_content = "Some sort of content";

// Or

function page_content()
{
    // Run some functions and print content at the end
}

?>

次に、index.php で

<?php include $_GET['p'].'.php'; ?>
...header stuff...
<title><?php print $page_title; ?></title>
<body>
<?php print $page_content; ?>
<!-- OR if function -->
<?php page_content(); ?>
</body>
...footer stuff...

このようにして、すべてが適切にロードされるはずです。物事を分割することもできますが、それは構造を複雑にします (特に、精巧なフレームワークが必要ない場合、これは不要です)。

幸運を!
デニス M.

于 2010-12-15T05:08:42.420 に答える