Executando verificação de segurança...
33

Pitch: Eu criei um Next.js ultra-leve em PHP

Brincadeira. Só que não.


Eu não tenho nada contra frameworks grandes. Eles têm seu lugar. Mas pra 90% dos meus projetos — APIs simples, MVPs leves, protótipos que se calhar vão pro lixo... O simples acto de iniciar um novo projeto já me dava calafrios.

composer create-project laravel/laravel meu-projeto
# 15 segundos depois...
# 50MB de dependências
# 200 arquivos que eu nunca vou tocar
# E o servidor ainda nem subiu

Eu só queria algo que:

  • Iniciasse rápido (sem esperar 2 minutos pro composer install)
  • Fosse transparente (sem magia negra que eu não entendo)
  • Tivesse rotas intuitivas (como o Next.js, que eu amo no front-end)

Tentei um e outro micro-framework, todos bons, mas todos tinham uma curva. E todos ainda exigiam que eu escrevesse arquivos de rota separados, definisse grupos, configurasse middlewares — mais código.

Eu queria algo mais simples.

E aí, eu pensei: "Vou fazer o meu próprio."


Nasceu o Fluxor

E ele faz uma coisa só: transforma pastas em rotas.

app/router/
├── users/
│   ├── index.php    # GET /users
│   └── [id].php     # GET /users/123

É isso. Sem segredo. Sem mágica.

E o melhor: tudo em menos de 10 linhas.

// app/router/users/[id].php

// GET /users/123
Flow::GET()->do(function($req) {
    $userId = $req->param('id');
    $user = User::find($userId);
    
    return Response::json([
        'user' => $user
    ]);
});

// POST /users/123
Flow::POST()->do(function($req) {
    $userId = $req->param('id');
    $data = $req->only(['name', 'email']);
    
    $updated = User::update($userId, $data);
    
    return Response::json([
        'updated' => $updated,
        'message' => 'Perfil atualizado com sucesso'
    ]);
});

Não é só isso. Ele vem com um pack de utilidades:

Request

  • $req->input('nome') — captura dados de POST, GET ou JSON
  • $req->param('id') — pega parâmetros da URL (/users/123)
  • $req->all() — todos os dados da requisição
  • Etc...

Response

  • Response::json($data) — retorna JSON com headers automáticos
  • Response::html('<h1>Olá</h1>') — resposta HTML direta
  • Response::view('home', $data) — renderiza view com dados
  • Response::redirect('/login') — redireciona para outra rota
  • Response::success($data, 'Mensagem')
  • Etc..

View

  • View::extend('layouts/main') — usa um layout base
  • View::section('content') — define uma seção de conteúdo
  • View::yield('content') — exibe o conteúdo da seção
  • View::e($texto) — escapa HTML automaticamente
  • View::include('partials/header') — inclui outra view
  • Etc...

Helpers, Uploader, Mailer

  • Helpers globais: env(), base_path(), dd(), abort()
  • Uploader seguro: Uploader::upload($_FILES['avatar']) hash do arquivo, sem duplicatas
  • Mailer: (new Mailer())->send(...)) envia e-mail com templates

Simplicidade proposital. Sem dependências. Só o que você usa.


Mas e o resto?

Você escolhe. Literalmente.

composer create-project lizzyman04/fluxor-php meu-app

O instalador pergunta: "Quer autenticação?" "Quer envio de e-mail?" "Quer upload de arquivos?"

O que você disser "não", ele remove. O projeto final só tem o que você realmente usa.

Zero bloat. Zero bagagem.


Números que importam

  • Boot time: menos de 10ms
  • Dependências: absolutamente 0 (só o puro PHP)
  • Arquivos iniciais: dá pra contar nos dedos
  • Tempo pra criar uma API: 5 minutos

Para quem é isso?

  • Quem faz não quer sobrecarga
  • Quem quer entender MVC por dentro
  • Puristas de desempenho que odeiam boat
  • Quem gosta de roteamento estilo Next.js

Início rápido

composer create-project lizzyman04/fluxor-php meu-app
cd meu-app
composer dev

Documentação: https://lizzyman04.github.io/fluxor-php

Sim, o nome "Fluxor". Combina com o framework? Talvez não. Mas me fez feliz.

E no fim, fazer código que te faz feliz é o que importa.

Fluxor Logo

Crie aplicações PHP elegantes com prazer! 🎉

Carregando publicação patrocinada...
3

Eu já favoritei aqui a sua documentação.
É exatamente isso o que eu precisava, eu queria algo simples para usar em alguns projetinhos pessoais mas que não carregasse todo o tamanho e peso de um framework completo e pesado.

Afinal, não há motivos para matar uma formiga com uma bazuka.

1

Hahaha... Exatamente!

O Fluxor nasceu justamente pra esses projetinhos onde o overhead de um framework gigante não faz sentido.

E o melhor: se um dia seu projetinho crescer e precisar de mais estrutura, você pode migrar gradualmente. Não é um ecossistema fechado. É só PHP puro. Você pode adicionar componentes conforme a necessidade, sem refatorar tudo do zero.

Valeu... Bom código! 🚀

3
1

Valeu, silvaleal! É exatamente esse tipo de comentário que dá gás pra continuar.

Se começar a usar e tiver qualquer dúvida ou sugestão, tô por aqui (e no GitHub também).

Bom código! 🚀

3

Cara, que projeto maravilhoso. Eu estava cansado de, nos meus projetos pessoais, usar frameworks complexos demais, cheios de objetos e bibliotecas que muitas vezes nem eram necessários.

1

Valeu, nankaybr! É exatamente essa a vibe do Fluxor. A gente perde muito tempo lutando contra a complexidade de frameworks gigantes quando na real a gente só quer entregar uma ideia ou um protótipo.

Com o Fluxor, você tem só o essencial: roteamento simples, helpers que ajudam no dia a dia, e zero bloat.

Se começar a usar e tiver sugestão ou dúvida, só chamar. Bom código! 🚀

2
2

Valeu, joselio!

O Fluxor não vai ter ORM próprio! pelo menos não no núcleo haha. Já existe uma ideia: o fluxor-orm será um pacote separado, com a mesma filosofia — ultra-leve, zero bloat, só o que você usa. Isso tá na roadmap.

Enquanto isso, você pode usar Cycle ORM, Eloquent ou até PDO puro com o Fluxor. O núcleo é só PHP puro, então qualquer biblioteca compatível com PSR funciona.

Talvez no futuro o instalador pergunte: "Quer persistência? Se sim, qual driver?" e já prepare a estrutura.

Valeu! 🚀

2

+3

Sensacional a iniciativa! Como alguém que escreve em PHP desde que comecei na web, há uns 6 anos — hoje em dia focando mais no Yii2 e às vezes caindo no Laravel para coisas maiores —, eu entendo perfeitamente essa dor do bloatware e da lentidão inicial.

Trazer o roteamento baseado em pastas (estilo Next.js) pro PHP puro, mantendo zero dependências e um instalador cirúrgico que limpa o que você não vai usar, é uma sacada excelente para levantar MVPs rápido. O boot time de 10ms sem "magia negra" fala por si só.

Recomendaria criar sites templates usando usa ferramenta, implementar alguns pagamentos e acredito que poderá ter pessoas interessadas em utilizar, e assim atrair mais utilizadores dela; outra ideia seria criar um .md que o usuário pode copiar para a IA dele conseguir saber tudo sobre a ferramenta, como usar e cuidados.

Aproveitando esse seu perfil de construtor que gosta de criar a própria infraestrutura e fugir do ecossistema inchado, te convido a conhecer a Crom (crom.run). É um ecossistema e uma comunidade brasileira focada em Soberania Digital e desenvolvimento independente. Temos desde ferramentas local-first até espaços de discussão técnica densa, sem algoritmos de retenção. Acredito que nossa filosofia de criar tecnologia enxuta com as próprias mãos vai bater muito com a sua!

Parabéns pelo lançamento do Fluxor e sucesso com o projeto!

4

Que comentário incrível! Valeu, MrJ.

Você tocou num ponto muito importante: os templates. É exatamente por isso que criei o instalador interativo.

A ideia de templates (como e-commerce, blog, etc) é excelente. Vou pensar mais sobre isso.

E adorei a ideia do arquivo .md pra IA! Vou criar um fluxor.md com a especificação completa pra quem quiser usar com Cursor, Copilot ou qualquer LLM.

Vou dar uma olhada na Crom agora mesmo.

Muito obrigado pela recepção calorosa e pelas sugestões.

Abraço! 🚀

2

Já estava na hora de ter algo assim para o mundo PHP.
Uma sugestão: não seria melhor escrever

return function ($req) {
  ...
}

Ao invés de

Flow::GET()->do(function($req) {
    ...
});

?

Aí a pessoa poderia definir uma constante em cada rota para definir o método da rota que por padrão seria GET.

2

Valeu pelo comentário! Fico feliz que a ideia ressoou.

A sintaxe Flow::GET()->do(fn($req) => ...) foi uma escolha deliberada por alguns motivos:

  1. Flow::POST(), Flow::PUT(), Flow::DELETE() seguem o mesmo padrão. Se fosse return function($req), eu teria que inventar outra forma para os outros verbos HTTP.

  2. Quando você abre um arquivo de rota, a primeira coisa que vê é Flow::GET() ou Flow::POST(). O método HTTP está ali, explícito. Sem precisar procurar por uma constante no final do arquivo.

  3. O arquivo de rota pode ter múltiplos métodos (GET e POST no mesmo arquivo, como no exemplo). Com return function() você teria que escolher qual método retornar.

  4. A sintaxe atual permite encadear: Flow::GET()->name('home')->do(...). Com return function() isso ficaria mais verboso.

Dito isso, na verdade, o framework já suporta o formato que você sugeriu:

// app/router/users.php
return function($req) {
    return Response::json(['users' => User::all()]);
};

Isso funciona! O router detecta que o arquivo retornou uma função e a executa. Então quem prefere essa sintaxe pode usá-la. Mas aí perde a possibilidade de ter múltiplos métodos HTTP no mesmo arquivo — algo que eu gosto muito:

// app/router/users/[id].php
return [
    'GET' => fn($req) => User::find($req->param('id')),
    'PUT' => fn($req) => User::update($req->param('id'), $req->all()),
    'DELETE' => fn($req) => User::delete($req->param('id'))
];

Quando o Router inclui um arquivo de rota, ele também busca um retorno. Se você retorna:

  • Um callable → executa e envia a resposta
  • Uma Response → envia a resposta
  • Um array → interpreta como um mapeamento [MÉTODO => handler]

O Flow nasceu dessa necessidade: um arquivo, múltiplos métodos.

Valeu pelo feedback! 🚀

2

Realmente pra um CRUD sismples usar toda a infra de laravel, yii2, etc (mail, rbac, ...) e ter uma pasta vendor grande d+ é um saco.
Em nuxt4 vi como é prático as rotas por pastas/arquivos.
Cara, se a ideia de templates pré prontos como falaram seria um plus (admin dashboard, ecommerce, blog, ...)

Parabéns!

1

É exatamente isso! A pasta vendor de um Laravel já vem com centenas de pacotes que você nunca vai usar. Pra um CRUD simples, isso pesa demais.

Valeu pelo apoio e pela sugestão! 🚀

2

...e eu estou criando o NestPHP. Uma versão em PHP 8.4 baseado no NestJs. Ja tenho ate o dominio pronto: nestphp.com (ainda sem nada).

Na proxima semana estarei liberando o Github público para quem quiser contribuir

1
2

Que ideia genial
Gostei muito da proposta do projeto, principalmente pela simplicidade e pela inspiração no estilo de roteamento. Esse conceito de transformar pastas em rotas deixa tudo muito mais intuitivo e direto, principalmente pra quem já vem do front-end.
Não consegui testar completamente por conta das mudanças nas versões mais recentes do PHP (8.4/8.5), que acabam gerando alguns avisos e incompatibilidades — mas isso é totalmente normal em projetos novos e em evolução.
O ponto que mais me chamou atenção foi a estrutura. Mesmo sendo algo leve, já existe uma preocupação com organização desde o início. Isso é essencial, porque muitos projetos começam simples e, conforme crescem, acabam sofrendo justamente por falta de uma base bem definida.
Curti bastante a proposta — principalmente para MVPs, APIs rápidas e até para estudo de arquitetura. Tem muito potencial 🚀

1

Valeu pelo feedback! Que bom que a estrutura chamou atenção. Foi uma preocupação desde o início: manter a simplicidade sem abrir mão de uma base que escale bem.

Vou rodar os testes com PHP 8.4/8.5 e ajustar qualquer incompatibilidade. A ideia é manter o Fluxor sempre funcionando com as versões mais recentes, com zero warnings.

Se puder abrir uma issue no GitHub com os avisos que apareceram, ajuda demais a corrigir rápido.

E é exatamente isso: MVPs, APIs rápidas e estudo de arquitetura são os cenários que mais fazem sentido pra ele.

Valeu pelo apoio! 🚀

2

Excelente framework e implementação no geral, extremamente ágil de começar projetos e manter também! Estou ansioso para usar e por incrível que pareça já tive vontade de fazer algo bem nesse sentido!

Uma sugestão (realmente não vi se tem): uma classe helper chamada Fetch (ou outro nome) para ser mais fácil fazer requests usando curl, já que é muito verboso no PHP e a sintaxe poderia ser bem semelhante ao fetch do javascript. Assim não precisa da lib Guzzle por exemplo.

2

Valeu! A ideia do Fetch é genial.

Eu também acho o curl do PHP verboso demais pro dia a dia. Já me peguei várias vezes copiando e colando o mesmo bloco de código pra fazer uma requisição simples.

Algo como Fetch::get('url')->json() sem Guzzle, seria perfeito.

Já coloquei na roadmap! A ideia é algo como:

// GET
$users = Fetch::get('https://api.exemplo.com/users')->json();

// POST
$response = Fetch::post('https://api.exemplo.com/users', [
    'name' => 'João',
    'email' => 'joao@exemplo.com'
]);

// Com headers e auth
$data = Fetch::get('https://api.exemplo.com/me')
    ->header('Authorization', 'Bearer token')
    ->json();

Se quiser contribuir com a ideia ou até com código, tô aberto! Valeu pela sugestão 🚀

2

Cara, que projeto bacana. A comunidade do PHP precisa mais desse tipo de coisa. Já coloquei no meu playground do github, vou ficar a par sobre e quem sabe ajudo ai com algo, já que é open sourcekkj.

2

Sim, exatamente. O fato de o projeto ser open source é justamente o que dá um toque a mais. Além de permitir ver toda a arquitetura, também abre espaço para contribuir e ajudar no projeto. Ele tem uma essência muito massa, e espero que a comunidade fortaleça isso com contribuições.

1

É isso mesmo! Abrir o código não é abrir espaço pra gente construir junto. E é muito legal ver que essa ideia de comunidade ressoou.

A arquitetura foi pensada pra ser clara desde o começo: pastas simples, código sem magia, tudo legível. Assim, quem quiser ajudar consegue entender rápido e contribuir de verdade.

Vamos fortalecer juntos! Se tiver ideia de feature, melhoria ou quiser mandar um PR, tô aqui.

Valeu por enxergar essa essência! 🙌

1

Que bom que, 3nderXP!

Já ter colocado no playground é um baita incentivo. E se quiser ajudar, tô de portas abertas.

O Fluxor é pequeno o suficiente pra entender em poucas horas, e é bom ver que esse "espírito open source" apareceu nos comentários.

Valeu pelo apoio! 🚀

2

Projeto muito bom, eu ja fiz um assim é um laravel modificado bem leve que uso até hoje, mas como é muito especifico acabei não deixando publico e tambem ja ta desatualizado, porém acho que vou pegar esse teu e recomendar algumas melhorias como orquestramente de banco de dados e tambem o uso de s3 para o storage, ja tenho algumas funções prontas que são bem leves e tal. Depois faço um PR la. Sucesso ai com o projeto.

1

Valeu, hercilio!

E que legal saber que você já construiu algo parecido — esse exercício de criar um framework sob medida é um aprendizado gigante, né? A gente entende cada detalhe do fluxo.

Tô de portas abertas pra receber PR!

A ideia de um orquestrador de banco de dados leve e suporte a S3 no storage encaixa perfeitamente na filosofia do Fluxor: recursos que ficam isolados, sem poluir o núcleo, e que o usuário pode optar por usar ou não.

Se quiser abrir uma issue antes pra discutir a abordagem, fica à vontade também. Vai ser ótimo ter sua experiência nesses pontos.

Valeu pelo apoio! 🚀

2

Muito top! Eu tenho um Framework pessoal que uso desde 2020 e crio bastante projetos freelancers com ele. Pois a maioria dos projetos sao bem simples e o cliente escolhe hospedagens compartilhadas. Sendo assim, simplicidade e leveza torna-se importante. Parabens pelo projeto!