さて、これにはいくつかのセットアップが必要です:
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_post
url で直接アクセスできないように、最終結果をメソッドという名前にすることをお勧めし/blog/single_post
ます。
また
投稿が存在しない場合のエラー処理をまだコーディングしていません (そのため、URL にランダムな内容を入力しても、single_post ビューが表示されません)。この問題を理解した後、私はそれを行う予定です。