さて、これにはいくつかのセットアップが必要です:
CakePHP を使用したブログの URL で、素敵な投稿タイトル「スラッグ」を使用する方法を検討しています。
例:/blog/post-title-hereの代わりに/blog/view_post/123.
投稿ごとに新しいメソッドを書くつもりはないのは明らかなので、CakePHP コールバックを使用して PHP 5 の__call()マジック メソッドの動作をエミュレートしようとしています。ご存じない方のために説明すると、CakePHP のディスパッチャーはメソッドが存在するかどうかを確認__call()し、コントローラーで呼び出す前に CakePHP エラーをスローします。
私がこれまでに行ったこと:
完全な開示のために(問題が発生した理由がわからないため)、2つのルートがあります。
Router::connect('/blog/:action/*', array('controller' => 'blog_posts'));
Router::connect('/blog/*', array('controller' => 'blog_posts'));
これらは BlogPostsController のエイリアスを設定して、私の URL が次のようにならないようにします/blog_posts/action
次に、BlogPostsController で:
public function beforeFilter() {
parent::beforeFilter();
if (!in_array($this->params['action'], $this->methods)) {
$this->setAction('single_post', $this->params['action']);
}
}
public function single_post($slug = NULL) {
$post = $this->BlogPost->get_post_by_slug($slug);
$this->set('post', $post);
//$this->render('single_post');
}
beforeFilter存在しないアクションをキャッチし、メソッドに渡しますsingle_post。 single_postモデルからデータを取得し$post、ビューの変数を設定します。
index最新の 10件の投稿を表示する方法もあります。
交絡部分は次のとおりです。
$this->render上記でコメントアウトされたメソッドがあることに気付くでしょう。
- を呼び出さない
$this->render('single_post')と、ビューは 1 回レンダリングされますが、$post変数は設定されません。 - を呼び出すと、ビューは変数が設定された状態でレンダリングされ、設定されていない状態で再度レンダリングされます。つまり、同じドキュメント内で 2 つの完全なレイアウトを次々に取得します。内容のあるものとないもの。
$this->render('single_post')$post
single_postという名前のメソッドとという名前のメソッドを使用してみました__single_postが、どちらも同じ問題を抱えています。__single_posturl で直接アクセスできないように、最終結果をメソッドという名前にすることをお勧めし/blog/single_postます。
また
投稿が存在しない場合のエラー処理をまだコーディングしていません (そのため、URL にランダムな内容を入力しても、single_post ビューが表示されません)。この問題を理解した後、私はそれを行う予定です。