Solucionado (ver solução)
Solucionado
(ver solução)
5
respostas

Funcionalidade da função 'ob_start'

Bom dia

Não entendi muito bem esta função 'ob_start' e o que será retornado, neste método a seguir:

public function renderizarHtml(string $caminhoDoTemplate, array $dados): string
    {
        extract($dados);
        ob_start();
        require __DIR__ . "/../../view/" . $caminhoDoTemplate;
        $html = ob_get_clean(); 
        return $html;
    }

Classe 'FomularioEdicao':

<?php

namespace Alura\Cursos\Controller;

use Alura\Cursos\Entity\Curso;
use Alura\Cursos\Infra\EntityManagerCreator;
use Doctrine\Persistence\ObjectRepository;

class FormularioEdicao extends ControllerComHTML implements InterfaceControladorRequisicao
{
    /**
     * @var ObjectRepository
     */
    private $repositorio;

    public function __construct()
    {
        $entityManager = (new EntityManagerCreator())->getEntityManager();
        $this->repositorio = $entityManager->getRepository(Curso::class);
    }

    public function processarRequisicao(): void
    {
        $id = filter_input(INPUT_GET, 'id', FILTER_VALIDATE_INT);

        if (is_null($id) || $id === false) {
            header('Location: /listar-cursos');
        }

        $curso = $this->repositorio->find($id);
        $titulo = "Alterar curso";

        echo $this->renderizarHtml("cursos/formulario-insercao.php", [
            "curso" => $curso,
            "titulo" => $titulo
        ]);
    }
}

Foi usado o 'echo' na chamada do método, mas eu não entendi bem o que será exibido na página da web.

Obrigado pela ajuda.

5 respostas
solução!

Oi Leonardo, tudo bem? Uma introdução didática:

Pense em você indo em uma loja comprar uma caixa de chocolates, mas não quer sair da loja com a caixa nas mãos por que seus amigos veriam você com esses chocolates. Então você solicita para que o serviço da loja guarde essa caixa de chocolate para você e depois lhe envie. Imagine agora que os chocolates é o conteúdo desse require feito na função renderizarHtml e que o serviço de guardar e depois te enviar esses chocolates é o ob_start();

Vamos por partes: Qual problema tinhamos que resolver no projeto?

Resposta: A questão da renderização das páginas.

O Vinicius queria isolar, ou seja, criar uma função que realizasse essa tarefa para renderizar corretamente as nossas views, pois o nosso controller não precisa saber como isso é feito, logo ele criou essa função "renderizarHtml".

Sem o ob_start() na nossa função de "renderizarHtml" o que aconteceria? O PHP ao ver o require "cuspiria" na tela o conteúdo desse require, mas não é isso que queremos. Queremos apenas pegar o conteúdo desse require e guarda-lo sem ter que mostrar na tela do nosso navegador esse conteúdo.

É isso que o ob_start() exatamente fez, pegou o conteúdo do require e em vez de exibi-lo guardou temporariamente para nós e através do ob_get_clean() recuperamos esse conteúdo, ou seja, na variável $html temos o conteúdo do require já com bind dos dados que passamos para a função renderizarHtml.

No fundo o que a função renderizarHtml está fazendo é criar um contexto para que os valores do array $dados sejam vinculados corretamente com as variáveis da view, dessa forma a view não tem acesso a todas variáveis presentes em nosso controller e sim somente das necessárias para sua correta renderização.

Agora que notei sua última pergunta sobre o echo. Tem o echo por que a função retorna uma string que é a view renderizada com os valores passados pela variável $dados vinculados. Então o echo é para exibir a nossa view na tela.

Caraca, Diego. Eu jamais explicaria de forma tão didática. Parabéns!

Caraca, Diego. Eu jamais explicaria de forma tão didática. Parabéns!

Obrigado, Mestre!