DEV Community

Cover image for πŸŽ‰ Introducing Traitify – Simplifying Laravel Development with Reusable Traits and Contracts πŸŽ‰
Nasrul Hazim Bin Mohamad
Nasrul Hazim Bin Mohamad

Posted on

πŸŽ‰ Introducing Traitify – Simplifying Laravel Development with Reusable Traits and Contracts πŸŽ‰

Hey, Laravel developers! πŸš€

I’m excited to introduce Traitify, a newly released Laravel package designed to streamline your development workflow by providing reusable traits and contracts. Traitify empowers you to write cleaner, more maintainable code, allowing you to focus on what matters most – building amazing applications.

Whether you're dealing with UUIDs, tokens, user handling, search functionality, API responses, or complex relationships, Traitify has got you covered. And the best part? It's available now on GitHub! πŸ™Œ

πŸ‘‰ Check it out: https://github.com/cleaniquecoders/traitify


πŸ”‘ Key Features with Examples

Here’s a breakdown of what Traitify brings to the table, along with practical examples.


1. UUID Management πŸ”‘

Automatically generate UUIDs for your models on creation. No more manual work – just add the InteractsWithUuid trait and you’re good to go!

Example:

use CleaniqueCoders\Traitify\Concerns\InteractsWithUuid;
use Illuminate\Database\Eloquent\Model;

class Post extends Model
{
    use InteractsWithUuid;

    protected $fillable = ['title', 'content'];
}
Enter fullscreen mode Exit fullscreen mode

Every time a new Post is created, a UUID will automatically be generated for the model.

$post = Post::create([
    'title' => 'My first post', 
    'content' => 'Content goes here'
]);
echo $post->uuid;  // Outputs a unique UUID
Enter fullscreen mode Exit fullscreen mode

2. User Interaction πŸ‘€

Easily assign the authenticated user to your models using the InteractsWithUser trait. This is great for tracking who created or updated a model.

Example:

use CleaniqueCoders\Traitify\Concerns\InteractsWithUser;
use Illuminate\Database\Eloquent\Model;

class Post extends Model
{
    use InteractsWithUser;

    protected $fillable = ['title', 'content', 'user_id'];
}
Enter fullscreen mode Exit fullscreen mode

On creation, the authenticated user’s ID is automatically assigned to the user_id column.

$post = Post::create([
    'title' => 'Another post', 
    'content' => 'More content'
]);
echo $post->user_id;  // Outputs the ID of the currently authenticated user
Enter fullscreen mode Exit fullscreen mode

3. Token Handling πŸ”’

Secure your models by automatically generating random 128-character tokens. Use InteractsWithToken to manage tokens seamlessly.

Example:

use CleaniqueCoders\Traitify\Concerns\InteractsWithToken;
use Illuminate\Database\Eloquent\Model;

class ApiToken extends Model
{
    use InteractsWithToken;

    protected $fillable = ['name', 'token'];
}
Enter fullscreen mode Exit fullscreen mode

Tokens are automatically generated for new models.

$token = ApiToken::create(['name' => 'My API Token']);
echo $token->token;  // Outputs a 128-character random token
Enter fullscreen mode Exit fullscreen mode

4. Search Functionality πŸ”

Enhance your models with powerful, case-insensitive search capabilities using InteractsWithSearchable. Perform searches across one or multiple fields with minimal setup.

Example:

use CleaniqueCoders\Traitify\Concerns\InteractsWithSearchable;
use Illuminate\Database\Eloquent\Model;

class Post extends Model
{
    use InteractsWithSearchable;

    protected $fillable = ['title', 'content'];
}
Enter fullscreen mode Exit fullscreen mode

Search by any field in a case-insensitive manner:

$posts = Post::search('title', 'first')->get();
Enter fullscreen mode Exit fullscreen mode

You can also search across multiple fields:

$posts = Post::search(['title', 'content'], 'keyword')->get();
Enter fullscreen mode Exit fullscreen mode

5. Resource URL Generation 🌐

Need to generate URLs for resources dynamically? The InteractsWithResourceRoute trait simplifies this process, allowing you to create routes like index or show with ease.

Example:

use CleaniqueCoders\Traitify\Concerns\InteractsWithResourceRoute;
use Illuminate\Database\Eloquent\Model;

class Post extends Model
{
    use InteractsWithResourceRoute;
}
Enter fullscreen mode Exit fullscreen mode

Generate URLs dynamically:

$post = Post::find(1);
echo $post->getResourceUrl();  // Outputs the URL for the index route
echo $post->getResourceUrl('show');  // Outputs the URL for the show route
Enter fullscreen mode Exit fullscreen mode

6. Meta Management 🧩

Manage meta fields dynamically in your models using InteractsWithMeta. You can define default meta values and cast the meta attribute to an array automatically.

Example:

use CleaniqueCoders\Traitify\Concerns\InteractsWithMeta;
use Illuminate\Database\Eloquent\Model;

class Post extends Model
{
    use InteractsWithMeta;

    protected $fillable = ['title', 'content', 'meta'];
}
Enter fullscreen mode Exit fullscreen mode

Automatically set meta fields when creating a model:

$post = Post::create([
    'title' => 'Meta Post', 
    'content' => 'Meta content',
    'meta' => [
        'some' => 'random', 
        'data' => 'in here'
    ]
]);
Enter fullscreen mode Exit fullscreen mode

7. Enum Handling πŸ—‚οΈ

Handle enums efficiently by providing enum values, labels, and descriptions with InteractsWithEnum.

Example:

enum PostStatus: string
{
    use CleaniqueCoders\Traitify\Concerns\InteractsWithEnum;

    case DRAFT = 'draft';
    case PUBLISHED = 'published';

    public function label(): string
    {
        return match ($this) {
            self::DRAFT => 'Draft',
            self::PUBLISHED => 'Published',
        };
    }

    public function description(): string
    {
        return match ($this) {
            self::DRAFT => 'Post is in draft state',
            self::PUBLISHED => 'Post is published',
        };
    }
}
Enter fullscreen mode Exit fullscreen mode

Retrieve enum options for form inputs:

$options = PostStatus::options();
Enter fullscreen mode Exit fullscreen mode

8. Eager Loading Details βš™οΈ

The InteractsWithDetails trait allows you to define related details in your models and apply eager loading effortlessly.

Example:

use CleaniqueCoders\Traitify\Concerns\InteractsWithDetails;
use Illuminate\Database\Eloquent\Model;

class Post extends Model
{
    use InteractsWithDetails;

    protected $with_details = ['comments'];

    public function comments()
    {
        return $this->hasMany(Comment::class);
    }
}
Enter fullscreen mode Exit fullscreen mode

Load related details automatically:

$post = Post::withDetails()->find(1);
Enter fullscreen mode Exit fullscreen mode

9. Standardized API Responses πŸ”„

Need to standardize your API responses? InteractsWithApi helps you return consistent API data, messages, and status codes.

Example:

use CleaniqueCoders\Traitify\Concerns\InteractsWithApi;
use Illuminate\Http\Request;
use Illuminate\Database\Eloquent\Model;

class Post extends Model
{
    use InteractsWithApi;

    public function getMessage(): string
    {
        return 'Post retrieved successfully';
    }
}
Enter fullscreen mode Exit fullscreen mode

Retrieve the API response:

$post = Post::find(1);
$response = $post->getApiResponse(new Request());
Enter fullscreen mode Exit fullscreen mode

πŸ“œ Contracts to Define Structure and Flexibility

Here are examples for the various contracts included in Traitify:

πŸ› οΈ Builder Contract

Example:

class PostBuilder implements CleaniqueCoders\Traitify\Contracts\Builder
{
    public function build(): self
    {
        // Build logic here
        return $this;
    }
}
Enter fullscreen mode Exit fullscreen mode

πŸƒ Execute Contract

Example:

class PostExecutor implements CleaniqueCoders\Traitify\Contracts\Execute
{
    public function execute(): self
    {
        // Execution logic here
        return $this;
    }
}
Enter fullscreen mode Exit fullscreen mode

πŸ“‹ Menu Contract

Example:

class PostMenu implements CleaniqueCoders\Traitify\Contracts\Menu
{
    public function menus(): \Illuminate\Support\Collection
    {
        return collect([
            ['name' => 'Home', 'url' => '/'],
            ['name' => 'Posts', 'url' => '/posts']
        ]);
    }
}
Enter fullscreen mode Exit fullscreen mode

πŸ”„ Processor Contract

Example:

class PostProcessor implements CleaniqueCoders\Traitify\Contracts\Processor
{
    public function process(): self
    {
        // Process logic here
        return $this;
    }
}
Enter fullscreen mode Exit fullscreen mode

πŸš€ Get Started Today!

Head over to https://github.com/cleaniquecoders/traitify, install it, and start writing cleaner, more maintainable Laravel applications today!

If you find it useful or have any feedback, feel free to reach out! Let’s build something amazing together. ✨


🌟 Share the Love:
If you like Traitify, share it with your community and friends. Let’s spread the word and build better apps together! πŸ’»πŸŽ‰

Top comments (0)