Como faço para os métodos dos meus controllers retornarem para a requisição via get?
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!
Como faço para os métodos dos meus controllers retornarem para a requisição via get?
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?
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
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