Criação de posts no feed
Planejamento Arquitetural do Sistema
-
View (profile.php):
-
Exibe um formulário para o usuário fazer upload de uma foto para o feed.
-
O formulário é exibido apenas para o próprio usuário (não para outros usuários).
-
O formulário envia os dados para o controller (upload-feed.php) via método POST.
-
-
Controller (upload-feed.php):
-
Recebe os dados do formulário (arquivo de imagem).
-
Valida e processa o upload da imagem.
-
Chama o DAO para persistir os dados no banco.
-
-
DAO (posts-dao.php):
- Executa a query SQL para inserir o post no banco de dados.
Na prática
Arquivo: t06-crud-php/view/profile.php
<!-- Formulário de upload de foto (apenas para o próprio usuário) -->
<?php if ((int)$user_id === (int)$logged_in_user_id): ?>
<div class="upload-container">
<form
action="<?= BASE_URL ?>src/controllers/posts/upload-feed-photo.php"
method="POST"
enctype="multipart/form-data"
>
<label for="photo">
<img src="<?= BASE_URL ?>public/img/add-photo.svg" class="icon" /> <br />
Adicionar foto
</label>
<input type="file" id="photo" name="photo" accept="image/*" />
<button type="submit" class="btn-upload">Enviar</button>
</form>
</div>
<?php endif; ?>
-
Responsabilidade:
-
Exibe um formulário para upload de fotos no feed.
-
O formulário só é exibido se o usuário logado estiver visualizando seu próprio perfil.
-
O formulário envia o arquivo para o controller (
upload-feed.php
) via POST.
-
Arquivo: src/controllers/posts/upload-feed.php
<?php
session_start();
require_once __DIR__ . "/../../dao/posts-dao.php";
require_once __DIR__ . "/../../../dir-config.php";
require_once __DIR__ . "/../../utils/upload-handler.php";
if (!isset($_SESSION['user_id'], $_SESSION['user_name'])) {
header("Location: " . BASE_URL . "view/login.php");
exit;
}
$user_id = $_SESSION['user_id'];
$postsDao = new PostsDao();
if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_FILES['photo'])) {
$uploadDir = '../../../uploads/feed/';
$allowedTypes = ['jpg', 'jpeg', 'png', 'gif'];
$dbUpdateCallback = function ($photoUrl) use ($user_id, $postsDao) {
return $postsDao->createPost($user_id, $photoUrl);
};
$uploadResult = UploadHandler::handleUpload($_FILES['photo'], $uploadDir, $allowedTypes, $dbUpdateCallback);
if ($uploadResult['success']) {
$_SESSION['success'] = "Foto do feed atualizada com sucesso!";
} else {
$_SESSION['error'] = $uploadResult['error'];
}
header("Location: " . BASE_URL . "view/profile.php");
exit;
}
?>
-
Responsabilidade:
-
Inicia a sessão e verifica se o usuário está logado.
-
Recebe o arquivo enviado pelo formulário
($\_FILES['photo'])
. -
Define o diretório de upload e os tipos de arquivo permitidos.
-
Utiliza o
UploadHandler
para processar o upload da imagem. -
Após o upload bem-sucedido, chama o método
createPost
do DAO para inserir o post no banco de dados. -
Redireciona o usuário de volta para a página de perfil com uma mensagem de sucesso ou erro.
-
Arquivo: src/dao/posts-dao.php
public function createPost($userId, $photo_url) {
$sql = "INSERT INTO posts (user_id, photo_url) VALUES (:userId, :photo_url)";
$stmt = $this->db->prepare($sql);
return $stmt->execute([':userId' => $userId, ':photo_url' => $photo_url]);
}
-
Responsabilidade:
-
Executa a query SQL para inserir um novo post na tabela
posts
. -
Recebe o ID do usuário e a URL da foto como parâmetros.
-
Retorna
true
se a inserção for bem-sucedida.
-
Arquivo: src/utils/upload-handler.php
public static function handleUpload($file, $uploadDir, $allowedTypes, $dbUpdateCallback) {
if (!is_dir($uploadDir)) {
mkdir($uploadDir, 0777, true);
}
$fileType = strtolower(pathinfo($file['name'], PATHINFO_EXTENSION));
if (!in_array($fileType, $allowedTypes)) {
return ['success' => false, 'error' => "Apenas arquivos " . implode(", ", $allowedTypes) . " são permitidos."];
}
$fileName = uniqid() . '_' . basename($file['name']);
$targetFile = $uploadDir . $fileName;
if (move_uploaded_file($file['tmp_name'], $targetFile)) {
$photoUrl = $fileName;
$dbUpdateResult = $dbUpdateCallback($photoUrl);
if ($dbUpdateResult) {
return ['success' => true, 'photoUrl' => $photoUrl];
} else {
return ['success' => false, 'error' => "Erro ao atualizar o banco de dados."];
}
} else {
return ['success' => false, 'error' => "Erro ao fazer upload da imagem."];
}
}
-
Responsabilidade:
-
Valida o tipo de arquivo e move o arquivo para o diretório de upload.
-
Gera um nome único para o arquivo.
-
Chama o callback (
$dbUpdateCallback
) para atualizar o banco de dados com a URL da foto. -
Retorna um array com o status do upload e a URL da foto (em caso de sucesso) ou uma mensagem de erro.
-
Fluxo Completo
-
O usuário acessa a página de perfil (
profile.php
) e vê o formulário de upload de foto (se for o próprio perfil). -
O usuário seleciona uma imagem e clica em "Enviar".
-
O formulário envia a imagem para o controller (
upload-feed.php
). -
O controller processa o upload da imagem usando o
UploadHandler
. -
Após o upload, o controller chama o método
createPost
do DAO para inserir o post no banco de dados. -
O usuário é redirecionado de volta para a página de perfil com uma mensagem de sucesso ou erro.