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
$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,
]);
});
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);