Crie o model FuncaoMenu
para criar o model FuncaoMenu use o comando: php artisan make:model FuncaoMenu -m
adicione os seguintes campos:
Schema::create('funcao_menus', function (Blueprint $table) {
$table->id();
$table->bigInteger('menu_id')->unsigned();
$table->foreign('menu_id')->references('id')->on('menus');
$table->foreign('funcao_id')->references('id')->on('funcaos');
$table->bigInteger('funcao_id')->unsigned();
$table->string('nome');
$table->text('descricao');
$table->timestamps();
});
faça o relacionamento da tabela FuncaoPermissao e as tabelas:
- Funcao
- Permissao
public function funcao(){
return $this->belongsTo(Funcao::class,"funcao_id",'id',"funcao_permissaos");
}
public function permissao(){
return $this->belongsTo(Permissao::class,"permissao_id","id","funcao_permissaos");
}
Crie um controller de recursos chamado FuncaoPermissao, para que o projeto fique mais organizado salve o controller numa pasta chamada Acl
No controller UsuarioController implemente o método index, o qual deverá:
- pegar a lista de funcoes e colocar um array
- pegar a lista de usuarios e colocar um array
- pegar a lista de funcaousuario e colocar num array
- chamar a view Acl/FuncaoUsuario/Index com o array criado com a lista de usuarios
public function index()
{
$dados["funcoes"] = Funcao::all();
$dados["usuarios"] = User::all();
$dados["lista"] = FuncaoUser::all();
return view("Acl.FuncaoUsuario.Index", $dados);
}
Crie a view para a listagem de usuarios
Copie o conteúdo do arquivo lst_funcaousuario para o arquivo Acl/FuncaoUsuario/Index.blade.php, não esqueça envolvê-lo pelos comandos:
@extends('template')
@section('conteudo')
//aqui fica o conteúdo do arquivo
@endsection
Na view Index, faça os seguintes procedimentos:
- Faça o loop para receber os dados do banco e listar na tabela
- Configure o link para fazer a edição de um registro
- Configure o link para fazer a exclusão de um registro
@foreach ($lista as $p)
<tr>
<td align="center">{{ $p->id }}</td>
<td align="center">{{ $p->funcao->usuario }}</td>
<td align="center">{{ $p->funcao->funcao }}</td>
<td align="center"><a href="" class="btn btn-azul d-inline-block"><i
class="fas fa-eye mr-1"></i>Ver
Permissões</a></td>
<td align="center"><a href="" class="btn btn-verde d-inline-block"><i
class="fas fa-eye mr-1"></i>Ver
Menus</a></td>
<td align="center">
<a href="#"
onclick="confirm('Tem Certeza?') ? document.getElementById('apagar-{{ $p->id }}').submit() : '';"
class="btn btn-vermelho d-inline-block d-inline-block"><i
class="fas fa-trash-alt"></i></a>
<form action="{{ route('funcaousuario.destroy', $p->id) }}" method="POST"
id="apagar-{{ $p->id }}">
<input type="hidden" name="_method" value="DELETE">
<input type="hidden" name="perfil" value="{{ $p->nome }}">
{{ csrf_field() }}
</form>
</td>
</tr>
@endforeach
Configure os dados do formulário para inserção dos dados
configure os input atribuindo a eles na propriedade name o nome igual ao que foi definido na criação da tabela,
também observe os tipos de dados específicos e os que são obrigatórios atribua a propriedade required
<div class="col-2">
<label class="text-label d-block text-branco">Cod </label>
<input type="text" name="cod" required
value="{{ isset($submenu->cod) ? $submenu->cod : null }}" class="form-campo">
</div>
implemente o método store para receber e salvar os dados do formulário no Banco de dados
Implemente o método store de forma que o mesmo receba os dados do formulário e salve no banco de dados, caso ache necessário use um bloco try/catch
$req = $request->except(["_token","_method","funcoes"]);
try{
SubMenu::Create($req);
return redirect()->route("submenu.index")->with('msg_sucesso', "Cadastro realizado com sucesso.");
}catch (\Exception $e){
return redirect()->back()->with('msg_erro', "Houve um problema na tentativa de cadastro [{$e->getMessage()}]");
}
Uma boa prática de programação é validar os dados antes de enviá-los para o banco de dados e uma bom recurso que o laravel oferece são os requests.
implemente um request de forma que faça todas as validações necessárias para salvar a informações no banco
Teste o sistema fazendo cadastros
Configure o método edit do Controller, com as seguinte ações:
- Busque o submenu pelo id passado no parâmetro e guarde a informação em um array
- liste todas aos submenus e guarde as informações em um array
- liste todos os menus
- Chame a view Index, passando o array de dados como parâmetro
public function edit(string $id)
{
$dados["submenu"] = SubMenu::find($id);
$dados["lista"] = SubMenu::all();
$dados["menus"] = Menu::all();
return view("Acl.SubMenu.Index", $dados);
}
Configure os dados do formulário para ediçao dos dados
Configure o elemento form da view Index, com as seguintes ações:
- o sistema deve verificar se o objeto submenu existe,
- caso ele exista, no formulário deve ser configurada a rota submenu.update
- caso não exista, no formulário deve ser configurada a rota submenu.store
@if (isset($submenu))
<form action="{{ route('submenu.update', $submenu->id) }}" method="POST">
@method('put')
@else
<form action="{{ route('submenu.store') }}" method="POST">
@endif
@csrf
na propriedade value de cada input, faça uma verificação se existe o objeto submenu, se existir imprimir o valor do campo correspondente, senão existe imprimir o objeto old()
<div class="col-2">
<label class="text-label d-block text-branco">Cod </label>
<input type="text" name="cod" required
value="{{ isset($submenu->cod) ? $submenu->cod : null }}" class="form-campo">
</div>
Implemente o método update de forma que o mesmo receba os dados do formulário e salve no banco de dados, caso ache necessário use um bloco try/catch
public function update(Request $request, string $id)
{
$req = $request->except(["_token","_method","funcoes"]);
try{
SubMenu::find($id)->update($req);
return redirect()->route("submenu.index")->with('msg_sucesso', "Cadastro realizado com sucesso.");
}catch (\Exception $e){
return redirect()->back()->with('msg_erro', "Houve um problema na tentativa de cadastro [{$e->getMessage()}]");
}
}
Faça o teste do seu sistema de forma que o mesmo consiga criar um novo registro e também alterá-lo
implemente o método destroy do Controller, com as seguinte ações:
- Busque o submenu pelo id passado no parâmetro
- Caso encontre, exclua a mesma do banco, coloque esta instrução em um bloco try/catch
- redirecione para a rota index
try {
$sub = SubMenu::findOrFail($id);
if($sub){
$sub->delete();
}
return redirect()->route("submenu.index")->with("msg_sucesso", "Registro Excluído com Sucesso");
} catch (\Throwable $th) {
return redirect()->back()->with("msg_erro", "Erro: " . $th->getMessage());
}
Teste o seu sistema, para que você tenha certeza que está tudo o ok, o sistema deverá:
- Listar todas as categorias
- Criar uma categoria nova
- Editar uma categoria selecionada
- Excluir uma categoria selecionada