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

API

Como faço para os métodos dos meus controllers retornarem para a requisição via get?

28 respostas

Oi Thiago, não entendi bem, todos os métodos devem ser get ou todos eles devem redirecionar para um get?

Tipo eu faço a requisição via get para 1 certo endereço, dai como faz pro controller devolver o "array" da resposta? não estou conseguindo

Opa Thiago.

Se for o que eu to pensando, você quer que a requisição traga como resposta um json ( comum em requisições REST).

Se for conforme eu to pensando, segue o exemplo abaixo.

Digamos que a intenção seja retornar um array de produtos em json acessando o link /produtos

<?php
namespace App\Http\Controllers;

class ProdutoController extends Controller
{
    //responde quando alguem chama /produtos  
    public function index()
    {
        //todos os produtos serão retornados        
        $produtos = App\Produto::all();

        return response() ->json(['produtos' =>  $produtos );
    }
}
?>

Verifica o retorno e nos diga se é isso mesmo que você deseja.

Quando eu dou no a requisição ele está imprimindo o array na página, é como se a requisição não tivesse sendo feita pelo o GET, pois não está retornando nada para ele.

Copia o array e cola aqui pra gente ver.

Vou mandar tudo, o get que tô fazendo e o controller. get:

new Vue({
    el: '#app',
    data:{
        produtos:[],
        msg:"aaaaa"
    },
    ready: function (){
        console.log('s');
        /*this.$http.get('http://127.0.0.1:8000/list'),function(produtos) {
                this.produtos = [1,2,3];

                console.log(produtos);
            };*/
            this.$http.get('http://127.0.0.1:8000/list', function(produtos) {
                console.log(produtos);
                this.produtos = produtos;

                console.log('entrei');
            });

        console.log('fs');

  }


});

controller do laravel

public function select(){

             $produtos = DB::select('select * from produto');

             return $produtos;

                #return view('lista')->with('produtos',$produtos);
            #return response() ->json(['produtos' =>  $produtos ]);
            # return view('lista');

        }

Esse projeto inteiro era um CRUD básico só feito com Laravel, agora estou tentando colocar o VueJS para fazer as requisições, porem é onde estou preso.

Cade o seu arquivo route.php? Coloca ele aqui. Ele está apontando pro lugar certo?

Thiago, cola o resultado desse console.log aqui? console.log(produtos);

route.php


Route::get('/', 'produto@select');
Route::get('/add/','produto@add');
Route::get('/addc','produto@addc');
Route::get('/up/{id}','produto@up');
Route::get('/att','produto@att');
Route::get('/del/{id}','produto@del');

console.log(produtos) Está imprimindo o código da view.

Acho que faltou apontar o link pra algum lugar ai

http://127.0.0.1:8000/list é o link que você tá chamando no vue, mas pelo seu route.php, ele não está sendo apontado pra lugar nenhum.

Você tem que apontar explicitamente no route.php, como abaixo

//select tá apontando  pra raiz
//Route::get('/', 'produto@select');

//segundo a chamada do vue 
Route::get('/list', 'produto@select');

Ele está assim no route.php agora, mas continua a mesma coisa.



Route::get('/list', 'produto@select');

Posta o conteúdo da view aqui. o que é que ele tá imprimindo lá?

Imprime tudo menos o v-for.

<!DOCTYPE html>
<html>
<head>
    <title></title>
    <link rel="stylesheet" type="text/css" href="/css/app.css">
</head>
<body>
<div class="container" id="app">
    <h1>Todos os produtos</h1>



            <ul>
                <li v-for="p in produtos">@{{p.nome}}</li>
            </ul>




</div>
<script src="/js/vue.min.js"></script>
<script src="/js/vue-resource.min.js"></script>

<script src="/js/home/index.js"></script>
<script>/*
    new Vue({
    el: '#app',
    data:{
        produtos:[],
        msg:"aaaaa"
    },
    ready: function(){
        console.log('a');
    }


});*/
</script>
</body>
</html>

Quando você chama a url abaixo direto no navegador. O que aparece?

http://127.0.0.1:8000/list

Outro dia eu vi um problema aqui mesmo no forum de um problema de cors. O cara conseguiu resolver mudando a chamada do js.

Ele trocou

this.$http.get('http://127.0.0.1:8000/list', function(produtos) {
            //...resto do codigo
            });

por

this.$http.get('/list', function(produtos) {
            //...resto do codigo
            });

De qualquer forma, posta o resultado da url chamada direto no navegador.

Cara, sei que é chato, mas é o unico jeito da gente te ajudar

http://127.0.0.1:8000/list a resposta é a própria view, renderizada.

this.$http.get('/list', function(produtos) {
            //...resto do codigo
            });

tentei isso, não mudou em nada, tô quase desistindo kk.

E aqui, tá assim?

public function select(){

             $produtos = DB::select('select * from produto');

             return $produtos;

    return response() ->json(['produtos' =>  $produtos ]);


        }

Só com return produtos, já tentei com o response, mas deu a mesma.

Lembra que se tiver dois returns, apenas o primeiro vale

Sim, já tentei com os 2 e não vai.

Cola o resultado do código abaixo:

dd($produtos);

Esse dd precisa estar logo depois do select.

Está imprimindo o array de array dos produtos

array:3 [▼
  0 => {#179 ▼
    +"id": 19
    +"nome": "soares"
    +"preco": 2
  }
  1 => {#181 ▼
    +"id": 2
    +"nome": "bbb"
    +"preco": 22
  }
  2 => {#182 ▼
    +"id": 13
    +"nome": "1"
    +"preco": 1
  }
]

Aparentemente a saída do dd está em conformidade com o desejado.

se voce está usando o retorno

return response() ->json(['produtos' =>  $produtos ]);

Era pra funcionar perfeitamente.

Se achar viável, sobe o código no git ou compacta e coloca em algum lugar. Assim da pra olhar ele como um todo.

Não, se ele fizer assim:

return response() ->json(['produtos' =>  $produtos ]);

Ele está retornando um array, com um array de produtos. Então ele precisa fazer: produtos.produtos no js. Se ele fizer:

return response() ->json($produtos);

ai sim, ele já pega o array de produtos diretamente como eu acho que seja a intenção.

Não é assim?

Acho que o Wanderson também certo. Tenta ai é nos de um retorno

Bom dia senhores, desculpem a demora, não tenho acesso ao código nos fds, segue o link do projeto no git, https://github.com/YaakovDantas/laravel_vue_api

solução!

Pessoal consegui resolver, o problema era eu mesmo, estava usando uma mesma URL para retornar o array e também para retornar a view, quando separei os 2, deu certo, vlw ae, e muito obrigado pela paciência, e desculpa o abuso ;D

Por isso que ver o código na integra ajuda muito. De qualquer forma Thiago, parabéns!

Precisando pode contar com a gente.

Vlw, espero demorar a voltar kk

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