codingmatters/client-management-package
Laravel package for managing clients in your application. Provides a foundation for client records and related workflows so you can add, update, and organize client data consistently across projects.
Installation
composer require codingmatters/client-management-package
Publish the package configuration and migrations:
php artisan vendor:publish --provider="CodingMatters\ClientManagement\ClientManagementServiceProvider" --tag="config"
php artisan vendor:publish --provider="CodingMatters\ClientManagement\ClientManagementServiceProvider" --tag="migrations"
php artisan migrate
Key Classes
Client model (app/Models/Client.php): Core model for managing clients/partners.ClientService facade (Client::class): Primary interface for CRUD operations.ClientRepository: Handles data persistence (extendable for custom logic).First Use Case Create a client via Tinker:
use CodingMatters\ClientManagement\Facades\Client;
$client = Client::create([
'name' => 'Acme Corp',
'email' => 'contact@acme.com',
'contract_start_date' => now(),
'contract_end_date' => now()->addYear(),
'status' => 'active', // or 'pending', 'terminated'
'partner_type' => 'premium', // or 'standard', 'trial'
]);
Client Lifecycle Management
Client::create() with required fields (name, email, status).Client::update($id, ['field' => 'value']).Client::changeStatus($id, 'terminated') with validation hooks.Client::destroy($id) (check hasGlobalScope for soft-deletes).Data Retrieval
$activeClients = Client::where('status', 'active')->get();
$premiumClients = Client::premium()->get(); // Uses package scope
$clientsWithContracts = Client::with('contracts')->get();
$searchResults = Client::search('Acme')->get(); // Uses Laravel Scout if configured.
Integration with Existing Systems
ClientCreated, ClientStatusUpdated via Event::listen().ClientWelcomeEmail after creation:
event(new \CodingMatters\ClientManagement\Events\ClientCreated($client));
ClientResource (if included) for API responses:
return new ClientResource(Client::find($id));
Custom Logic
ClientRepository methods in a service provider:
$this->app->bind(
\CodingMatters\ClientManagement\Repositories\ClientRepository::class,
\App\Repositories\CustomClientRepository::class
);
Client model:
public function scopeByPartnerType($query, $type) {
return $query->where('partner_type', $type);
}
Missing Required Fields
Client model enforces name, email, and status as required. Validate inputs before creation:
$validated = $request->validate([
'name' => 'required|string|max:255',
'email' => 'required|email',
'status' => 'required|in:active,pending,terminated',
]);
Date Validation
contract_end_date must be after contract_start_date. Add custom validation:
use Illuminate\Validation\Rule;
$request->validate([
'contract_end_date' => [
'required',
'after:contract_start_date',
Rule::exists('clients')->ignore($client->id),
],
]);
Soft Deletes
SoftDeletes. Ensure queries account for this:
// Returns all clients, including soft-deleted
$allClients = Client::withTrashed()->get();
Scout Indexing
search(), ensure Laravel Scout is configured. Test with:
php artisan scout:import "App\Models\Client"
ClientRepository methods to trace data flow.AppServiceProvider:
public function boot() {
ClientCreated::dump(); // Dump event payloads for debugging
}
Custom Attributes
Client model:
public function getContractDurationAttribute() {
return $this->contract_end_date->diffInDays($this->contract_start_date);
}
Policy Integration
use CodingMatters\ClientManagement\Models\Client;
use Illuminate\Auth\Access\HandlesAuthorization;
class ClientPolicy {
use HandlesAuthorization;
public function update(User $user, Client $client) {
return $user->can('manage_clients') && $client->status !== 'terminated';
}
}
API Resources
ClientResource to include custom fields:
public function toArray($request) {
return array_merge(parent::toArray($request), [
'contract_duration' => $this->contract_duration,
]);
}
Testing
$client = Client::factory()->create(['status' => 'active']);
$this->partialMock(ClientRepository::class, function ($mock) {
$mock->shouldReceive('find')->andReturn($client);
});
How can I help you explore Laravel packages today?