Solucionado (ver solução)

Importante

Você está vendo a versão anterior da nova experiência da Alura que estamos preparando para você. Em breve, ela ganha uma identidade visual novinha totalmente pensada em potencializar seus estudos!

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