Installation Run:
composer require jschlies/panichd
Publish the package assets and config:
php artisan vendor:publish --provider="PanicHD\PanicHDServiceProvider" --tag="config"
php artisan vendor:publish --provider="PanicHD\PanicHDServiceProvider" --tag="migrations"
php artisan vendor:publish --provider="PanicHD\PanicHDServiceProvider" --tag="public"
Run Migrations
php artisan migrate
Configure Routes
Add the package route to your routes/web.php:
Route::prefix('PanicHD')->group(function () {
require __DIR__.'/vendor/jschlies/panichd/routes/web.php';
});
(Modify the prefix if needed.)
First Use Case
Visit /PanicHD in your browser. Use the web installer to set up:
php artisan panic:demo to populate sample tickets/categories for testing.config/panichd.php (customize routes, email templates, and default settings).resources/views/vendor/panichd/ (override default views if needed)./PanicHD/tickets/create.resources/views/vendor/panichd/tickets/create.blade.php.app/Providers/PanicHDServiceProvider.php:
public function boot()
{
PanicHD::extend(function ($panichd) {
$panichd->validationRules = [
'title' => 'required|max:255',
'description' => 'required|min:10',
// Custom rules...
];
});
}
config/panichd.php:
'attachments_disk' => 's3', // Default: 'public'
/PanicHD/tickets.resources/views/vendor/panichd/emails/.config/panichd.php:
'notifications' => [
'ticket_created' => ['admin@example.com'],
],
config/panichd.php:
'reminders' => [
'enabled' => true,
'days_before_due' => 1,
],
Route::middleware(['auth', 'admin'])->group(function () {
// Admin-only routes
});
ticket.created):
PanicHD::listen('ticket.created', function ($ticket) {
Log::info("New ticket #{$ticket->id} created.");
});
Route::apiResource('panichd/tickets', \PanicHD\Http\Controllers\TicketController::class);
resources/views/vendor/panichd/ and modify.php artisan vendor:publish --tag="public" --provider="PanicHD\PanicHDServiceProvider"
Add custom styles to public/vendor/panichd/css/panichd.css.class Ticket extends \PanicHD\Models\Ticket
{
protected $casts = [
'custom_field' => 'array',
];
}
php artisan make:migration add_custom_field_to_tickets_table).Route Conflicts
/PanicHD may clash with existing routes. Fix: Change the prefix in routes/web.php or use a subdomain.php artisan route:list to check conflicts.Email Configuration
MAIL_DRIVER is misconfigured. Fix: Verify .env and test with php artisan panic:test-email.File Upload Limits
config/panichd.php:
'max_file_size' => '10M', // In MB
Demo Data Overwrite
php artisan panic:demo multiple times may duplicate data. Fix: Clear the database or use --force carefully.Translation Issues
{{ __('panichd::ticket.title') }}). Fix:
php artisan vendor:publish --tag="lang" --provider="PanicHD\PanicHDServiceProvider".resources/lang/en/panichd.php.Log Errors
Enable debug mode in config/panichd.php:
'debug' => env('APP_DEBUG', false),
Check logs at storage/logs/laravel.log.
SQL Queries Use Laravel Debugbar or enable query logging:
DB::enableQueryLog();
// Run PanicHD actions...
dd(DB::getQueryLog());
Common Issues
/PanicHD: Verify routes and middleware.display_errors in .env temporarily).storage/app/public is writable and FILESYSTEM_DISK is correct.Performance
tickets table for large datasets:
ALTER TABLE tickets ADD INDEX (status_id);
ALTER TABLE tickets ADD INDEX (category_id);
$tickets = Cache::remember('panichd_tickets', 60, function () {
return Ticket::all();
});
Security
VerifyCsrfToken middleware.Route::post('/api/tickets', function () {
// ...
})->middleware('throttle:10,1');
Testing
$panichd = Mockery::mock(\PanicHD\Facades\PanicHD::class);
$panichd->shouldReceive('createTicket')->once();
$response = $this->get('/PanicHD/tickets/create');
$response->assertStatus(200);
Extending Functionality
<a href="{{ route('panichd.tickets.custom', $ticket) }}" class="btn btn-sm btn-info">
Custom Action
</a>
PanicHD::listen('ticket.updated', function ($ticket) {
Http::post('https://hooks.slack.com/...', ['text' => "Ticket #{$ticket->id} updated"]);
});
Localization
How can I help you explore Laravel packages today?