PHP code example of sierratecnologia / muleta

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/ */

    

sierratecnologia / muleta example snippets


'providers' => [
    // ...
    Muleta\Library\ServiceProvider::class,
],

// 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'

'document' => 'file|max:10240|mimes:pdf,doc,docx'

'video' => 'video|max:51200|mimes:mp4,avi,mov'

return intend([
    'route' => 'dashboard',
    'with' => ['success' => 'Salvo com sucesso!'],
    'withErrors' => ['field' => 'Erro de validação'],
]);

// Suporta: back, route, url, with, withErrors, withInput

$mimetypes = mimetypes();
// ['image/jpeg', 'image/png', 'application/pdf', ...]

$timezones = timezones();
// ['America/Sao_Paulo' => 'São Paulo (UTC-3)', ...]

$lower = lower_case('TEXTO EM MAIÚSCULA'); // "texto em maiúscula"
$upper = upper_case('texto em minúscula'); // "TEXTO EM MINÚSCULA"

use Muleta\Modules\Analysator\DatabaseAnalyzer;

$analyzer = new DatabaseAnalyzer();

// Analisa estrutura completa
$schema = $analyzer->analyzeDatabase();

// Detecta anomalias
$issues = $analyzer->findIndexMissingIssues();
$duplicates = $analyzer->findDuplicateIndexes();

// Otimizações sugeridas
$suggestions = $analyzer->suggestOptimizations();



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);
    }
}



use Illuminate\Http\Resources\Json\JsonResource;

class ArticleResource extends JsonResource
{
    public function toArray($request)
    {
        return [
            'id' => $this->id,
            'title' => $this->title,
            'slug' => $this->slug, // Gerado por HasSlug
            'content' => $this->content,
            'author' => [
                'id' => $this->author->id,
                'name' => $this->author->name,
            ],
            'tags' => $this->tags->pluck('name'), // HasTags
            'featured_image' => $this->getImage('featured'), // HasImages
            'created_at' => $this->created_at->toIso8601String(),
        ];
    }
}

// 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);
    }
}

class Product extends Model
{
    use HasSlug, HasTags, HasImages, HasTranslations, ValidatingTrait;

    protected $translatable = ['name', 'description', 'meta_title', 'meta_description'];

    protected $validationRules = [
        'sku' => 'create($request->only(['sku', 'price', 'stock']));

        // Traduções
        foreach (['pt_BR', 'en_US', 'es_ES'] as $locale) {
            $product->setTranslation('name', $locale, $request->input("name_{$locale}"));
            $product->setTranslation('description', $locale, $request->input("desc_{$locale}"));
        }

        // Tags
        $product->attachTags($request->tags);

        // Imagens
        $product->addImage($request->file('featured'), 'featured');
        $product->addImages($request->file('gallery'), 'gallery');

        return redirect()->route('products.show', $product->slug);
    }
}

use Muleta\Modules\Analysator\DatabaseAnalyzer;

class DatabaseOptimizationCommand extends Command
{
    protected $signature = 'db:analyze-performance';

    public function handle()
    {
        $analyzer = new DatabaseAnalyzer();

        $this->info('Analisando banco de dados...');

        // Índices faltando
        $missingIndexes = $analyzer->findIndexMissingIssues();
        $this->warn("Índices faltando: " . count($missingIndexes));
        foreach ($missingIndexes as $issue) {
            $this->line("  - {$issue['table']}.{$issue['column']}");
        }

        // Índices duplicados
        $duplicates = $analyzer->findDuplicateIndexes();
        $this->warn("Índices duplicados: " . count($duplicates));

        // Queries N+1 potenciais
        $nPlusOne = $analyzer->detectPotentialNPlusOne();
        $this->error("Potenciais N+1: " . count($nPlusOne));

        // Gera relatório
        $report = $analyzer->generateOptimizationReport();
        file_put_contents('storage/db-optimization-report.json', json_encode($report, JSON_PRETTY_PRINT));

        $this->info('Relatório salvo em storage/db-optimization-report.json');
    }
}



use Muleta\Traits\Controllers\ApiResponseTrait;
use App\Repositories\TenantAwareRepository;

class BaseApiController extends Controller
{
    use ApiResponseTrait;

    protected $repository;

    public function index()
    {
        $items = $this->repository
            ->forCurrentTenant()
            ->paginate(request('per_page', 15));

        return $this->successResponse($items);
    }

    public function store(Request $request)
    {
        try {
            $item = $this->repository->create($request->validated());
            return $this->createdResponse($item);
        } catch (\Exception $e) {
            return $this->errorResponse($e->getMessage(), 422);
        }
    }
}
bash
php artisan vendor:publish --provider="Muleta\Library\ServiceProvider"
json
{
    "autoload": {
        "files": [
            "app/Helpers/custom_helpers.php"
        ]
    }
}