jangaraev/laravel-impressionable

用于 Laravel Eloquent 模型的视图计数

dev-main 2022-06-30 15:33 UTC

This package is auto-updated.

Last update: 2024-09-29 06:08:46 UTC


README

Total Downloads License

一个有用的包,用于自动化印象(视图)计数。

目录

安装

$ composer require jangaraev/laravel-impressionable

您还必须发布一个迁移文件,该文件创建一个数据库表以存储印象数据。运行新发布的迁移。

$ php artisan vendor:publish --provider="Jangaraev\LaravelImpressionable\ImpressionableServiceProvider" --tag="migrations"
$ php artisan migrate

用法

通过声明接口并添加辅助特质,对适当的模型进行对齐。

namespace App\Models;  
 
use Illuminate\Database\Eloquent\Model;
use Jangaraev\LaravelImpressionable\Contracts\Impressionable;
use Jangaraev\LaravelImpressionable\Traits\CountsImpressions;
 
class MyModel extends Model implements Impressionable
{
    use CountsImpressions;
}

完成后,现在可以在该模型上调用 incrementImpressions() 方法。

通常在控制器的 show() 方法中

public function show(string $slug)
{
    $modelInstance = $modelRepository::getBySlug($slug);
 
    // fetching related models, doing required checks, setting up meta tags, etc  
 
    $modelInstance->incrementImpressions();
 
    return view('show', compact('modelInstance'));
}

打印印象就像这样简单

// prints value from DB
echo $model->impressions;

形态映射

可以通过添加 形态映射 来引入更短、更用户友好的模型名称,这些名称将被写入数据库而不是模型的完全限定名称。

+------------+---------------------+-------------------+------------+
| date       | impressionable_type | impressionable_id | ip         |
+------------+---------------------+-------------------+------------+
| 2022-05-17 | foo                 |                65 | 2130706433 |
| 2022-05-17 | \App\Models\Foo     |                65 | 2130706433 |
+------------+---------------------+-------------------+------------+

第一行使用形态映射写入,第二行没有使用,两者都引用了相同的模型。

重要! 您不能同时使用这两种方法。如果您已经在数据库中编写并引用了形态关系,当您在形态映射中引入它们时,它们将变得无效。

例如,您有一个在数据库中已引用的模型 Cat。如果您在形态映射中将其重新映射为与模型的全限定名称不同的任何内容,您的引用将会失效。解决方案是从一开始就映射模型,或者创建一个迁移,该迁移将重新映射现有引用到新的写入中。

通过服务提供商注册的典型形态映射示例

namespace App\Providers;

use Illuminate\Database\Eloquent\Relations\Relation;
use Illuminate\Support\ServiceProvider;

class MorphMapServiceProvider extends ServiceProvider
{
    public function boot()
    {
        Relation::morphMap([
            'cat' => \App\Models\Cat::class,
            'dog' => \App\Models\Dog::class,
            // ...
            'foo' => \App\Models\Foo::class,
            'bar' => \App\Models\Bar::class,
        ]);
    }
}

许可证

该包是一个开源的 Laravel 包,许可协议为 MIT。