Deletar
![AlzClar](https://academy.especializati.com.br/assets/site/imgs/no-image.png)
Boa noite, professor.
Para o usuário deletar apenas o que ele inseriu no banco, o mais simples seria no request fazer uma regra de validação? Tipo required|... {id}, id
Olá, "Alzcla"!
Tudo bem?
Existem muitas formas segura de garantir isso.
Uma delas (que usei nos cursos de multi-tenancy) foi usando Scopes, que filtra os registros pelo tenant_id (ou id do usuário)
Outra forma de fazer, é usando os Gates (ensino isso no curso LaraFood).
Outra maneira de fazer isso é fazer um filtro na query mesmo, manual:
->where('user_id', auth()->user()->id)
![Carlos Ferreira](https://storage.googleapis.com/eti-academy/users/carlos-ferreira.jpg)
Show!
O site está ficando legal rodando...Aprendi muito com meus erros...
Valeu!
![AlzClar](https://academy.especializati.com.br/assets/site/imgs/no-image.png)
Professor, boa tarde.
Se fosse usar o authorize na agência de turismo, no aeroporto do seu código, para proibir que outros usuários editassem ou deletassem o que foi feito por outro usuário, como ficaria?
Abç
![AlzClar](https://academy.especializati.com.br/assets/site/imgs/no-image.png)
Olá, tudo bem?
Você finalizou esse ticket, tudo certo?
![Carlos Ferreira](https://storage.googleapis.com/eti-academy/users/carlos-ferreira.jpg)
Acreditei que estava tudo certo, mas...fui testar uns dias depois...ele não autoriza para o usuário que fez o registro...Continuei daqui para manter o mesmo assunto...
public function surveysDestroy($idCompany, $id)
{
Gate::authorize('surveysDestroy', $id)
$survey = $this->survey->find($id);
...
}
![AlzClar](https://academy.especializati.com.br/assets/site/imgs/no-image.png)
Bom dia! Complementando...
Eu cadastro uma "companhia". Na view da companhia, eu clico em cadastrar "reclamações" da companhia.
Na tabela da companhia não há coluna user_id, mas na tabela de reclamações, tenho a coluna user_id.
Fiz "use App\Models\Companhia e vou (amanhã) tentar pegar o $user_id
![AlzClar](https://academy.especializati.com.br/assets/site/imgs/no-image.png)
Como está passando o $id e não um objeto, lá no Provider deve estar assim:
Gate::define('surveysDestroy', function (User $user, $id) {
return $user->id === $id;
});
----------
Mas o ideia seria:
// Provider
Gate::define('surveys-destroy', function (User $user, $survey) {
return $user->id === $survey->user_id;
});
// Controller
$survey = $this->survey->find($id);
Gate::authorize('surveys-destroy', $survey);
-------
DICA: O LaraFood tem um complexo sistema de ACL no projeto, pode ser muito útil para você.
![Carlos Ferreira](https://storage.googleapis.com/eti-academy/users/carlos-ferreira.jpg)
Boa noite professor!
Eu estava passando $survey, mas vi que, quando tentava deletar (editar), estavam sendo visualizados os detalhes de outra empresa (ou reclamações). Lembrei que havia feito um teste e voltei o id e visualizei corretamente.
Como está passando o $id e não um objeto, lá no Provider deve estar assim:
Gate::define('surveysDestroy', function (User $user, $id) {
return $user->id === $id;
});
Testei a ideia acima e cai na página de erro... vi que lá na url... estava /site/empresa//survey(reclamações)/17 aí comecei a verificar o id da empresa...
Mas voltei para o ideal:
// Provider
Gate::define('surveys-destroy', function (User $user, $survey) {
return $user->id === $survey->user_id;
});
// Controller
$survey = $this->survey->find($id);
Gate::authorize('surveys-destroy', $survey);
Volta a cair na página de erro...
A minha tabela surveys tem user_id e empresa_id e os relacionamentos...
As tabelas empresas e users não possuem relacionamentos com chaves estrangeiras...
Se eu tivesse tabela pivô, eu iria para o "attech e detach"...
Criei uma coluna user_id na tabela empresas. Vou salvar um auth()->user() e tentar salvar na outra tabela de reclamações...
O LaraFood tem um complexo sistema de ACL no projeto, pode ser muito útil para você:
Eu segui o curso da agência de Turismo e qdo veio a origem e destination, fiquei confuso em adaptar... Mais a frente, há a visualização do voo e depois é creado e feita a reserva...mais ou menos isso. Aí é que acontece a mágica de salvar tudo no mesmo usuário...
Certo!?
Abç
![AlzClar](https://academy.especializati.com.br/assets/site/imgs/no-image.png)
Se isso daqui está gerando uma página de erro (403), é porque o user_id de survey está diferente do id do usuário autenticado:
$survey = $this->survey->find($id);
// faça o teste
dd($survey->user_id == auth()->user()->id);
Gate::authorize('surveys-destroy', $survey);
-----------------
Sobre essa parte aqui:
As tabelas empresas e users não possuem relacionamentos com chaves estrangeiras...
Se eu tivesse tabela pivô, eu iria para o "attech e detach".
RE: Sinceramente não entendi nada do que quis dizer. É o que eu sempre te oriento amigo, eu estou fora do seu projeto, não faço ideia de como implementou e menos ainda da lógica que usou.
---------------------
Mais a frente, há a visualização do voo e depois é creado e feita a reserva...mais ou menos isso. Aí é que acontece a mágica de salvar tudo no mesmo usuário...
RE: Também não entendi o que quis dizer...
![Carlos Ferreira](https://storage.googleapis.com/eti-academy/users/carlos-ferreira.jpg)
Professor,
Sinceramente não entendi nada do que quis dizer. É o que eu sempre te oriento amigo, eu estou fora do seu projeto, não faço ideia de como implementou e menos ainda da lógica que usou
Minha referência são seus cursos. Seu código. Lembra plans, details, tenant, profiles, permissions? Para vincular os detalhes de um plano, foi usado "attech" e "detach". Usei entre aspas pq não lembrei a grafia correta... Sobre esses métodos, li na documentação do láravel que se usa uma tabela pivô...mas deve ser um caso particular...
Também não entendi o que quis dizer...
Sobre isso segui as suas aulas do curso de agência de turismo...mas não entrei na aula de reservas... Agora a pouco, assisti essas aulas até a aula de cadastro de reservas... e já tirei umas dúvidas nessas aulas...
![AlzClar](https://academy.especializati.com.br/assets/site/imgs/no-image.png)
Posta o código, e diga exatamente onde está o problema. É porque sem ver o seu código e entender o real problema não consigo te ajudar.
No aguardo amigo.
![Carlos Ferreira](https://storage.googleapis.com/eti-academy/users/carlos-ferreira.jpg)
Professor! Um momento...Eu troquei o HD para o de SSD. Só não achei ainda o arquivo do projeto.
![AlzClar](https://academy.especializati.com.br/assets/site/imgs/no-image.png)
Ok, se possível faça um vídeo também, porque fica mais fácil de te entender o problema.
![Carlos Ferreira](https://storage.googleapis.com/eti-academy/users/carlos-ferreira.jpg)
Precisa estar logado para conseguir responder a este ticket!
Clique Aqui Para Entrar!