Laravel 4.2在Post上创建一个视图计数

时间:2016-02-04 10:00:10

标签: php laravel laravel-4

实际上我需要在帖子视图上实现一个计数器 表Advertissements的结构是

Id, Title, Descritpion, Content, view_count, visited_date, Ip

我尝试使用某个活动,但这不是我认为的最佳做法。我不知道在哪里放置代码。

public function show($slug) {
    $advert = Advertissement::where('slug', $slug)->firstOrFail();
    $author = $advert->user;

    $socials = Social::all();

    $catAdvert = AdvertCategory::with(['advertissements' => function($query){
        $query->orderBy('created_at', 'DESC')->get();
    }]);

    //Event problem here
    Event::fire('advertissements.view', $advert);

    return View::make('advertissements.show', compact('advert', 'author', 'catAdvert', 'socials'));
}

1 个答案:

答案 0 :(得分:1)

触发事件

请参阅official documentation

  

Laravel Event类提供了一个简单的观察者实现,允许您在应用程序中订阅和侦听事件

在您的代码中,您将触发未在任何地方注册的事件。

首先,您需要在触发过程中将数据作为数组传递:

Event::fire('advertissements.view', array($advert));

其次,设置监听器。它可以在您执行的代码中的任何位置,我通常将其放在app/routes.php文件中(其他人在app/start/global.php或在作曲家自动加载的文件中执行...它取决于您):

Event::listen('advertissements.view', function($advert) {
    // Do what you want to handle the event
});

PS:FYI这是处理Laravel 4.x事件的方法,在Laravel 5中它已经改变了一点。泰勒已经改进了这个过程,增加了工匠命令来帮助制作和设置活动。请查看Laravel 5 events docs

为你的柜台

创建模型Counter

class Counter extends Eloquent {

    protected $table = 'counters';

    public function advertissement()
    {
        return $this->belongsTo('Advertissement');
    {
}

Advertissement模型中添加

public function counter()
{
    return $this->hasOne('Counter');
{

Counter的迁移中为advertissement_id添加无符号整数,为views添加另一个未定义的整数,然后在侦听器中使用:

Event::listen('advertissements.view', function($advert) {
    $counter = new Counter();
    $counter->views = $advert->counter()->views++;
    $advert->counter()->save($counter);
});

未经过测试(我现在没有在我的机器上运行4.2),但应该可以使用。