Slim4 как поченить response
123456789101112131415161718192021222324252627282930313233
<?php
namespace App\Controllers;
use Psr\Http\Message\ResponseInterface as Response;
use Psr\Http\Message\ServerRequestInterface as Request;
use PDO;
class CategoryController
{
private $db;
public function __construct(PDO $db)
{
$this->db = $db;
}
public function index(Request $request, Response $response): Response
{
// Выбираем только нужные поля согласно ТЗ
$stmt = $this->db->query("SELECT id, name FROM categories");
$categories = $stmt->fetchAll(PDO::FETCH_ASSOC);
// Формируем JSON ответ
$response->getBody()->write(json_encode([
'data' => $categories
]));
return $response
->withHeader('Content-Type', 'application/json')
->withStatus(200);
}
}123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191
<?php
namespace App\Controllers;
use Psr\Http\Message\ResponseInterface as Response;
use Psr\Http\Message\ServerRequestInterface as Request;
use PDO;
class AuthController
{
private $db;
public function __construct(PDO $db)
{
$this->db = $db;
}
/**
* Универсальный хелпер для отправки JSON-ответов
*/
private function jsonResponse(Response $response, array $data, int $status = 200): Response
{
$payload = json_encode($data, JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT);
$response->getBody()->write($payload);
return $response
->withHeader('Content-Type', 'application/json')
->withStatus($status);
}
/**
* Регистрация нового пользователя
*/
public function register(Request $request, Response $response): Response
{
$data = (array) ($request->getParsedBody() ?? []);
$name = trim($data['name'] ?? '');
$phone = trim($data['phone'] ?? '');
$email = trim($data['email'] ?? '');
$password = $data['password'] ?? '';
if (!$name || !$phone || !$email || !$password) {
return $this->jsonResponse($response, [
'error' => 'The request body is not valid',
'details' => 'Name, phone, email and password are required'
], 422);
}
if (!filter_var($email, FILTER_VALIDATE_EMAIL)) {
return $this->jsonResponse($response, ['error' => 'Invalid email format'], 422);
}
$stmt = $this->db->prepare("SELECT id FROM users WHERE phone = ? OR email = ?");
$stmt->execute([$phone, $email]);
if ($stmt->fetch()) {
return $this->jsonResponse($response, ['error' => 'User with this phone or email already exists'], 409);
}
$hash = password_hash($password, PASSWORD_DEFAULT);
$stmt = $this->db->prepare("INSERT INTO users (name, phone, email, password, role) VALUES (?, ?, ?, ?, 'user')");
try {
$stmt->execute([$name, $phone, $email, $hash]);
} catch (\PDOException $e) {
return $this->jsonResponse($response, ['error' => 'Database error: ' . $e->getMessage()], 500);
}
return $this->jsonResponse($response, ['message' => 'User registered successfully'], 201);
}
/**
* Авторизация и выдача токена
*/
public function login(Request $request, Response $response): Response
{
$data = (array) ($request->getParsedBody() ?? []);
$login = trim($data['email'] ?? $data['login'] ?? '');
$password = $data['password'] ?? '';
if (!$login || !$password) {
return $this->jsonResponse($response, ['error' => 'Login and password are required'], 422);
}
// 1. Поиск пользователя
$stmt = $this->db->prepare("SELECT * FROM users WHERE phone = ? OR email = ?");
$stmt->execute([$login, $login]);
$user = $stmt->fetch(PDO::FETCH_ASSOC);
// 2. Проверка пароля
if (!$user || !password_verify($password, $user['password'])) {
return $this->jsonResponse($response, ['error' => 'Invalid login or password'], 401);
}
// 3. Генерация токена
$token = bin2hex(random_bytes(32));
$expires = date('Y-m-d H:i:s', strtotime('+30 days'));
// 4. Сохранение в tokens
$stmt = $this->db->prepare("INSERT INTO tokens (user_id, token, expires_at) VALUES (?, ?, ?)");
$stmt->execute([$user['id'], $token, $expires]);
// 5. Ответ: Теперь включает объект 'user' для фронтенда!
return $this->jsonResponse($response, [
'token' => $token,
'user' => [
'id' => (int) $user['id'],
'name' => $user['name'],
'phone' => $user['phone'],
'email' => $user['email'],
'role' => $user['role'] // Передаем роль (user/moderator)
]
]);
}
/**
* Получение данных о текущем пользователе (через Middleware)
*/
public function me(Request $request, Response $response): Response
{
// Middleware уже нашел пользователя и положил его в атрибуты запроса
$user = $request->getAttribute('user');
if (!$user) {
return $this->jsonResponse($response, ['error' => 'Unauthorized: User not found'], 401);
}
return $this->jsonResponse($response, [
'id' => (int) $user['id'],
'name' => $user['name'],
'email' => $user['email'],
'role' => $user['role']
]);
}
public function updateProfile(Request $request, Response $response): Response
{
// 1. Получаем текущего пользователя из Middleware (как и в методе me)
$user = $request->getAttribute('user');
if (!$user) {
return $this->jsonResponse($response, ['error' => 'Unauthorized: Пользователь не найден'], 401);
}
$userId = (int) $user['id'];
// 2. Получаем данные из тела запроса
$data = (array) ($request->getParsedBody() ?? []);
if (empty($data) && !empty($_POST))
$data = $_POST;
// Берем новые значения
$name = trim($data['name'] ?? '');
$email = trim($data['email'] ?? '');
$phone = trim($data['phone'] ?? '');
// 3. Валидация (Критично для WorldSkills!)
if (empty($name) || empty($email) || empty($phone)) {
return $this->jsonResponse($response, ['error' => 'Имя, Email и Телефон обязательны'], 422);
}
if (!filter_var($email, FILTER_VALIDATE_EMAIL)) {
return $this->jsonResponse($response, ['error' => 'Некорректный формат E-mail'], 422);
}
try {
// 4. Обновляем данные в базе
// Важно: в SQL используем phone, который мы восстановили в базе
$stmt = $this->db->prepare("UPDATE users SET name = ?, email = ?, phone = ? WHERE id = ?");
$stmt->execute([$name, $email, $phone, $userId]);
return $this->jsonResponse($response, [
'message' => 'Профиль успешно обновлен',
'user' => [
'id' => $userId,
'name' => $name,
'email' => $email,
'phone' => $phone
]
]);
} catch (\PDOException $e) {
// Если E-mail уже занят другим пользователем
if ($e->getCode() == 23000) {
return $this->jsonResponse($response, ['error' => 'Этот E-mail уже используется'], 409);
}
return $this->jsonResponse($response, ['error' => 'Ошибка сервера при обновлении'], 500);
}
}
}По дате
По рейтингу
12345678910111213141516171819202122232425262728
<?php
namespace App\Controllers;
use PDO;
use Psr\Http\Message\ResponseInterface as Response;
use Psr\Http\Message\ServerRequestInterface as Request;
use Slim\Psr7\UploadedFile;
class AdvertController
{
private PDO $db;
public function __construct(PDO $db)
{
$this->db = $db;
}
private function json(Response $res, $data, int $status = 200): Response
{
$res->getBody()->write(json_encode($data, JSON_UNESCAPED_UNICODE));
return $res->withStatus($status)->withHeader('Content-Type', 'application/json');
}
Видео по теме