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

erro ao Adicionar séries

03-Usando serviços para exclusão aula 08

ao refazer o código para adicionar séries o navegador apresenta o seguinte erro Argument 3 passed to App\Services\CriadorDeSerie::criarSerie() must be of the type int, null given, called in C:\Users\anton\Documents\Estudos\Alura\Formacao PHP\Laravel\controle-series\app\Http\Controllers\SeriesController.php on line 31

esse é meu arquivo SeriesController.php

<?php

namespace App\Http\Controllers;

use App\Episodio;
use App\Http\Requests\SeriesFormRequest;
use App\Serie;
use App\Services\CriadorDeSerie;
use App\Services\RemovedorDeserie;
use App\Temporada;
use Illuminate\Http\Request;

class SeriesController extends Controller
{
    public function index(Request $request)
    {
        $series = Serie::query()
            ->orderBy('nome')
            ->get();
        $mensagem = $request->session()->get('mensagem');

        return view('series.index', compact('series', 'mensagem'));
    }

    public function create()
    {
        return view('series.create');
    }

    public function store(SeriesFormRequest $request, CriadorDeSerie $criadorDeSerie)
    {
        $serie = $criadorDeSerie->criarSerie(
            $request->nome,
            $request->qtd_temporadas,
            $request->ep_por_temporada
        );

        $request->session()
            ->flash(
                'mensagem',
                "Série {$serie->id} e suas temporadas e episódios criados com sucesso {$serie->nome}"
            );

        return redirect()->route('listar_series');
    }

    public function destroy(Request $request, RemovedorDeserie $removedorDeserie)
    {
        $nomeSerie = $removedorDeserie->removerSerie($request->id);
        $request->session()
            ->flash(
                'mensagem',
                "Série $nomeSerie removida com sucesso"
            );
        return redirect()->route('listar_series');
    }
}

arquivo CriadorDeSerie.php

<?php

namespace App\Services;

use App\Serie;
use Illuminate\Support\Facades\DB;

class CriadorDeSerie
{

    public function criarSerie(
        string $nomeSerie,
        int $qtdTemporadas,
        int $epPorTemporada
    ): Serie {
        DB::beginTransaction();
        $serie = Serie::create(['nome' => $nomeSerie]);
        $this->criaTemporadas($qtdTemporadas, $epPorTemporada, $serie);
        DB::commit();

        return $serie;
    }

    /**
     * @param int $qtdTemporadas
     * @param int $epPorTemporada
     * @param $serie
     */

    private function criaTemporadas(int $qtdTemporadas, int $epPorTemporada, Serie $serie)
    {
        for ($i = 0; $i <= $qtdTemporadas; $i++) {
            $temporada = $serie->temporadas()->create(['numero' => $i]);

            $this->criaEpisodios($epPorTemporada, $temporada);
        }
    }

    /**
     * @param int $epPorTemporada
     * @param $temporada
     */

    private function criaEpisodios(int $epPorTemporada, \Illuminate\Database\Eloquent\Model $temporada): void

    {

        for ($j = 1; $j <= $epPorTemporada; $j++) {
            $temporada->episodios()->create(['numero' => $j]);
        }
    }
}

arquivo RemovedorDeSerie.php

<?php

namespace App\Services;

use App\Episodio;
use App\Serie;
use App\Temporada;
use Illuminate\Support\Facades\DB;

class RemovedorDeSerie
{
    public function removerSerie(int $serieId): string
    {
        $nomeSerie = '';
        DB::transaction(function () use ($serieId, &$nomeSerie) {

            $serie = Serie::find($serieId);
            $nomeSerie = $serie->nome;




            $this->removerTemporadas($serie);
            $serie->delete();
        });

        return $nomeSerie;
    }

    private function removerTemporadas(Serie $serie): void
    {
        $serie->temporadas->each(function (Temporada $temporada) {


            $this->removerEpisodios($temporada);
            $temporada->delete();
        });
    }

    private function removerEpisodios(Temporada $temporada): void
    {
        $temporada->episodios()->each(function (Episodio $episodio) {
            $episodio->delete();
        });
    }
}

já reli o código algumas vezes, revi a aula tbm mais continua na mesma, refiz o código, baixei da aula mas continua no mesmo erro.

Link para o projeto: https://github.com/Jeff-syscyber/criador-series

2 respostas
solução!

Antonio, beleza?

Baixei teu código e teu código esta funcionando!

Vamos analisar o erro que esta sendo exibido:

Argument 3 passed to App\Services\CriadorDeSerie::criarSerie() must be of the type int, null given, 

Aqui a mensagem esta nos dizendo que o terceiro argumento que esta sendo passado para criarSerie() deve ser do tipo int (inteiro), em seguida, null given, significa que ele recebeu um nulo.

O terceiro argumento do método a ser informado é o número de episódios da temporada, que possívelmente não foi preenchido no formulário, eu consegui reproduzir o erro.

called in C:\Users\anton\Documents\Estudos\Alura\Formacao PHP\Laravel\controle-series\app\Http\Controllers\SeriesController.php on line 31

Aqui é uma confirmação do que já sabemos, o erro te mostra onde o método foi chamado, no caso na linha 31 de SeriesController, veja que de fato o terceiro argumento é o número de episódios da temporada:

        $serie = $criadorDeSerie->criarSerie(
            $request->nome,
            $request->qtd_temporadas,
            $request->ep_por_temporada
        );

Bom, se este dado é obrigatório, então temos de tratar isto. No teu arquivo SeriesFormRequest.php, faça a alteração conforme abaixo, validando a entrada do número episódios da temporada, o mesmo faremos para o número de temporadas:

<?php

namespace App\Http\Requests;

use Illuminate\Foundation\Http\FormRequest;

class SeriesFormRequest extends FormRequest
{
    /**
     * Determine if the user is authorized to make this request.
     *
     * @return bool
     */
    public function authorize()
    {
        return true;
    }

    /**
     * Get the validation rules that apply to the request.
     *
     * @return array
     */
    public function rules()
    {
        return [
            'nome' => 'required|min:2',
            'qtd_temporadas' => 'required|integer',
            'ep_por_temporada' => 'required|integer',
        ];
    }

    public function messages()
    {
        return [
            'required' => 'O campo :attribute é obrigatório',
            'nome.min' => 'O campo nome precisa ter pelo menos 2 caracteres',
            'qtd_temporadas' => 'Informe o número de temporadas',
            'ep_por_temporada' => 'Informe o número de episódios',
        ];
    }
}

Faça novamente um teste, desta vez se o usuário se esquecer de preencher o número de episódios ele receberá um alerta e o sistema não vai quebrar. Por fim se resolveu sua dúvida, por favor marcar este tópico como resolvido, se não, postar ainda suas dúvidas.

Abs,

Olá Marco Antonio,

O problema foi resolvido foi de grande ajuda, mas para esclarecer o erro aparecia mesmo preenchendo o campo pelo mativo que não consegui indentificar já que o erro consistia mesmo baixando dos arquivos que é disponibilizado no curso, mas foi resolvido agradeço de coração.