1
resposta

Uncaught Error: Call to a member function request() on null in...

Bom dia! Estou recebendo o erro Uncaught Error: Call to a member function request() on null in quando executo minha classe, segue o código: SearchEngine.php

<?php

namespace MoraesDaniel\SearchEngine;

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

class SearchEngine
{
    private $httpClient;
    private $crawler;

    public function __constructor(ClientInterface $httpClient, Crawler $crawler) 
    {
        if (!$this->httpClient) {
            echo "HTTP Client está nulo" . PHP_EOL;
        }
        $this->httpClient = $httpClient;
        $this->crawler = $crawler;
    }

    public function search(string $url, string $cssSelector): array
    {
        if (!$this->httpClient) {
            echo "HTTP Client está nulo no método search" . PHP_EOL;
        }
        $response = $this->httpClient->request('GET', $url);

        $html = $response->getBody();

        $this->crawler->addHtmlContent($html);

        $items = $this->crawler->filter($cssSelector);
        $itemsReturn = [];

        foreach ($items as $item) {
            $itemsReturn[] = $item->textContent;
        }

        return $itemsReturn;
    }
}

fetch-data.php

<?php

require 'vendor/autoload.php';

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


$client = new Client(['verify' => false]);
$crawler = new Crawler();

$searchEngine = new SearchEngine($client, $crawler);
$items = $searchEngine->search('https://www.petz.com.br/cachorro/racao/racao-seca', 'h3.nome_produto');

foreach($items as $item) {
    echo $item . PHP_EOL;
}

Percebam que coloquei duas verificações na SearchEngine.php e ele me diz que, no método search, o $this->httpClient está nulo, como pode?

1 resposta

Você chamou o método construtor de __constructor ao invés de __construct, ou seja, para todos os efeitos, sua classe SearchEngine não tem um construtor. Por isso aquele método nunca é executado e seu client não é inicializado.