CRUD PHP MVC
Criação de um mini sistema de registro, onde será aplicado o processo de adição, atualização e remoção de dados do banco de dados MySQL.
- A primeira coisa a fazer é criar o arquivo composer.json na pasta raiz do projeto, com o seguinte padrão.
{
"name": "starting/mvc",
"autoload": {
"psr-4": {
"App\\":"app/"
}
}
}
- Depois de criar seu arquivo composer.json, você precisa executar o seguinte comando em seu terminal, lembre-se de que você precisa estar na pasta raiz de seu projeto.
composer install
se tudo estiver ok, uma pasta VENDOR foi criada em seu diretório, esta pasta contém os arquivos necessários para realizar as importações automáticas de nossos arquivos PHP.
- Agora, no diretório raiz, criaremos a seguinte estrutura de pastas e arquivos para iniciar o projeto CRUD PHP.
- Arquivo "/resources/_components/footer.html"
<footer>
<p>footer</p>
</footer>
- Arquivo "/resources/_components/header.html"
<header>
<p>header</p>
</header>
- Arquivo "/resources/_styles/default.css"
* {
margin: 0;
padding: 0;
box-sizing: border-box;
}
header, footer {
width: 100%;
height: 55px;
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
padding: 8px;
background-color: #33303c;
color: aliceblue;
font-size: 100%;
font-weight: 700;
text-transform: uppercase;
text-align: center;
}
main {
width: 100%;
min-height: calc(100vh - 110px);
}
.container {
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
}
- Arquivo "/resources/view/home.php"
<!DOCTYPE html>
<html lang="pt-BR">
<head>
<meta charset="UTF-8" />
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<link rel="stylesheet" href="../../resources/_styles/default.css" />
<title>PHP MVC CRUD OO</title>
</head>
<body>
<?php include_once __DIR__.'/../_components/header.html'; ?>
<main class="container">
<!-- O ARQUIVO DE "CADASTRAR.PHP" SERÁ CRIADO UM POUCO MAIS -->
<a href="../../resources/view/cadastrar.php">
<button style="padding: 8px 24px;">cadastrar</button>
</a>
</main>
<?php include_once __DIR__.'/../_components/footer.html'; ?>
</body>
</html>
- Arquivo "index.php"
<?php
// Gerenciar o carregamento das classes
require __DIR__.'/vendor/autoload.php';
include_once __DIR__.'/resources/view/home.php';
- Vamos agora criar nosso arquivo "cadastrar.php" dentro do diretório "/resources/view/cadastrar.php"
- Vamos criar o arquivo "formulario.html" dentro do diretório "/resources/_components/formulario.html"
- Em seguida, vamos importá-lo para o nosso arquivo "cadastrar.php"
- Arquivo "cadastrar.php"
<!DOCTYPE html>
<html lang="pt-BR">
<head>
<meta charset="UTF-8" />
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<link rel="stylesheet" href="../../resources/_styles/default.css" />
<title>Cadastrar</title>
</head>
<body>
<?php include_once __DIR__.'/../_components/header.html'; ?>
<main class="container">
<!-- CONTAINER GLOBAL FORM -->
<div class="container form" style="max-width: 400px; padding: 8px;">
<!-- ADD COMPONENTE FORMULARIO -->
<?php include_once __DIR__.'/../_components/formulario.html'; ?>
<!-- BTN VOLTAR -->
<a href="./home.php">
<button style="padding: 8px 24px;">voltar</button>
</a>
</div>
</main>
<?php include_once __DIR__.'/../_components/footer.html'; ?>
</body>
</html>
- Arquivo "formulario.html"
<form method="post" style="margin: 16px 0px;">
<label for="title">Title</label>
<input
style="width: 100%; padding: 8px; margin-bottom: 16px;"
type="text"
name="title"
id="title"
placeholder="Título"
required
/>
</br>
<label for="descriptions">Descriptions</label>
<textarea
style="width: 100%; padding: 8px; margin-bottom: 16px;"
name="descriptions"
id="descriptions"
cols="10"
rows="5"
placeholder="Descrição da vaga"
required
></textarea>
</br>
<div class="container" style="flex-direction: row;">
<div class="container">
<label for="active">
<input type="radio" name="active" id="active" value="s" checked />
Ativo
</label>
</div>
<div class="container">
<label for="not-active" style="margin-left: 16px;">
<input type="radio" name="active" id="not-active" value="n" />
Inativo
</label>
</div>
</div>
<button
style="padding: 8px 24px; margin-top: 16px; width: 100%;"
type="submit"
>
cadastrar
</button>
</form>
- Vamos agora criar nossas classes dentro do diretório "app/Model/Crud/"
Cadastrar.php
Delete.php
Select.php
Update.php
- Arquivo "Cadastrar.php" no caminho "/app/Model/Crud/Cadastrar.php"
<?php
namespace App\Model\Crud;
class Cadastrar {
/**
* Indentificador único
* @var integer
*/
public $id;
/**
* Título
* @var string
*/
public $title;
/**
* Descrição
* @var string
*/
public $descriptions;
/**
* Se está disponível ou não
* @var string(s/n)
*/
public $active;
/**
* Data da publicação
* @var string
*/
public $data;
}
- Agora vamos importar nossa classe para o arquivo "cadastrar.php" "resources/view/cadastrar.php"
- E vamos aproveitar para verificar se os dados estão chegando após o envio através do formulário
<?php
// Gerenciar o carregamento das classes
require __DIR__.'/../../vendor/autoload.php';
// Importação da nossa classe Cadastrar.php
use \App\Model\Crud\Cadastrar;
// Verificação dos dados enviados
if(isset($_POST['title'],$_POST['descriptions'],$_POST['active'])) {
$objetoCadastrar = new Cadastrar;
$objetoCadastrar->title = $_POST['title'];
$objetoCadastrar->descriptions = $_POST['descriptions'];
$objetoCadastrar->active = $_POST['active'];
// Imprima os dados na tela
echo "<pre>";
print_r($objetoCadastrar);
echo "</pre>";
}
?>
<!DOCTYPE html>
<html lang="pt-BR">
<head>
<meta charset="UTF-8" />
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<link rel="stylesheet" href="../../resources/_styles/default.css" />
<title>Cadastrar</title>
</head>
<body>
<?php include_once __DIR__.'/../_components/header.html'; ?>
<main class="container">
<!-- CONTAINER GLOBAL FORM -->
<div class="container form" style="max-width: 400px; padding: 8px;">
<!-- ADD COMPONENTE FORMULARIO -->
<?php include_once __DIR__.'/../_components/formulario.html'; ?>
<!-- BTN VOLTAR -->
<a href="./home.php">
<button style="padding: 8px 24px;">voltar</button>
</a>
</div>
</main>
<?php include_once __DIR__.'/../_components/footer.html'; ?>
</body>
</html>
Se tudo estiver bem, você deverá ver as seguintes informações na tela:
App\Model\Crud\Cadastrar Object
(
[id] =>
[title] => Ricardo
[descriptions] => Santso
[active] => s
[data] =>
)
- Agora vamos realmente registrar os dados no banco de dados, para isso substituiremos a seguinte linha de código dentro do arquivo "resources/view/cadastrar.php"
// Imprima os dados na tela
echo "<pre>";
print_r($objetoCadastrar);
echo "</pre>";
por
$objetoCadastrar->registrar();
- Criação da classe responsável pela conexão "app/Model/Connection/Database.php"
<?php
namespace App\Model\Connection;
use \PDO;
class Database {
/**
* Host de conexão
* @var string
*/
const HOST = 'localhost';
/**
* Nome do banco de dados
* @var string
*/
const NAME = "rsanttos";
/**
* Usuário do banco de dados
* @var string
*/
const USER = 'phpmyadmin';
/**
* Senha do banco de dados
* @var string
*/
const PASSWORD = 'B9118rss';
/**
* Nome da tabela no banco de dados
* @var string
*/
private $table;
/**
* Conexão usando PDO
* @var PDO
*/
private $connection;
/**
* Definindo a tabela e instanciar a conexão
* @param string
*/
public function __construct($table = null) {
$this->table = $table;
$this->setConnection();
}
/**
* Criando a conexão
*/
private function setConnection() {
try {
// Realizando conexão
$this->connection = new PDO(
'mysql:host='.self::HOST.';dbname='.self::NAME,
self::USER,self::PASSWORD
);
// Tratando algum erro na hora do registro
$this->connection->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION);
} catch (PDOException $err) {
// Não faça isso em produção, crie uma mensagem personalizada para o usuário e salve o erro em um log.
die('ERROR:'.$err->getMessage());
}
}
}
- Vamos importar nossa classe "Database.php" para dentro de "/app/Model/Crud/Cadastrar.php"
use \App\Model\Connection\Database;
- Vamos criar nosso método de "registrar()" dentro da classe "/app/Model/Crud/Cadastrar.php"
/**
* Método registrar();
* @return boolean
*/
public function registrar() {
// Definir data manualmente
$this->data = date('Y-m-d H:i:s');
// Inserir Dados
$objetoDatabase = new Database('vacancies');
$this->id = $objetoDatabase->insert([
'title' => $this->title,
'descriptions' => $this->descriptions,
'active' => $this->active,
'data' => $this->data
]);
return true;
}