1. Go to this page and download the library: Download sierratecnologia/gamer library. Choose the download type require.
2. Extract the ZIP file and open the index.php.
3. Add this code to the index.php.
<?php
require_once('vendor/autoload.php');
/* Start to develop here. Best regards https://php-download.com/ */
// src/Traits/Pointable.php
trait Pointable
{
public function transactions($amount = null); // Relacionamento com transações
public function points(); // Relacionamento com tipos de pontos
public function countTransactions(); // Contagem de transações
public function currentPoints(); // Saldo atual de pontos
public function addPoints($amount, $message, $data = null); // Adicionar pontos
}
// src/Repositories/PromotionRepository.php
class PromotionRepository
{
// Lógica de acesso a dados isolada
}
// src/Services/GamerService.php
class GamerService
{
// Lógica de negócio centralizada
}
// Qualquer modelo pode ser "Pointable"
class User extends Model implements Pointable
{
use PointableTrait;
}
// Relacionamento polimórfico
$user->transactions()->save($transaction);
// LoginObserver.php - Pontos automáticos ao fazer login
Event::listen('Illuminate\Auth\Events\Login', function($event) {
$event->user->addPoints(10, 'Login diário');
});
// ModelCallbacks.php - Pontos por ações em modelos
Event::listen('eloquent.created', function($model) {
if ($model instanceof Post) {
$model->user->addPoints(50, 'Criou um novo post');
}
});
// 1. Usuário realiza uma ação (ex: compra um produto)
$order = Order::create([...]);
// 2. Evento é disparado
event(new OrderCreated($order));
// 3. Observer captura e atribui pontos
// EventPointable.php ou Listener customizado
$order->user->addPoints(
$order->total * 0.1, // 10% do valor em pontos
'Compra no valor de R$ ' . $order->total,
['order_id' => $order->id]
);
// 4. Sistema verifica conquistas
if ($order->user->countTransactions() >= 10) {
$order->user->badges()->attach($badge10Compras);
// 5. Notificação é enviada
$order->user->notify(new BadgeUnlocked($badge10Compras));
}
// 6. Pontos são exibidos no dashboard
return view('gamer::profile.home', [
'currentPoints' => $order->user->currentPoints(),
'recentTransactions' => $order->user->transactions(5)->get(),
]);
namespace App\Models;
use Gamer\Contracts\Pointable;
use Gamer\Traits\Pointable as PointableTrait;
use Illuminate\Foundation\Auth\User as Authenticatable;
class User extends Authenticatable implements Pointable
{
use PointableTrait;
// ... resto do modelo
}
namespace App\Listeners;
use App\Events\PostPublished;
class AwardPostPoints
{
public function handle(PostPublished $event)
{
$post = $event->post;
// Pontos base
$post->user->addPoints(100, 'Publicou um artigo');
// Bônus por qualidade
if ($post->word_count >= 1000) {
$post->user->addPoints(50, 'Artigo com mais de 1000 palavras');
}
// Bônus por categoria
if ($post->category === 'tutorial') {
$post->user->addPoints(25, 'Tutorial técnico');
}
}
}
// Migration já preparada: 2020_09_18_231619_create_gamer_badges_tables.php
// Model customizado
class Badge extends Model
{
protected $fillable = ['name', 'description', 'icon', 'points_ublic function checkAndUnlock($user, $badgeSlug)
{
$badge = Badge::where('slug', $badgeSlug)->first();
if ($user->currentPoints() >= $badge->points_
namespace App\Observers;
use App\Models\Comment;
class CommentObserver
{
public function created(Comment $comment)
{
// Pontos para quem comentou
$comment->user->addPoints(5, 'Comentou em um post');
// Pontos para o autor do post
$comment->post->author->addPoints(2, 'Recebeu um comentário');
}
}
// AppServiceProvider.php
public function boot()
{
Comment::observe(CommentObserver::class);
}
namespace App\Listeners;
use Illuminate\Events\Dispatcher;
class GamificationSubscriber
{
public function onUserLogin($event)
{
$event->user->addPoints(10, 'Login diário');
}
public function onProfileUpdate($event)
{
if ($event->user->profile->isComplete()) {
$event->user->addPoints(50, 'Completou o perfil');
}
}
public function subscribe(Dispatcher $events)
{
$events->listen(
'Illuminate\Auth\Events\Login',
'App\Listeners\GamificationSubscriber@onUserLogin'
);
$events->listen(
'App\Events\ProfileUpdated',
'App\Listeners\GamificationSubscriber@onProfileUpdate'
);
}
}
/**
* Pontuação de Artigos:
* - Publicação: 100 pontos
* - +1000 palavras: +50 pontos
* - Categoria Tutorial: +25 pontos
* - Primeiro artigo: +100 pontos (badge)
*/
// ❌ Evite modificar Transaction.php
// ✅ Crie seu próprio modelo
class CustomTransaction extends \Gamer\Models\Transaction
{
public function customMethod() { ... }
}
Event::listen('gamer.points.added', function($transaction) {
// Sua lógica customizada
});
namespace App\Gamer\Extensions;
class CustomPointType extends PointType { ... }
// Pontos por assistir aulas
Event::listen('Course\Events\LessonCompleted', function($event) {
$event->user->addPoints(10, 'Completou aula: ' . $event->lesson->title);
});
// Pontos por concluir curso
Event::listen('Course\Events\CourseCompleted', function($event) {
$points = 100 + ($event->course->lessons_count * 5);
$event->user->addPoints($points, 'Concluiu curso: ' . $event->course->title);
});