Migração Incremental
Você não precisa de uma reescrita para adotar o Maybe. Cada bloco funciona sozinho, e eles se compõem conforme você avança.
Ordem recomendada
- Schema nas fronteiras — substitua validações ad-hoc com
isset/emptypor um schema em cada fronteira de entrada (request HTTP, importação de CSV, payload de fila). Nada mais muda ainda. - DTOs para os inputs problemáticos — onde dados validados cruzam camadas, envolva-os em um DTO para garantir o formato adiante.
- Result nos services — métodos de service novos/alterados retornam
Resultem vez de lançar exceção ou retornarfalse/null. Quem chama fazmatchna borda. - Option para lookups nullable — repositórios retornam
Optionem vez denull, convertendo comokOr()quando um erro tipado é necessário. - Async por último — só depois que o time estiver confortável, e apenas para cargas isoladas e serializáveis.
Convivendo com exceções
O Maybe não força um estilo tudo-ou-nada. Nas fronteiras com código baseado em exceções:
php
use Maybe\Result\Result;
function tryCatch(callable $fn): Result
{
try {
return Result::ok($fn());
} catch (\Throwable $e) {
return Result::err($e);
}
}E na direção oposta, unwrap()/expect() convertem um Err de volta em exceção na camada onde exceções são a convenção.
O que evitar
- Não envolva tudo em Option/Result no primeiro dia — comece onde os erros realmente doem.
- Não passe
Resultfundo em camadas que nunca o inspecionam; resolva-o na fronteira sensata mais próxima. - Não use
unwrap()como atalho em caminhos de produção — prefiramatch,unwrapOr()ouexpect()com uma mensagem significativa.
Para orientação mais profunda, veja os docs do repositório: padrões de uso, receitas práticas e anti-padrões.