意味のあるテーブル名を使用する
要件に基づいて、たとえば「post_views」(ユーザーによる投稿の表示) などのビューを記録するテーブルに名前を付けることができます。
tbl_post_views
-id
-user_id
-post_id
接頭辞でない場合tbl_
は、従来のように削除してください。
したがって、post と user の両方に属する PostView という名前のモデルがあります。
class PostView extends AppModel {
public $belongsTo = array('Post', 'User');
}
ビュー アクションを使用してビューを追跡しないでください
ほとんどの場合、現在の意図は次のようなものを実装することです:
class PostsController extends AppController {
public $uses = array('Post', 'PostView');
public function view($id) {
$this->PostView->save(array('user_id' => $this->Auth->user('id'), 'post_id' => $id));
$data = $this->Post->findById($id);
$this->set(compact('data'));
}
}
そうしないほうがいいです。ビューをコントローラ コードに記録することには、2 つの重大な問題があります。
- ユーザーがそれを見るのではなく、ビューを生成することを記録しています(必ずしも同じものではありません)
- キャッシュに干渉します(phpまたはユーザーのブラウザのいずれかで)
画像ビーコンを使用する
リクエストが行われたときにビューを記録する代わりに、レンダリングされた出力に「イメージ ビーコン」を含めます。
// end of file View/Posts/view.ctp
echo $this->Html->image(array('action' => 'viewed', $postId), array('class' => 'beacon'));
投稿コントローラーで、投稿が閲覧されたことを記録し、適切なヘッダーを使用して有効な画像を出力します (そうしないと、ユーザーのブラウザーによってエラーが報告されます)。これにより、応答がキャッシュされなくなります。
class PostsController extends AppController {
...
public function viewed($id) {
$this->PostView->save(array('user_id' => $this->Auth->user('id'), 'post_id' => $id));
$this->response->disableCache();
$this->response->file('webroot/img/1px.gif'); // a 1px gif
return $this->response;
}
}
このように、ユーザーがどのような方法でコンテンツを読んだかに関係なく、ユーザーが該当するページを閲覧したという記録が残ります。