# FAQ Back-End
* Nota do autor: Esse FAQ tá bem desorganizado, me dá gatilhos. Quaisquer ideias para uma melhor organização serão bem vindas
## 1- Relacionamentos
### *1. Lidar com relacionamentos em branchs diferentes é complicado, o que posso fazer para facilitar o processo?*
Realmente, com o git workflow vigente até o momento (30/09/2020), trabalhar com funcionalidades que se relacionam em branches separadas é um pouco complicado. Porém existem meios de se resolver esse problema:
<img src="https://i.imgur.com/p6LTf2D.png" width="450" height="500">
O que podemos fazer - após iniciarmos e escrevermos todo o início do código - é criar uma branch separada e dentro dela colocar as duas branches as quais estão relacionadas.
Feito isso, iniciamos a bateria de testes e só paramos quando não houver teste faltando. A cada erro que surgir, descobrimos como corrigir, corrigimos nessa própria branch de testes e anotamos essa correção em algum lugar separado.
Depois de testar tudo, podemos voltar para as branches de origem e corrigir os bugs que encontramos
Esse ciclo de codar, misturar na de testes, testar e corrigir pode se repetir várias vezes, então prepare sua paciência ;)
### *2. Model*
Já parou pra pensar o que significa cada parte de relacionamento no seu model?
+ $with: A váriavel $with recebe um array [] e dentro desse array vão os nomes dos relacionamentos que você deseja enviar pro front
+ 
> Você não achou que eu ia escrever essa função aqui né? Dale imagem
Essa função fala para o laravel qual é o model relacionado e qual o tipo de relacionamento (nesse caso, 'belongsTo')
Ah! Importante dizer uma coisa:

E mais! O Laravel, na hora de procurar pelos relacionamentos tem uma série de lógicas de pluralização e etc, então sempre crie a tabela com um nome em inglês , OU, se criar em português, verifique se a pluralização é simples.
Exemplo:
* CRUD de Imagens, relacionamento com o de Categorias
*Migration:* **IMAGEMS** (SIM, COM 'M' E NÃO COM 'N')
*Model:* **IMAGEM**
*Lááá no model de Categoria*:
* *$with = ['**imagems**']*
> Sim, no plural pois geralmente uma categoria tem mais de uma imagem
* *public funcion **IMAGEMS**()*
Em português fica feio né? Então `s e g u e__o__p a d r ã o__d e__c ó d i g o` da Ecomp que fica tudo certo ;)
### *3. Tabela pivô*
Não, não é sobre seu dente que estamos falando.
Toda vez que temos um relacionamento N:N, ou seja, um monte pra um monte, o Laravel cria uma tabela intermediária pra lidar com essa parada toda:

*A pivô é a do meio*
Basicamente, depois de usarem bastante o seu banco de dados, ele vai ficar mais ou menos desse jeito:

## 2- Classes
Muitas vezes nos deparamos com erros onde o Laravel diz que não encontrou uma classe. Isso VAI acontecer contigo e a melhor maneira de corrigir é entendendo como o Laravel trabalha com essas classes.
Toda vez que iniciamos nossa aplicação, o Laravel cria um mapa de classes em memória cache, pra que o tempo de resposta da aplicação seja o menor possível.
Dito isso, partamos para as perguntas, erros e respostas
### 1. *Target class [...] not found*

Nada melhor que uma imagem pra economizarmos palavras.
No caso dessa imagem, o Laravel está acusando que a classe ```bla/bla/TaskController``` não existe. Se dermos uma olhada nas pastas e no Controller....

Bingo! E aqui aprendemos nossa primeira lição do Laravel: nomeie seus namespaces de acordo com a pasta onde seu arquivo está - e veja se escreveu com todas as letras, bonitinho rs ;)
## 3- In-Game
Ou melhor dizendo, *in-código*. Nessa seção poderíamos escrever linhas e linhas e sempre teria algo novo. Portanto, o objetivo aqui é mostrar como *interpretar* os erros
### 1. *Argument x passed to y must be...*
O que esse nos indica é que chamamos um função e, em um dos seus parâmetros, passamos um dado que está num formato nao compatível com o parâmetro que ele está ocupando
Um exemplo rápido
No erro:

No código:

Como descrito no erro, o argumento **1** é uma **string**, porém o que a função *::make()* espera é um **array**
Corrigindo..
<img src="https://i.imgur.com/pOM8FK8.png" height="45">
### 2. *Um pouco sobre importações*
Se você reparar, toda vez que cria um novo controller, o começo da classe fica como:
```php=5
class JubileuController extends Controller{
}
```
A parte `extends Controller` diz para o PHP que `JubileuController` irá herdar todas as características da classe `Controller`.
E aí resido o problema: se você não indicar para o PHP onde está essa classe, ele simplesmente retornará um erro.
Portanto, para solucionar isso, basta adicionar no começo do arquivo a classe Controller:
```php=3
use App\Http\Controllers\Controller;
```
## 4. Arquivos
Lidar com arquivos no Laravel pode ser simples, mas isso depende de um pouco de sorte. Na verdade, depende do quanto você conhece o funcionamento 'por baixo dos panos'
### *1. Cade a minha imagem? - Parte 1*
Pois é. Você fez o `putFile()` certinho, pegou o caminho da imagem e quando colocou no navegador.... nada apareceu. Ou melhor, apareceu sim. Um 404.
O problema pode ter várias origens, porém o enfoque aqui será no link que você coloca em seu navegador. O link de retorno terá um aparência do tipo:
public/images/umm0nt3d3l3tr4s3num3r0s.png
porém não é exatamente ele que você deve retornar para o front/usar em seu navegador. O que acontece é que os navegadores, os usuários no geral, quando entram em seu site, já entram pela pasta public.
Nesta imagem temos a visão que nós, desenvolvedores, temos da estrutura de pastas do back-end:

Porém, um visitante de nosso site vê assim:

Por isso o link `public/images/umm0nt3d3l3tr4s3num3r0s.png` está errado! Não faz sentido navegarmos para a pasta `public/` se já estamos nela!
Desse modo, o link correto é obtido apenas retirando o `public/` da frente, ficando então:
storage/images/umm0nt3d3l3tr4s3num3r0s.png
### *2. Cade a minha imagem? - Parte 2*
'Ok autor, eu corrigi meu link da imagem mas mesmo assim ela não aparece pra mim. E agora?'
php artisan storage:link
Pronto :)

Kkkk achou que eu não ia explicar né? Não? Tá, deixa quieto então..
O que acontece é que originalmente seu repositório vem com duas pastas public, isoladas uma da outra.
O visitante de nosso site, como dia no item um deste tópico, vê apenas uma delas, porém o Laravel armazena tudo na outra public (não, não faço ideia do porquê). O que precisamos fazer então é criar um 'atalho' dentro da "public que todos veem" que direcione pra "public que nem é tão public assim".
## DICA: alguns comandos h4ck3rs_3000_cyberbatutinhas
Assim como aqueles que meditam têm seu *mantra_resolvedor_de_problemas*, a gente aqui no back-end também temos nossos *curingas* pra resolver alguns problemas que surgem
### *1. php artisan config:cache*
Se você reparar bem, existe uma pasta *config* dentro do back-end de sua aplicação. Nesta pasta ficam vários dados que suprem o resto da aplicação com nformaçõs como tokens, linguagem de país, driver de email usado, etc...
Caso você esteja usando uma api e mesmo colocando os tokens dela no .env e adicionando o serviço no services.php, pode ser que o Laravel não tenha carregado esas informações para a memória cache e por isso elas não estão acessíveis. o comando ```php artisan config:cache``` limpa e re-alimenta o cache da aplicação com os dados mais recentes dos arquivos em *config/*
### *2. php artisan optimize:clear*
Ok, esse é um mantra mesmo, pois o funcionamento é mais obscuro. Basicamente, ele funciona como o comando *config:cache*, porém útil quando por algum motivo sua aplicação não está pegando os dados do .env. Esse problema pode aparecer se você estiver montando alguma API e precise salvar o token de acesso no .env, e não nos arquivos dentro da pasta *config/*.
### *3. php artisan cache:clear*
Esse é poderoso. O que ele faz é limpar todo o cache de sua aplicação. Portanto, se você estiver salvando dados em cache com *Cache::put()*, tome cuidado ;)
### *4. php artisan route:list*
*route:list* tá mais pra um cardápio do que para um resolvedor de problemas. Com ele, você tem acesso a uma tabela completa com todas as rotas de sua aplicação

{"metaMigratedAt":"2023-06-15T13:32:58.816Z","metaMigratedFrom":"Content","title":"FAQ Back-End","breaks":true,"contributors":"[{\"id\":\"dced2daf-846f-4275-bc1e-270ba9b78dd2\",\"add\":9384,\"del\":756}]"}