Installation For quick setup (Codyas team members):
curl -s https://gist.githubusercontent.com/leoantunez/0446c79dcc717de4fbbc0cb8214c26d9/raw | bash -s PROJECT_NAME
For manual installation:
composer require codyas/skeleton-bundle
Configure User Model
Extend Codyas\Skeleton\Model\UserModel in your App\Entity\User:
namespace App\Entity;
use Codyas\Skeleton\Model\UserModel;
class User extends UserModel {}
Update Configuration
Configure config/packages/codyas_skeleton.yaml (if auto-generated) or manually set:
codyas_skeleton:
user_model: App\Entity\User
Run Migrations
Generate and run migrations for the default user fields (id, email, enabled, etc.):
php bin/console make:migration
php bin/console doctrine:migrations:migrate
Register a new user via API/Controller:
use Codyas\Skeleton\Model\UserModelInterface;
use Symfony\Component\HttpFoundation\Request;
public function register(Request $request): Response
{
$user = new User(); // Your extended UserModel
$user->setEmail($request->request->get('email'));
$user->setPassword($request->request->get('password')); // Auto-hashed by UserModel
$user->setRoles(['ROLE_USER']);
$entityManager = $this->getDoctrine()->getManager();
$entityManager->persist($user);
$entityManager->flush();
return new JsonResponse(['success' => true]);
}
User Management
UserModel methods (setEmail, setPassword, setRoles).isVerified flag and verify() method (if extended).addRole()/setRoles() with Symfony’s role hierarchy.API Integration
UserModel::serialize() for API responses.UserModel to add custom validation (e.g., isEmailUnique()).Doctrine Events
prePersist/preUpdate for auto-tasks (e.g., password hashing):
$user->addLifecycleCallback(function (UserModelInterface $user) {
if ($user->isPasswordChanged()) {
$user->hashPassword();
}
});
Security
UserModelInterface:
security:
providers:
app_user_provider:
entity: { class: App\Entity\User, property: email }
UserModel and update migrations:
/**
* @ORM\Column(type="string", nullable=true)
*/
private ?string $phoneNumber = null;
UserRegisteredEvent) in UserModel lifecycle methods.UserModel factories in PHPUnit:
$user = UserModelFactory::create(['email' => 'test@example.com']);
Email Uniqueness
UserModel lacks uniqueness validation. Add a custom validator or Doctrine constraint:
use Doctrine\ORM\Mapping as ORM;
/**
* @ORM\UniqueEntity(fields="email", message="Email already taken")
*/
Password Hashing
UserModel uses Symfony’s PasswordHasherInterface. Override hashPassword() if needed:
public function hashPassword(): void
{
$this->password = $this->passwordHasher->hashPassword(
$this,
$this->plainPassword
);
}
Role Hierarchy
security.yaml:
role_hierarchy:
ROLE_ADMIN: [ROLE_USER, ROLE_ALLOWED_TO_SWITCH]
Migration Conflicts
UserModel after initial migration, manually add new columns or use:
php bin/console doctrine:schema:update --force
doctrine:
orm:
entity_listeners:
Codyas\Skeleton\Model\UserModel: ~
UserModel constraints.Custom User Interface
Implement UserModelInterface methods (e.g., getFullName()) for reusable logic.
Audit Trails
Extend UserModel to log changes via Doctrine extensions:
use Gedmo\Mapping\Annotation as Gedmo;
/**
* @Gedmo\Timestampable(on="update")
*/
private ?\DateTimeInterface $updatedAt = null;
Multi-Tenant Support
Add a tenantId field to UserModel and filter queries in UserRepository:
public function findByTenant(int $tenantId): array
{
return $this->createQueryBuilder('u')
->where('u.tenantId = :tenantId')
->setParameter('tenantId', $tenantId)
->getQuery()
->getResult();
}
API Resources
Use Symfony’s ApiPlatform to expose UserModel as a resource:
# config/packages/api_platform.yaml
resources:
App\Entity\User:
collectionOperations:
post:
validation_context: ['registration']
How can I help you explore Laravel packages today?