insomnicles/laraexpress

一个用于反应、评分、表情符号和其他自定义表达类型的Laravel包

dev-main 2023-08-31 14:34 UTC

This package is auto-updated.

Last update: 2024-09-30 01:43:31 UTC


README

在Laravel中处理表达、反应和评分的简单方法。

特性

  • 术语

    • ExpressionType: 表达类型,反应或评分(例如1到5星,喜欢/不喜欢)
    • ExpressableModel: 可以有表达式的Laravel模型类型(例如'App\Models\Image')
    • Expressable Id: 具体ExpressableModel类型的id(例如id=4)
    • Expression: 表达值(例如3星)
  • 表达式特性

    • 具有离散或渐变范围的几个内置表达式类型
    • 可以添加自定义表达式
    • 可表达模型(可以表达表达式的模型)必须在数据库中预先定义
    • 可表达模型可以有多个表达式类型
      • 例如,图像模型可以有两个表达式类型:喜欢/不喜欢和5星评分)
    • 每个可表达模型-表达式类型对只有一个用户表达式
    • 只有认证用户可以存储表达式
    • 用户仅被授权更新或删除自己的表达式
  • 预定义表达式类型

    • 鼓掌
    • 喜欢/不喜欢
    • 热 - 冷离散
    • 热 - 冷渐变
    • 认知:有趣、清晰、困惑
    • 情感:快乐、悲伤、超级快乐
    • 五星
    • 米其林星级:1、2或3星
    • 投票:赞成、反对、弃权
    • ELO象棋评分:1200或以上

安装

composer require insomnicles/laraexpress
php artisan vendor:publish

用法

  • 要定义哪些模型可以有什么表达类型的表达式,将以下内容添加到数据库seeder中
ExpressableModel::create([ 
	'expressable_type' => 'App\Models\Image',
	'expression_type_id' => Xpress::FIVESTAR ]);

ExpressableModel::create([
	'expressable_type' => 'App\Models\Image',
	'expression_type_id' => Xpress::EMOTIVE ]);
  • 要创建表达式/评分,使用Express::express Facade
    • Express::express($object, $type_id, $expression)
$expr = Express::express($image, Xpress::FIVESTAR, Express::TWOSTARS);
$expr = Express::express($product, Xpress::FIVESTAR, Express::FIVESTARS);
$expr = Express::express($restaurant, Xpress::MICHELINSTAR, Express::ONEMICHELINSTARS);
$expr = Express::express($image, Xpress::LIKEDISLIKE, Express::LIKE);
$expr = Express::express($image, Xpress::HOTCOLDGRADIENT, 2.563);
$expr = Express::express($image, Xpress::EMOTIVE, Express::HAPPY);
$expr = Express::express($image, Xpress::EMOTIVE, Express::MAD);
$expr = Express::express($image, Xpress::COGNITIVE, Express::CONFUSING);
$expr = Express::express($image, Xpress::COGNITIVE, Express::INTERESTING);
$expr = Express::express($chessPlayer, Xpress::ELO, Express::GRANDMASTER);
$expr = Express::express($chessPlayer, Xpress::ELO, 2832);
$expr = Express::express($bill, Xpress::VOTE, Express::INFAVOR);
  • 要检索表达式值和统计数据,使用Express::stats Facade
    • Express::stats(String $expressable_type, int $expressable_id, int $expression_type_id)
$objectStats = Express::stats(5, 1, 6);

创建自定义类型

  • 要创建自定义表达式类型,请执行以下操作
    1. 添加新的自定义表达式类型
      • 通过ExpressionTypes Seeder在DatabaseSeeder.php中添加记录到ExpressionType Model(或在表中插入记录)
      • 示例:表示爱情的自定义类型
      ExpressionType::create([
          'id' => 11, 'description' => 'Love Rating from 1 to 5',
          'range_type' => 'int', 'min' => 1, 'max' => 5,
          'icons' => json_encode([    1 => 'icons/smallheart.png', 3 => 'icons/heart.png', 5 => 'icons/bigheart.png']),
          'labels' => json_encode([   1 => 'little love',  3 => 'love', 5 => 'looove' ])]);
      
    2. 添加用户可以对哪些模型进行自定义类型表达式
      • 通过ExpressableModelSeeder在DatabaseSeeder中添加记录到ExpressableModel
      • 示例:用户可以对用户和图像模型留下爱情表达
      ExpressableModel::create([ 'id' => 4, 'expressable_type' => 'App\Models\User',   'expression_type_id' => 11 ]);
      ExpressableModel::create([ 'id' => 4, 'expressable_type' => 'App\Models\Image',  'expression_type_id' => 11 ]);
      
    3. 添加Facade调用常量
      • 将常量、自定义类型名称和表达式值添加到Xpress.php
      const LOVERTG = 11;    // corresponds to id in expression_type_table
      const LTLLOVE = 1;
      const LOVE = 3;
      const LOOOVE = 5;
      
    4. 使用Facades,如上所示 $expression = Express::express($image, Express::LOVERTG, Express::HUGELUV); $expression = Express::express($user, Express::LOVERTG, Express::LUV);

预定义表达式类型定义示例

  • 米其林星级

    • range_type: int
    • min: 1
    • max: 3
    • names: [ 1 => '1 Michelin Star', 2 => '2 Michelin Stars', 3 => '3 Michelin Stars' ]
    • icons: [ 1 => '1-star.png', 2 => '2-stars.png', 3 => '3-stars.png' ]
  • 投票

    • range_type: int
    • min: 1
    • max: 2
    • names: [ 1 => 'In Favor', 2 => 'Against' ]
    • icons: null
  • 热-冷

    • range_type: float
    • min: 1
    • max: 5
    • names: [ 1 => 'Freezing', 2 => 'Cold', 3 => 'Medium', 4 => 'Warm', 5 => 'Hot' ]
    • icons: [ 1 => 'freezing.png', 5 => 'hot.png' ]

设计选择

  • 独立于Laravel应用程序的其他部分
    • i) 仅使用外观调用(不使用eloquent)
    • ii) 使用
      • 如果应用程序是独立的Laravel项目的一部分,则仅使用一个外观调用
      • 如果应用程序是微服务,则仅使用其他路由
    • PRO
      • 在基本的CRUD案例中,添加、删除和更新表达式更为简单
      • 表达式版本更新不会影响应用程序的其他部分
      • 可以在使用不同语言和框架的架构中创建独立的表达式微服务
      • 与关系型或NoSQL数据库的集成更为简单:无需更改外观
    • CON:无法与eloquent模型和查询集成
      • 使得查询表达式变得更加繁琐(两步/三步过程)并可能更慢

许可证

Laravel框架是开源软件,根据MIT许可证授权。