Installation
composer require baks-dev/reference-gender
Ensure your project uses PHP 8.4+ (check composer.json and php -v).
First Use Case Import the core class and use the static methods to fetch gender-related data:
use BaksDev\ReferenceGender\Gender;
// Get all genders
$allGenders = Gender::all();
// Get a specific gender by ID
$maleGender = Gender::find(1);
// Check if a gender exists
$exists = Gender::exists(2);
Where to Look First
Gender class: Core functionality (methods like all(), find(), exists()).config/reference-gender.php: Default configurations (e.g., language, data sources).src/Exceptions/: Custom exceptions for error handling.Data Retrieval
$genders = Gender::all()->pluck('name', 'id');
$ruGenders = Gender::all('ru'); // Assuming 'ru' is a supported locale
Integration with Eloquent Models
Add a gender relationship to a model (e.g., User):
use BaksDev\ReferenceGender\Traits\HasGender;
class User extends Model
{
use HasGender;
// Automatically adds `gender_id` to fillable and casts it to integer.
}
Validation Use the package’s rules for form validation:
use BaksDev\ReferenceGender\Rules\GenderExists;
$request->validate([
'gender_id' => ['required', new GenderExists],
]);
Localization Override default translations by publishing the config:
php artisan vendor:publish --provider="BaksDev\ReferenceGender\GenderServiceProvider" --tag="config"
Then update config/reference-gender.php to specify locales (e.g., ['default' => 'en']).
Dynamic Gender Selection Use middleware to set a default gender for authenticated users:
public function handle(Request $request, Closure $next)
{
if ($request->user()) {
$request->user()->setDefaultGender(1); // ID for 'Male'
}
return $next($request);
}
API Responses Return gender data in API responses:
return response()->json([
'user' => [
'name' => $user->name,
'gender' => Gender::find($user->gender_id)?->name,
],
]);
Seeding Seed gender data during project setup:
use BaksDev\ReferenceGender\Database\Seeders\GenderSeeder;
class DatabaseSeeder extends Seeder
{
public function run()
{
$this->call(GenderSeeder::class);
}
}
@php
$genders = \BaksDev\ReferenceGender\Gender::all()->keyBy('id');
@endphp
$this->partialMock(Gender::class, function ($mock) {
$mock->shouldReceive('find')->andReturn((object) ['id' => 1, 'name' => 'Male']);
});
GenderRepositoryInterface for custom backends (e.g., database, API).Locale Mismatches
config/reference-gender.php specifies supported locales:
'locales' => ['en', 'ru'], // Add your locales here
Database Seeder Conflicts
GenderSeeder multiple times may cause duplicate entries. Check for existing data before seeding:
if (!Gender::all()->isEmpty()) {
return;
}
PHP Version Compatibility
php -r "echo PHP_VERSION_ID >= 80400 || 'Upgrade PHP!';"
Caching Issues
$genders = Cache::remember('genders', now()->addHours(1), function () {
return Gender::all();
});
Missing Gender Data
GenderSeeder ran or if data exists in your database table (gender by default). Run:
php artisan db:seed --class=GenderSeeder
Translation Errors
resources/lang/{locale}/gender.php or publish the package’s translations:
php artisan vendor:publish --tag=reference-gender-translations
Method Not Found
BaksDev\ReferenceGender\Gender) or add a use statement at the top of your file.Extend Functionality
Gender class by creating a decorator:
namespace App\Services;
use BaksDev\ReferenceGender\Gender as BaseGender;
class Gender extends BaseGender
{
public static function getActiveGenders()
{
return static::all()->where('active', true);
}
}
AppServiceProvider:
$this->app->bind(Gender::class, function ($app) {
return new App\Services\Gender();
});
Performance Optimization
User::with('gender')->get();
Testing
Gender facade for cleaner tests:
use BaksDev\ReferenceGender\Facades\Gender;
public function testGenderExists()
{
$this->assertTrue(Gender::exists(1));
}
Custom Exceptions
try {
$gender = Gender::find(999); // Non-existent ID
} catch (\BaksDev\ReferenceGender\Exceptions\GenderNotFound $e) {
abort(404, 'Gender not found');
}
Configuration Overrides
config/reference-gender.php:
'table' => 'custom_gender_table',
How can I help you explore Laravel packages today?