2
respostas

Erro no construtor da classe

Por algum motivo minha classe está retornando o erro:

Fatal error: Uncaught TypeError: Argument 1 passed to Alura\BuscadorDeCursos\Buscador::__construct() must be an instance of Alura\BuscadorDeCursos\ClientInterface, instance of GuzzleHttp\Client given, called in C:\wamp64\www\buscador-cursos-alura\buscar-cursos.php on line 20 and defined in C:\wamp64\www\buscador-cursos-alura\src\Buscador.php on line 20.

\buscar-cursos.php

require 'vendor/autoload.php';
require 'src/Buscador.php';

use Alura\BuscadorDeCursos\Buscador;
use GuzzleHttp\Client;
use Symfony\Component\DomCrawler\Crawler;

echo 'Iniciando requisição http....'. PHP_EOL;


//$client = new Client();
$client = new Client(['base_uri' => 'https://www.alura.com.br']);
//$client = new Client(['base_uri' => 'https://www.alura.com.br', 'verify' => false]);
$crawler = new Crawler();


echo 'Iniciando busca....'. PHP_EOL;
$buscador = new Buscador($client, $crawler);
$cursos = $buscador->buscar('/cursos-online-programacao/php');

foreach ($cursos as $curso) {
    echo $curso. PHP_EOL;
}

src\Buscador.php

namespace Alura\BuscadorDeCursos;


use GuzzleHttp\Client;
use Symfony\Component\DomCrawler\Crawler;

class Buscador
{
    /**
     * @var ClientInterface
     */
    private $httpClient;
    /**
     * @var Crawler
     */
    private $crawler;

    public function __construct(ClientInterface $httpClient, Crawler $crawler)
    {
        $this->httpClient = $httpClient;
        $this->crawler = $crawler;
    }

    public function buscar(string $url): array
    {

       $resposta = $this->httpClient->request('GET', $url);

       $html = $resposta->getBody();
       $this->crawler->addHtmlContent($html);

       $elementosCursos = $this->crawler->filter('span.card-curso__nome');
       $cursos = [];

       foreach ($elementosCursos as $elemento) {
          $cursos[] = $elemento->textContent;
       }

       return $cursos;

   }
}
2 respostas

tudo bem contigo?

Em Buscador.php, experimente alterar:

use GuzzleHttp\Client;

Para:

use GuzzleHttp\ClientInterface;

Pode ter a ver com a versão a versão do guzzle que você está usando.

Caso resolva, por favor anotar este tópico como solucionado ou postar ainda dúvida ou outra solução. Um abraço e bons estudos!

Você diz no seu construtor que recebe uma dependência do tipo ClientInterface mas não a importa (utilizando use), logo, o PHP entende que é pra buscar este símbolo (classe, interface, o que for) no namespace atual.

Esta classe não existe no namespace atual, por isso o erro.

Para corrigir, basta importar esta interface no início do arquivo com use GuzzleHttp\ClientInterface.

Recomendo que passe pelos cursos de PHP OO aqui na Alura pra entender melhor sobre os namespaces. :-D

Abraços e bons estudos