andrewdwallo/filament-companies
Installation
composer require andrewdwallo/filament-companies
php artisan filament-companies:install
First Use Case
/admin (Filament panel) to access the Companies and Employees resources./register route (auto-generated by the package).Key Files to Review
config/filament-companies.php (core settings like default roles, email templates).app/Providers/FilamentCompaniesServiceProvider.php (customization hooks).database/migrations/ (check for custom tenant fields).Company Tenancy
spatie/laravel-multi-tenant).FilamentCompanies::setCurrentCompany($company) in middleware or services.use Andrewdwallo\FilamentCompanies\Facades\FilamentCompanies;
// In a middleware:
FilamentCompanies::setCurrentCompany(auth()->user()->company);
Employee Onboarding
$company->inviteEmployee('employee@example.com', ['role' => 'editor']);
config/filament-companies.php:
'auto_accept_invitations' => true,
Role-Based Access
public function viewAny(Company $company)
{
return auth()->user()->can('view companies');
}
Socialite Integration
config/services.php (e.g., Google, GitHub).SocialAuthController or extend:
use Andrewdwallo\FilamentCompanies\Http\Controllers\SocialAuthController;
Route::get('/login/google', [SocialAuthController::class, 'redirectToGoogle']);
Customizing Filament Resources
app/Filament/Resources/CompanyResource.php:
namespace App\Filament\Resources;
use Andrewdwallo\FilamentCompanies\Filament\Resources\CompanyResource as BaseCompanyResource;
class CompanyResource extends BaseCompanyResource
{
public static function form(Form $form): Form
{
return parent::form($form)
->schema([
// Add custom fields
]);
}
}
Database Schema Conflicts
spatie/laravel-multi-tenant, ensure the companies table has a schema_name column (or configure it in config/filament-companies.php).php artisan vendor:publish --provider="Andrewdwallo\FilamentCompanies\FilamentCompaniesServiceProvider" to republish migrations.Role/Permission Caching
spatie/laravel-permission).php artisan cache:clear
php artisan view:clear
Session Management Quirks
public function handle($request, Closure $next)
{
if (auth()->check()) {
FilamentCompanies::setCurrentCompany(auth()->user()->company);
}
return $next($request);
}
Email Templates
resources/views/vendor/filament-companies/emails/.invitation.blade.php for branded invites.Sanctum vs. Session Auth
use Andrewdwallo\FilamentCompanies\Facades\FilamentCompanies;
public function handle($request, Closure $next)
{
if ($request->bearerToken()) {
$user = auth()->user();
FilamentCompanies::setCurrentCompany($user->company);
}
return $next($request);
}
Log Company Context
Add to AppServiceProvider:
FilamentCompanies::macro('logContext', function () {
\Log::info('Current Company:', [
'id' => FilamentCompanies::getCurrentCompany()?->id,
'name' => FilamentCompanies::getCurrentCompany()?->name,
]);
});
Check Middleware Order
Ensure FilamentCompanies\Middleware\SetCurrentCompany runs after auth middleware in app/Http/Kernel.php.
Invitation Debugging
php artisan queue:work
tail -f storage/logs/laravel.log | grep "Invitation"
Custom Invitation Logic
Extend the EmployeeInvitation model:
namespace App\Models;
use Andrewdwallo\FilamentCompanies\Models\EmployeeInvitation as BaseInvitation;
class EmployeeInvitation extends BaseInvitation
{
protected static function booted()
{
static::creating(function ($invitation) {
// Add custom logic (e.g., log invites)
\Log::info("New invite for {$invitation->email}");
});
}
}
Webhook Events Listen for company/employee events:
use Andrewdwallo\FilamentCompanies\Events\CompanyCreated;
CompanyCreated::listen(function (CompanyCreated $event) {
// Send Slack notification, etc.
});
API Endpoints
Add custom API routes in routes/api.php:
use Andrewdwallo\FilamentCompanies\Http\Controllers\CompanyController;
Route::middleware('auth:sanctum')->group(function () {
Route::get('/companies/me', [CompanyController::class, 'current']);
});
How can I help you explore Laravel packages today?