2
respostas

Dúvida::Laravel + Orientação a Objetos

Olá pessoal, tudo bem? Fiz o curso de PHP+MYSQLII e lá refatoramos nosso código para trabalhar com OO, minha dúvida é, usando laravel, onde crio minhas classes? Elas serão controladores também? Vou dar um exemplo do que estou falando. Veja o seguinte formulário: http://imgur.com/a/DMZhI parece fazer sentido criar uma classe para cliente, pois ele tem um tipo, um nome, um email, poderia ter um tipo de imposto diferente... Sei que poderia criar uma model para Cliente, mas considere o seguinte código, parte dos dados vêm do formulário, parte deve vir de algum tratamento de uma classe que estende de Cliente. Essa forma de inserir está certa? O código parece meio feio, o que vocês mudariam?

    public function cadastra(OsRequest $osRequest){

        //recebe os valores do formulário
        $params = $osRequest->all();

        //variáveis vazias para não dar pau na hora de inserir (pq se o tipo for pessoa fisica, getCnpj não existe (isso não parece muito inteligente))
        $cpf = '';
        $cnpj = '';

        //verifica se é pessoa física ou jurídica
        if($params['tipo'] == 'pj'){
            $cliente = new PjurController($params);
            $cnpj = $cliente->getCnpj();
        }else{
            $cliente = new PfisController($params);
            $cpf = $cliente->getCpf();
        }

        $pago = isset($params['pago']) ? 1 : 0;

        //insere todos os dados (parece feio também)
        Os::create(['nome'=>$cliente->getNome(), 'email'=>$cliente->getEmail(), 'descricao'=>$params['descricao'],
            'preco'=>$params['preco'], 'pago'=>$pago, 'categoria_id'=>$params['categoria_id'],
            'imposto'=>$cliente->calculaImposto(), 'cnpj'=>$cnpj, 'cpf'=>$cpf, 'tipo' => $params['tipo'],
            '_token'=>$params['_token']]);

        return redirect()->action('OsController@formNovo')->withInput(Request::only('nome'));
    }
2 respostas

Olá Israel,

você pode criar suas classes usando o comando que o Laravel recomenda: https://laravel.com/docs/5.3/eloquent#defining-models

Se você pretende usar o Laravel seguindo as recomendações do mesmo, a lógica deve ficar nos controllers, pelo menos a maior parte dela, que é alcançado através da rotas e etc.

Se o código ficar muito feio ou extenso cuidando de muitas funcionalidades é hora de refatorar, recomendo o curso de SOLID aqui do Alura.

Att,

Olá, Israel.

Olhando seu código não entendi muito bem a dúvida! Se o único Code Smell que te incomoda é no Os::create, você pode criar uma espécie de Factory Method, que te retorna os parâmetros que Os:create precisa. Assim, aquela linha pode ficar parecida com

Os::create($this->getParams());

Espero ter ajudado!

Quer mergulhar em tecnologia e aprendizagem?

Receba a newsletter que o nosso CEO escreve pessoalmente, com insights do mercado de trabalho, ciência e desenvolvimento de software