Top.Mail.Ru
Ответы

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);
        }
    }
}

По дате
По рейтингу
Аватар пользователя
Тролль
2мес
Изменено
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');
    }




   



Видео по теме