CRUD Bootstrap 5 Mysql e Codeigniter - Criando um Sistema central com codeigniter 4 - Base
Este código cria um sistema web administrativo com controle de acesso e nivel, utilizando Bootstrap 5.3.

Para iniciar você precisa instalar o #codeigniter 4.7 em seu ambiente com o #composer
composer create-project codeigniter4/appstarter nome-do-seu-projeto
Este sistema trabalha com arquiterura de módulos, entidades de domínio e serviços e utilizará url amigável para acesso as páginas.
Em breve o link para o git do projeto será disponibilizado.
O cadastros testados são: empresas, usuários, grupos e departamentos.
1 - Configurar o .env para espelhar um ambiente de desenvolvimento e conectar a um banco de dados. É necessário uma conexão com um banco de dados.
Informações ou código fonte: gilbmg@gmail.com assunto: título do post.

Demonstração: www.codesnippets.dev.br/web/ci4 (usuário: admin@admin.com e senha admin123)
Você pode querer ajustar o app.baseURL também.
A estrutura base dos módules será basicamente com esta.

Utilizaremos doi templates principais: para logados e não logados. /app/Views/layouts

Tela de listagem de empresas.


Acessos.

Categorias e subcategorias

Demonstração: www.codesnippets.dev.br/web/ci4 (usuário: admin@admin.com e senha admin123)
modules/Subcategorias/Controllers/Subcategorias.php
<?php
namespace Modules\Subcategorias\Controllers;
use App\Controllers\BaseController;
use CodeIgniter\Exceptions\FrameworkException;
use Modules\Subcategorias\Application\SubcategoriaService;
class Subcategorias extends BaseController
{
protected SubcategoriaService $subcategoriaService;
public function __construct()
{
$this->subcategoriaService = service('subcategoriaService');
}
public function index(): string
{
$pagina = (int) $this->request->getGet('page') ?: 1;
$termo = $this->request->getGet('termo') ?? '';
$status = $this->request->getGet('status') ?? '';
$categoriaId = (int) $this->request->getGet('categoria_id') ?: 0;
$resultado = $this->subcategoriaService->listar($pagina, $termo, $status, $categoriaId);
// Obter lista de categorias para o filtro
$categoriaService = service('categoriaService');
$categorias = $categoriaService->listarAtivas();
$data = [
'subcategorias' => $resultado['dados'],
'paginacao' => $resultado['paginacao'],
'termo' => $termo,
'status' => $status,
'categoriaId' => $categoriaId,
'categorias' => $categorias,
];
return view('Modules\Subcategorias\Views\index', $data);
}
public function create(): string
{
$categoriaService = service('categoriaService');
$categorias = $categoriaService->listarAtivas();
return view('Modules\Subcategorias\Views\form', [
'subcategoria' => null,
'categorias' => $categorias,
'titulo' => 'Nova Subcategoria',
]);
}
public function store()
{
if (!$this->request->is('post')) {
return redirect()->back();
}
try {
$categoria_id = $this->request->getPost('categoria_id');
$nome = $this->request->getPost('nome');
$status = $this->request->getPost('status') ?? 'ativo';
log_message('info', '[Subcategorias::store] Recebido: categoria_id=' . $categoria_id . ', nome=' . $nome . ', status=' . $status);
$this->subcategoriaService->criar([
'categoria_id' => $categoria_id,
'nome' => $nome,
'status' => $status,
]);
log_message('info', '[Subcategorias::store] Subcategoria criada com sucesso');
session()->setFlashdata('success', 'Subcategoria criada com sucesso!');
return redirect()->to('cadastros/subcategorias');
} catch (FrameworkException $e) {
log_message('error', '[Subcategorias::store] FrameworkException: ' . $e->getMessage());
session()->setFlashdata('error', $e->getMessage());
return redirect()->back()->withInput();
} catch (\Exception $e) {
log_message('error', '[Subcategorias] Erro ao criar: ' . $e->getMessage());
session()->setFlashdata('error', 'Erro ao criar subcategoria. Tente novamente.');
return redirect()->back()->withInput();
}
}
public function edit(int $id): string
{
$subcategoria = $this->subcategoriaService->obterPorId($id);
if (!$subcategoria) {
throw \CodeIgniter\Exceptions\PageNotFoundException::forPageNotFound();
}
$categoriaService = service('categoriaService');
$categorias = $categoriaService->listarAtivas();
return view('Modules\Subcategorias\Views\form', [
'subcategoria' => $subcategoria,
'categorias' => $categorias,
'titulo' => 'Editar Subcategoria',
]);
}
public function update(int $id)
{
if (!$this->request->is('post')) {
return redirect()->back();
}
try {
$categoria_id = $this->request->getPost('categoria_id');
$nome = $this->request->getPost('nome');
$status = $this->request->getPost('status');
log_message('info', '[Subcategorias::update] ID=' . $id . ', categoria_id=' . $categoria_id . ', nome=' . $nome . ', status=' . $status);
$this->subcategoriaService->atualizar($id, [
'categoria_id' => $categoria_id,
'nome' => $nome,
'status' => $status,
]);
log_message('info', '[Subcategorias::update] Subcategoria atualizada com sucesso');
session()->setFlashdata('success', 'Subcategoria atualizada com sucesso!');
return redirect()->to('cadastros/subcategorias');
} catch (FrameworkException $e) {
log_message('error', '[Subcategorias::update] FrameworkException: ' . $e->getMessage());
session()->setFlashdata('error', $e->getMessage());
return redirect()->back()->withInput();
} catch (\Exception $e) {
log_message('error', '[Subcategorias] Erro ao atualizar: ' . $e->getMessage());
session()->setFlashdata('error', 'Erro ao atualizar subcategoria. Tente novamente.');
return redirect()->back()->withInput();
}
}
public function delete(int $id)
{
try {
$this->subcategoriaService->deletar($id);
session()->setFlashdata('success', 'Subcategoria deletada com sucesso!');
} catch (FrameworkException $e) {
session()->setFlashdata('error', $e->getMessage());
} catch (\Exception $e) {
log_message('error', '[Subcategorias] Erro ao deletar: ' . $e->getMessage());
session()->setFlashdata('error', 'Erro ao deletar subcategoria. Tente novamente.');
}
return redirect()->to('cadastros/subcategorias');
}
public function buscarPorCategoria(int $categoriaId = 0)
{
if ($categoriaId <= 0) {
return $this->response->setJSON(['success' => false, 'message' => 'Categoria inválida']);
}
try {
$subcategorias = $this->subcategoriaService->buscarPorCategoria($categoriaId);
return $this->response->setJSON([
'success' => true,
'data' => $subcategorias,
]);
} catch (\Exception $e) {
log_message('error', '[Subcategorias] Erro ao buscar por categoria: ' . $e->getMessage());
return $this->response->setJSON([
'success' => false,
'message' => 'Erro ao buscar subcategorias',
]);
}
}
}
Compartilhe este artigo: