Skip to content

[BUG] Compatibilidade PSR-7 #7

@code-cfernandes

Description

@code-cfernandes

Problema

ReactPHP 1.x usa PSR HTTP Message 1.x, enquanto PivotPHP Core usa PSR HTTP Message 2.0. Isso causa um conflito fatal no PHP:

Fatal error: Declaration of React\Http\Io\AbstractMessage::getProtocolVersion() 
must be compatible with Psr\Http\Message\MessageInterface::getProtocolVersion(): string

Tentativas de Solução

1. Adapter de Compatibilidade ❌

  • Tentativa: Criar um adapter que envolve as mensagens ReactPHP
  • Resultado: O erro ocorre antes do adapter ser usado, durante o carregamento das classes
  • Motivo: Conflito de declaração de interface no PHP

2. Server Compatível ❌

  • Tentativa: Criar um servidor que evita usar as interfaces PSR-7
  • Resultado: ReactPHP HTTP Server ainda precisa carregar suas classes PSR-7
  • Motivo: Dependência interna do ReactPHP

Atualizar PivotPHP Core
Fazer PivotPHP Core suportar ambas as versões de PSR-7:

{
    "require": {
        "psr/http-message": "^1.0 || ^2.0"
    }
}

Isso permite:

  • ✅ Compatibilidade com ReactPHP
  • ✅ Compatibilidade com bibliotecas modernas
  • ✅ Não requer projetos separados
  • ✅ Solução elegante e sustentável

Implementação

  1. Atualizar composer.json do PivotPHP Core:
"require": {
    "psr/http-message": "^1.0 || ^2.0"
}
  1. Ajustar type hints condicionalmente:
// Detectar versão do PSR-7
$psr7Version = \Composer\InstalledVersions::getVersion('psr/http-message');
$isPsr7v2 = version_compare($psr7Version, '2.0', '>=');

// Usar type hints apropriados
if ($isPsr7v2) {
    // Código com type hints strict
} else {
    // Código sem type hints strict
}
  1. Criar classes compatíveis:
// Base class que funciona com ambas versões
abstract class AbstractMessage implements MessageInterface
{
    public function getProtocolVersion() // Sem type hint de retorno
    {
        return $this->protocolVersion;
    }
}

Conclusão

A incompatibilidade PSR-7 é um problema conhecido na comunidade PHP. A melhor solução é fazer o PivotPHP Core suportar ambas as versões, permitindo que os usuários escolham qual usar baseado em suas necessidades.

Metadata

Metadata

Labels

bugSomething isn't working

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions