1. Go to this page and download the library: Download sierratecnologia/muleta library. Choose the download type require.
2. Extract the ZIP file and open the index.php.
3. Add this code to the index.php.
<?php
require_once('vendor/autoload.php');
/* Start to develop here. Best regards https://php-download.com/ */
// Interface
interface RepositoryInterface {
public function findById($id);
public function create(array $data);
public function update($id, array $data);
public function delete($id);
}
// Implementação base
abstract class Repository implements RepositoryInterface {
// Implementação genérica de CRUD
}
class Article extends Model {
use HasSlug; // Gera slugs automaticamente
use HasTags; // Adiciona sistema de tags
use HasImages; // Gerencia imagens associadas
use HasTranslations; // Suporte multi-idioma
use ValidatingTrait; // Validação automática
}
// Lógica de negócio isolada em services
class ArticleService {
public function publish(Article $article) {
// Lógica complexa de publicação
}
}
class ArticleResource extends JsonResource {
public function toArray($request) {
return [
'id' => $this->id,
'title' => $this->title,
'slug' => $this->slug,
'tags' => TagResource::collection($this->tags),
];
}
}
interface Arrayable {
public function toArray(): array;
}
interface Outputable {
public function output(): string;
}
interface Sortable {
public function sortBy(string $field, string $direction = 'asc');
}
use Muleta\Traits\Models\HasSlug;
class Post extends Model {
use HasSlug;
protected $slugSourceField = 'title'; // Campo fonte para slug
}
// Uso
$post = Post::create(['title' => 'Meu Artigo Incrível']);
echo $post->slug; // "meu-artigo-incrivel"
use Muleta\Traits\Models\HasTags;
class Article extends Model {
use HasTags;
}
// Uso
$article->attachTag('Laravel');
$article->attachTags(['PHP', 'Backend', 'API']);
$tags = $article->tags; // Collection de tags
$article->detachTag('Laravel');
use Muleta\Traits\Models\HasImages;
class Product extends Model {
use HasImages;
}
// Uso
$product->addImage($imagePath, 'featured');
$product->addImages($imagePaths, 'gallery');
$featuredImage = $product->getImage('featured');
$allImages = $product->images;
use Muleta\Traits\Models\HasTranslations;
class Page extends Model {
use HasTranslations;
protected $translatable = ['title', 'content'];
}
// Uso
$page->setTranslation('title', 'pt_BR', 'Sobre Nós');
$page->setTranslation('title', 'en_US', 'About Us');
echo $page->getTranslation('title', 'pt_BR'); // "Sobre Nós"
use Muleta\Traits\Models\ValidatingTrait;
class User extends Model {
use ValidatingTrait;
protected $validationRules = [
'name' => 'urto
$user->save(); // Valida automaticamente antes de salvar
use Muleta\Traits\Coder\GetSetTrait;
class MyClass {
use GetSetTrait;
/**
* @var string
* @getter true
* @setter false
* @serializable true
*/
protected $modelClass;
}
// Uso
$obj->getModelClass(); // Auto-gerado
// Garante que combinação email + tenant_id seja única
'email' => 'unique_with:users,tenant_id'
use Illuminate\Database\Eloquent\Model;
use Muleta\Traits\Models\HasSlug;
use Muleta\Traits\Models\HasTags;
use Muleta\Traits\Models\HasImages;
use Muleta\Traits\Models\ValidatingTrait;
class Article extends Model
{
use HasSlug, HasTags, HasImages, ValidatingTrait;
protected $fillable = ['title', 'content', 'author_id'];
protected $slugSourceField = 'title';
protected $validationRules = [
'title' => '
use Muleta\Modules\Recursos\ArticleRepository;
use App\Http\Resources\ArticleResource;
class ArticleController extends Controller
{
protected $repository;
public function __construct(ArticleRepository $repository)
{
$this->repository = $repository;
}
public function index()
{
$articles = $this->repository
->with(['author', 'tags', 'images'])
->paginate(15);
return ArticleResource::collection($articles);
}
public function store(ArticleRequest $request)
{
$article = $this->repository->create($request->validated());
// Traits em ação
$article->attachTags($request->tags);
$article->addImages($request->images, 'gallery');
return new ArticleResource($article);
}
}
// Usa traits para funcionalidades comuns
class Page extends Model {
use HasSlug, HasTranslations, HasImages;
}
// Usa Analysator para otimização de BD
$analyzer = new DatabaseAnalyzer();
$report = $analyzer->generateOptimizationReport();
// Usa Repository Pattern e Resources
class ApiController extends Controller {
use ApiResponseTrait; // Do Muleta
}
namespace App\Traits;
trait HasApprovalWorkflow
{
public function approve()
{
$this->update(['status' => 'approved', 'approved_at' => now()]);
event(new ItemApproved($this));
}
public function reject(string $reason)
{
$this->update(['status' => 'rejected', 'rejection_reason' => $reason]);
}
public function scopeApproved($query)
{
return $query->where('status', 'approved');
}
}
namespace App\Repositories;
use Muleta\Modules\Recursos\Repository;
class CustomArticleRepository extends Repository
{
public function findPublished()
{
return $this->model
->where('published_at', '<=', now())
->orderBy('published_at', 'desc')
->get();
}
public function findByTag(string $tag)
{
return $this->model
->whereHas('tags', function ($query) use ($tag) {
$query->where('name', $tag);
})
->get();
}
}
namespace App\Validators;
use Illuminate\Support\ServiceProvider;
class CustomValidatorServiceProvider extends ServiceProvider
{
public function boot()
{
$validator = $this->app->make('validator');
// CPF brasileiro
$validator->extend('cpf', function ($attribute, $value) {
return $this->validateCPF($value);
});
// CNPJ brasileiro
$validator->extend('cnpj', function ($attribute, $value) {
return $this->validateCNPJ($value);
});
}
protected function validateCPF($cpf): bool
{
// Lógica de validação de CPF
// ...
}
}
// app/Helpers/custom_helpers.php
if (!function_exists('format_currency_brl')) {
function format_currency_brl(float $value): string
{
return 'R$ ' . number_format($value, 2, ',', '.');
}
}
if (!function_exists('sanitize_phone_br')) {
function sanitize_phone_br(string $phone): string
{
return preg_replace('/[^0-9]/', '', $phone);
}
}