tipoff/addresses
Laravel package providing reusable address models, migrations, factories, and relationships for storing mailing and physical addresses. Designed to integrate with Tipoff packages and apps, supporting consistent address data handling across projects.
Installation
composer require tipoff/addresses
Publish the config and migrations:
php artisan vendor:publish --provider="Tipoff\Addresses\AddressesServiceProvider"
php artisan migrate
First Use Case: Storing an Address
use Tipoff\Addresses\Models\Address;
$address = Address::create([
'name' => 'John Doe',
'street' => '123 Main St',
'city' => 'New York',
'state' => 'NY',
'postal_code' => '10001',
'country' => 'US',
]);
Where to Look First
config/addresses.php (API keys, default settings).Tipoff\Addresses\Models\Address (core model).Tipoff\Addresses\Services\AddressApiService (for external API interactions).CRUD Operations
Use Eloquent methods directly on the Address model:
// Fetch an address
$address = Address::find(1);
// Update an address
$address->update(['postal_code' => '10002']);
// Delete an address
$address->delete();
Validation Leverage Laravel’s built-in validation with the package’s rules:
use Tipoff\Addresses\Rules\ValidPostalCode;
$request->validate([
'postal_code' => ['required', new ValidPostalCode],
]);
API Integration
Use the AddressApiService to interact with external APIs (e.g., geocoding):
$api = app(\Tipoff\Addresses\Services\AddressApiService::class);
$result = $api->validateAddress($address->toArray());
Relationships Attach addresses to users or other models via polymorphic relationships:
// In User model
public function addresses()
{
return $this->morphMany(\Tipoff\Addresses\Models\Address::class, 'addressable');
}
Events and Observers
Extend functionality with events (e.g., AddressCreated):
// In EventServiceProvider
protected $listen = [
\Tipoff\Addresses\Events\AddressCreated::class => [
\App\Listeners\SendAddressWelcomeEmail::class,
],
];
API Key Configuration
config/addresses.api_key is set for external API calls.'api_enabled' => env('ADDRESSES_API_ENABLED', false),
Postal Code Validation
ValidPostalCode rule defaults to US formats. Override in config:
'postal_code' => [
'regex' => '/^[A-Z]{1,2}\d[A-Z0-9]? ?\d[A-Z]{2}$/i', // UK format
],
Migration Conflicts
addresses table, run:
php artisan migrate:fresh --env=testing
to avoid conflicts in test environments.Polymorphic Relationships
addressable table has addressable_type and addressable_id columns:
Schema::table('addresses', function (Blueprint $table) {
$table->morphs('addressable');
});
API Response Logging Enable debug mode in config:
'debug' => true,
Logs will appear in storage/logs/laravel.log.
Model Events Listen for model events to debug lifecycle:
Address::created(function ($address) {
Log::debug('Address created:', $address->toArray());
});
Custom Address Types
Extend the Address model or create a trait for domain-specific logic:
namespace App\Models;
use Tipoff\Addresses\Models\Address as BaseAddress;
class ShippingAddress extends BaseAddress
{
protected $attributes = [
'is_shipping' => true,
];
}
API Service Decorators
Decorate AddressApiService to add custom logic:
class CustomAddressApiService extends \Tipoff\Addresses\Services\AddressApiService
{
public function validateAddress(array $data)
{
// Custom logic
return parent::validateAddress($data);
}
}
Bind it in AppServiceProvider:
$this->app->bind(
\Tipoff\Addresses\Services\AddressApiService::class,
\App\Services\CustomAddressApiService::class
);
Testing Use factories and seeders for testing:
// database/factories/AddressFactory.php
$factory->define(\Tipoff\Addresses\Models\Address::class, function (Faker $faker) {
return [
'name' => $faker->name,
'street' => $faker->streetAddress,
// ...
];
});
How can I help you explore Laravel packages today?