PHP code example of fzengin19 / laravel-approval

1. Go to this page and download the library: Download fzengin19/laravel-approval 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/ */

    

fzengin19 / laravel-approval example snippets




namespace App\Models;

use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
use LaravelApproval\Contracts\ApprovableInterface;
use LaravelApproval\Traits\Approvable;

class Post extends Model implements ApprovableInterface
{
    use HasFactory, Approvable;

    protected $fillable = [
        'title',
        'content',
    ];
}

use LaravelApproval\Enums\ApprovalStatus;
use LaravelApproval\Facades\Approval;

// Create a post
$post = Post::create([
    'title' => 'My First Post',
    'content' => 'This is my content...',
]);

// Set to pending
$post->setPending(1); // 1 = user ID

// Approve
$post->approve(1);

// Reject with reason
$post->reject(1, 'spam', 'This is spam content');

// Check status
$post->isApproved(); // true
$post->isPending();  // false
$post->isRejected(); // false
$post->getApprovalStatus(); // Returns ApprovalStatus::APPROVED enum case

// Use query scopes
$approvedPosts = Post::approved()->get();
$pendingPosts = Post::pending()->get();
$rejectedPosts = Post::rejected()->get();

// Get statistics
$stats = Approval::getStatistics(Post::class);

return [
    // The user model that is responsible for approval actions.
    'user_model' => config('auth.providers.users.model'),

    'default' => [
        // Core Settings
        'mode' => 'insert',                    // 'insert' or 'upsert'
        'auto_pending_on_create' => false,     // Automatically create a pending approval on model creation
        'show_only_approved_by_default' => false, // When the global scope is registered, show only approved records by default
        'auto_scope' => true,                  // Global master switch for registering the approval scope
        'default_status_for_unaudited' => null, // Default status for models with no approval record. Can be: null, 'pending', 'approved', 'rejected'.

        // Event Settings
        'events_enabled' => true,              // Enable event system
        'events_logging' => true,              // Log events
        'events_webhooks_enabled' => false,    // Enable webhooks
        'events_webhooks_endpoints' => [],     // Webhook endpoints
        'events_custom_actions' => [           // Invokable class strings resolved through the container
            'model_approved' => [
                // Example: \App\ApprovalActions\HandleModelApproved::class
            ],
            // ... other events
        ],

        // Rejection Settings
        'rejection_reasons' => [
            'inappropriate_content' => 'Inappropriate Content',
            'spam' => 'Spam',
            'other' => 'Other',
        ],
    ],
    
    'models' => [
        // Model specific settings (override defaults)
        'App\Models\Post' => [
            'mode' => 'upsert',
            'auto_pending_on_create' => true,
        ],
    ],
];

use LaravelApproval\Enums\ApprovalStatus;

// Create a model
$post = Post::create(['title' => 'New Post']);

// Check current status
// By default, a model with no approval record has a `null` status.
$post->isPending();    // false
$post->isApproved();   // false
$post->isRejected();   // false
$post->getApprovalStatus(); // null

// You can change this behavior with `default_status_for_unaudited` config.
// If config is set to 'pending':
// config(['approvals.default.default_status_for_unaudited' => 'pending']);
// $post->isPending(); // true, returns true
// $post->getApprovalStatus(); // ApprovalStatus::PENDING, returns enum case

// Set to pending
$post->setPending(1);  // 1 = approving user ID

// Approve
$post->approve(1);

// Reject with predefined reason
$post->reject(1, 'spam', 'Additional details');

// Reject with an unknown reason (stored as `other` and folded into the comment)
$post->reject(1, 'Custom reason', 'Additional details');

// Get approval history
$allApprovals = $post->approvals; // All approval records (MorphMany)
$latestApproval = $post->latestApproval; // Current approval record (MorphOne)

// Get who caused the approval
$causer = $post->latestApproval->causer; // Returns the configured user model instance via the polymorphic causer relation

// Get only approved posts
$approvedPosts = Post::approved()->get();

// Get only pending posts
$pendingPosts = Post::pending()->get();

// Get only rejected posts
$rejectedPosts = Post::rejected()->get();

// Get with approval status (eager load latest approval)
$posts = Post::withApprovalStatus()->get();

// Include unapproved posts (when global scope is active)
$allPosts = Post::withUnapproved()->get();

// Check if global scope is active
$posts = Post::all(); // Only approved if global scope is enabled

'default' => [
    'mode' => 'insert',  // Default mode
    // ... other settings
],

$post->setPending(1);  // New record
$post->approve(1);     // New record
$post->reject(1);      // New record
// Total: 3 records (full history)

'default' => [
    'mode' => 'upsert',  // Or set per model
    // ... other settings
],

$post->setPending(1);  // New record
$post->approve(1);     // Update existing record
$post->reject(1);      // Update existing record
// Total: 1 record (current status only)

// Using predefined reason
$post->reject(1, 'spam', 'Additional details');
// Result: rejection_reason = 'spam', rejection_comment = 'Additional details'

// Using an unknown reason
$post->reject(1, 'copyright_violation', 'Image belongs to Getty Images');
// Result: rejection_reason = 'other', rejection_comment = 'copyright_violation - Image belongs to Getty Images'

// Only approved posts (when global scope is enabled)
$posts = Post::all();

// To see all posts (bypass global scope)
$allPosts = Post::withUnapproved()->get();

// Check whether this model is configured to hide unapproved rows by default
$showOnlyApproved = config('approvals.models.' . Post::class . '.show_only_approved_by_default', 
                          config('approvals.default.show_only_approved_by_default', false));

'default' => [
    'auto_scope' => true,  // Register the global scope for approvable models
    // ... other settings
],

use LaravelApproval\Scopes\ApprovableScope;

$approvedPosts = Post::withGlobalScope('approvable', new ApprovableScope)->get();

'default' => [
    'auto_pending_on_create' => false,  // Set to true to enable globally
    // ... other settings
],

'models' => [
    'App\Models\Post' => [
        'auto_pending_on_create' => true,  // Enable for specific model
        // ... other settings
    ],
],

$post = Post::create(['title' => 'Test']);
// Will automatically be in pending status if auto_pending_on_create is enabled

'models' => [
    'App\Models\Post' => [
        'mode' => 'upsert',                    // This model uses upsert mode
        'auto_pending_on_create' => true,      // Auto pending for this model
        'show_only_approved_by_default' => true, // Global scope active for this model
        'events_enabled' => false,             // No events for this model
        'rejection_reasons' => [               // Custom rejection reasons
            'inappropriate_content' => 'Inappropriate Content',
            'spam' => 'Spam',
            'duplicate' => 'Duplicate',
            'incomplete' => 'Incomplete',
            'copyright_violation' => 'Copyright Violation',
            'other' => 'Other',
        ],
    ],
    'App\Models\Comment' => [
        'mode' => 'insert',                    // This model uses insert mode
        'auto_pending_on_create' => false,     // No auto pending for this model
        'events_enabled' => true,              // Events enabled for this model
        'events_logging' => false,             // No logging for this model
        'rejection_reasons' => [               // Different rejection reasons
            'spam' => 'Spam',
            'harassment' => 'Harassment',
            'inappropriate' => 'Inappropriate',
            'offensive' => 'Offensive',
            'other' => 'Other',
        ],
    ],
    'App\Models\Product' => [
        'mode' => 'upsert',
        'auto_pending_on_create' => true,
        'events_webhooks_enabled' => true,     // Webhooks enabled for this model
        'events_webhooks_endpoints' => [
            [
                'url' => 'https://api.example.com/webhooks/product-approval',
                'headers' => ['Authorization' => 'Bearer token'],
                'events' => ['model_approved', 'model_rejected'],
            ],
        ],
        'rejection_reasons' => [
            'inappropriate_content' => 'Inappropriate Content',
            'spam' => 'Spam',
            'duplicate' => 'Duplicate',
            'incomplete' => 'Incomplete',
            'pricing_violation' => 'Pricing Violation',
            'category_mismatch' => 'Category Mismatch',
            'other' => 'Other',
        ],
    ],
],

use Illuminate\Support\Facades\Event;
use LaravelApproval\Events\ModelApproved;
use LaravelApproval\Events\ModelRejected;

Event::listen(ModelApproved::class, function (ModelApproved $event) {
    // Access event properties directly (they are public readonly)
    $model = $event->model;
    $approval = $event->approval;
    $causedBy = $event->causedBy;
    $context = $event->context;
    
    // Actions to take when approved
    \Log::info("Model approved: " . $model->id);
});

Event::listen(ModelRejected::class, function (ModelRejected $event) {
    $model = $event->model;
    $approval = $event->approval;
    
    // Actions to take when rejected
    \Log::info('Model rejected', [
        'model' => get_class($model),
        'caused_by' => $event->causedBy,
        'reason' => $event->reason,
        'comment' => $event->comment,
    ]);
});

'default' => [
    // Event Settings
    'events_enabled' => true,              // Enable event system
    'events_logging' => true,              // Log events
    'events_webhooks_enabled' => false,    // Enable webhooks
    'events_webhooks_endpoints' => [],     // Webhook endpoints
    'events_custom_actions' => [           // Custom event actions
        'model_approved' => [
            // Example: \App\ApprovalActions\HandleModelApproved::class
        ],
        'model_rejected' => [
            // Example: \App\ApprovalActions\HandleModelRejected::class
        ],
        'model_pending' => [
            // Example: \App\ApprovalActions\HandleModelPending::class
        ],
        'model_approving' => [
            // Example: \App\ApprovalActions\HandleModelApproving::class
        ],
        'model_rejecting' => [
            // Example: \App\ApprovalActions\HandleModelRejecting::class
        ],
        'model_setting_pending' => [
            // Example: \App\ApprovalActions\HandleModelSettingPending::class
        ],
    ],
    // ... other settings
],

'models' => [
    'App\Models\Post' => [
        'events_enabled' => false,              // No events for this model
        // ... other settings
    ],
    'App\Models\Comment' => [
        'events_enabled' => true,
        'events_logging' => false,              // No logging for this model
        // ... other settings
    ],
            'App\Models\Product' => [
            'events_webhooks_enabled' => true,      // Webhooks enabled
            'events_webhooks_endpoints' => [
                [
                    'url' => 'https://api.example.com/webhooks/product-approval',
                    'headers' => ['Authorization' => 'Bearer token'],
                    'events' => ['model_approved', 'model_rejected'],
                ],
            ],
            'rejection_reasons' => [
                'inappropriate_content' => 'Inappropriate Content',
                'spam' => 'Spam',
                'duplicate' => 'Duplicate',
                'incomplete' => 'Incomplete',
                'pricing_violation' => 'Pricing Violation',
                'category_mismatch' => 'Category Mismatch',
                'other' => 'Other',
            ],
            // ... other settings
        ],
],



namespace App\ApprovalActions;

use LaravelApproval\Events\ModelApproved;

final class HandleModelApproved
{
    public function __invoke(ModelApproved $event): void
    {
        // Handle the approval event here.
    }
}

use LaravelApproval\Facades\Approval;

// Assuming $post is an Approvable model instance
// and $user is the user performing the action.

// Approve model
Approval::approve($post, $user->id);

// Reject model
Approval::reject($post, $user->id, 'Invalid content', 'Description');

// Set to pending status
Approval::setPending($post, $user->id);

// Get statistics for specific model
$stats = Approval::getStatistics(\App\Models\Post::class);
// [
//     'total' => 10,
//     'approved' => 7,
//     'pending' => 2,
//     'rejected' => 1,
//     'approved_percentage' => 70.0,
//     'pending_percentage' => 20.0,
//     'rejected_percentage' => 10.0,
// ]

// Get all statistics for configured models
$allStats = Approval::getAllStatistics();
// [
//     'App\Models\Post' => [...],
//     'App\Models\Comment' => [...],
//     'App\Models\Product' => [...],
// ]

// Passing a model instance to getModelStatistics() uses its class.
$sameStats = Approval::getModelStatistics($post);
bash
php artisan vendor:publish --provider="LaravelApproval\LaravelApprovalServiceProvider"
php artisan migrate
bash
php artisan migrate