Просмотр файла app/Controllers/UserController.php

Размер файла: 6.93Kb
  1. <?php
  2.  
  3. declare(strict_types=1);
  4.  
  5. namespace App\Controllers;
  6.  
  7. use App\Models\User;
  8. use App\Repositories\UserRepository;
  9. use App\Services\Session;
  10. use App\Services\Validator;
  11. use App\Services\View;
  12. use Psr\Http\Message\ResponseInterface as Response;
  13. use Psr\Http\Message\ServerRequestInterface as Request;
  14.  
  15. /**
  16. * UserController
  17. */
  18. class UserController extends Controller
  19. {
  20. public function __construct(
  21. protected View $view,
  22. protected Session $session,
  23. protected Validator $validator,
  24. protected UserRepository $userRepository,
  25. ) {}
  26.  
  27. /**
  28. * Login
  29. *
  30. * @param Request $request
  31. * @param Response $response
  32. *
  33. * @return Response
  34. */
  35. public function index(Request $request, Response $response): Response
  36. {
  37. $users = $this->userRepository->getUsers(setting('user.per_page'));
  38.  
  39. return $this->view->render(
  40. $response,
  41. 'users/index',
  42. compact('users')
  43. );
  44. }
  45.  
  46. /**
  47. * Login
  48. *
  49. * @param Request $request
  50. * @param Response $response
  51. *
  52. * @return Response
  53. */
  54. public function login(Request $request, Response $response): Response
  55. {
  56. if ($request->getMethod() === 'POST') {
  57. $input = (array) $request->getParsedBody();
  58.  
  59. $this->validator->required(['login', 'password']);
  60.  
  61. if ($this->validator->isValid($input)) {
  62. $user = User::query()->where('login', $input['login'])->first();
  63.  
  64. if ($user && password_verify($input['password'], $user->password)) {
  65. $this->session->set('login', $user->login);
  66. $this->session->set('password', $user->password);
  67. $this->session->set('flash', ['success' => 'Вы успешно авторизованы!']);
  68.  
  69. // @TODO remember
  70. $options = [
  71. 'expires' => strtotime('+1 year'),
  72. 'path' => '/',
  73. 'domain' => setting('session.cookie_domain'),
  74. 'secure' => setting('session.cookie_secure'),
  75. 'httponly' => setting('session.cookie_httponly'),
  76. 'samesite' => setting('session.cookie_samesite'),
  77. ];
  78. setcookie('login', $user->login, $options);
  79. setcookie('password', $user->password, $options);
  80.  
  81. return $this->redirect($response, '/');
  82. }
  83.  
  84. $this->validator->addError('login', 'Неверный логин или пароль');
  85. }
  86.  
  87. $this->session->set('flash', ['errors' => $this->validator->getErrors(), 'old' => $input]);
  88.  
  89. return $this->redirect($response, '/login');
  90. }
  91.  
  92. return $this->view->render(
  93. $response,
  94. 'users/login',
  95. );
  96. }
  97.  
  98. /**
  99. * Register
  100. *
  101. * @param Request $request
  102. * @param Response $response
  103. *
  104. * @return Response
  105. */
  106. public function register(Request $request, Response $response): Response
  107. {
  108. if ($request->getMethod() === 'POST') {
  109. $input = (array) $request->getParsedBody();
  110.  
  111. $this->validator->required(['captcha', 'login', 'password', 'password2', 'email'])
  112. ->same('captcha', $this->session->get('captcha'), 'Не удалось пройти проверку captcha!')
  113. ->length('login', 3, 20)
  114. ->regex('login', '|^[a-z0-9\-]+$|i')
  115. ->email('email')
  116. ->minLength(['password', 'password2'], 6)
  117. ->equal('password', 'password2');
  118.  
  119. $userExists = User::query()->where('login', 'lax', $input['login'])->first();
  120. if ($userExists) {
  121. $this->validator->addError('login', 'Данный логин уже занят');
  122. }
  123.  
  124. $emailExists = User::query()->where('email', 'lax', $input['email'])->first();
  125. if ($emailExists) {
  126. $this->validator->addError('email', 'Данный email уже используется');
  127. }
  128.  
  129. if ($this->validator->isValid($input)) {
  130. $password = password_hash($input['password'], PASSWORD_BCRYPT);
  131. User::query()->create([
  132. 'login' => sanitize($input['login']),
  133. 'password' => $password,
  134. 'email' => strtolower($input['email']),
  135. 'role' => User::USER,
  136. 'created_at' => time(),
  137. ]);
  138.  
  139. $this->session->set('login', $input['login']);
  140. $this->session->set('password', $password);
  141. $this->session->set('flash', ['success' => 'Вы успешно зарегистрировались!']);
  142.  
  143. return $this->redirect($response, '/');
  144. }
  145.  
  146. $this->session->set('flash', ['errors' => $this->validator->getErrors(), 'old' => $input]);
  147.  
  148. return $this->redirect($response, '/register');
  149. }
  150.  
  151. return $this->view->render(
  152. $response,
  153. 'users/register',
  154. );
  155. }
  156.  
  157. /**
  158. * Logout
  159. *
  160. * @param Request $request
  161. * @param Response $response
  162. *
  163. * @return Response
  164. */
  165. public function logout(Request $request, Response $response): Response
  166. {
  167. $input = (array) $request->getParsedBody();
  168.  
  169. $this->validator
  170. ->required('csrf')
  171. ->same('csrf', $this->session->get('csrf'), 'Неверный идентификатор сессии, повторите действие!');
  172.  
  173. if ($this->validator->isValid($input)) {
  174. $this->session->delete('login');
  175. $this->session->delete('password');
  176.  
  177. $options = [
  178. 'expires' => strtotime('-1 hour'),
  179. 'path' => '/',
  180. 'domain' => setting('session.cookie_domain'),
  181. 'secure' => setting('session.cookie_secure'),
  182. 'httponly' => setting('session.cookie_httponly'),
  183. 'samesite' => setting('session.cookie_samesite'),
  184. ];
  185. setcookie('password', '', $options);
  186.  
  187. $this->session->set('flash', ['success' => 'Вы успешно вышли!']);
  188. } else {
  189. $this->session->set('flash', ['errors' => $this->validator->getErrors()]);
  190. }
  191.  
  192. return $this->redirect($response, '/');
  193. }
  194.  
  195. /**
  196. * User
  197. *
  198. * @param string $login
  199. * @param Response $response
  200. *
  201. * @return Response
  202. */
  203. public function user(string $login, Response $response): Response
  204. {
  205. $user = User::query()->where('login', $login)->first();
  206.  
  207. if (! $user) {
  208. abort(404, 'Пользователь не найден!');
  209. }
  210.  
  211. return $this->view->render(
  212. $response,
  213. 'users/user',
  214. compact('user')
  215. );
  216. }
  217. }