#cakephp #cakephp-3.8
#cakephp #cakephp-3.8
Вопрос:
Я хочу создать страницу с забытым паролем в cakephp
Вот мой код пользовательского контроллера
<?php
namespace AppController;
use AppControllerAppController;
use CakeHttpExceptionUnauthorizedException;
use CakeMailerEmail;
use CakeMailerMailer;
use CakeemailTransportFactory;
use CakeAuthDefaultPasswordHasher;
use CakeUtilitySecurity;
use CakeORMTableRegistry;
use CakeCoreInstanceConfigTrait;
/**
Users Controller
@property AppModelTableUsersTable $Users
@method AppModelEntityUser[]|CakeDatasourceResultSetInterface paginate($object = null, array $settings = [])
*/
class UsersController extends AppController {
public function beforeFilter(CakeEventEvent $event) {
$this->Auth->allow([‘add’, ‘logout’]);
parent::beforeFilter($event);
}
/**
Index method
@return CakeHttpResponse|null
*/
public function index() {
if ($this->Auth->user(‘role’) != ‘admin’) {
throw new UnauthorizedException(__(‘You are not allowed to access this page’));
}
$users = $this->paginate($this->Users);
$this->set(compact(‘users’));
}
/**
View method
@param string|null $id User id.
@return CakeHttpResponse|null
@throws CakeDatasourceExceptionRecordNotFoundException When record not found.
*/
public function view($id = null) {
$user = $this->Users->get($id, [
‘contain’ => [],
]);
$this->set(‘user’, $user);
}
/**
Add method
@return CakeHttpResponse|null Redirects on successful add, renders view otherwise.
*/
public function add() {
if ($this->Auth->user(‘role’) != ‘admin’) {
throw new UnauthorizedException((‘You are not allowed to access this page’));
}
$user = $this->Users->newEntity();
if ($this->request->is(‘post’)) {
$user = $this->Users->patchEntity($user, $this->request->getData());
if ($this->Users->save($user)) {
$this->Flash->success((‘The user has been saved.’));
return $this->redirect(['action' => 'index']);
}
$this->Flash->error(__('The user could not be saved. Please, try again.'));
}
$this->set(compact(‘user’));
}
/**
Edit method
@param string|null $id User id.
@return CakeHttpResponse|null Redirects on successful edit, renders view otherwise.
@throws CakeDatasourceExceptionRecordNotFoundException When record not found.
*/
public function edit($id = null) {
if ($this->Auth->user(‘role’) != ‘admin’) {
throw new UnauthorizedException((‘You are not allowed to access this page’));
}
$user = $this->Users->get($id, [
‘contain’ => [],
]);
if ($this->request->is([‘patch’, ‘post’, ‘put’])) {
$user = $this->Users->patchEntity($user, $this->request->getData());
if ($this->Users->save($user)) {
$this->Flash->success((‘The user has been saved.’));
return $this->redirect(['action' => 'index']);
}
$this->Flash->error(__('The user could not be saved. Please, try again.'));
}
$this->set(compact(‘user’));
}
/**
Delete method
@param string|null $id User id.
@return CakeHttpResponse|null Redirects to index.
@throws CakeDatasourceExceptionRecordNotFoundException When record not found.
*/
public function delete($id = null) {
if ($this->Auth->user(‘role’) != ‘admin’) {
throw new UnauthorizedException((‘You are not allowed to access this page’));
}
$this->request->allowMethod([‘post’, ‘delete’]);
$user = $this->Users->get($id);
if ($this->Users->delete($user)) {
$this->Flash->success((‘The user has been deleted.’));
} else {
$this->Flash->error(__(‘The user could not be deleted. Please, try again.’));
}
return $this->redirect([‘action’ => ‘index’]);
}
public function forgotpassword()
{
if ($this->request->is(‘post’)) {
$email = $this->request->getData(‘email’);
$token = Security::hash(Security::randomBytes(25));
$userTable = TableRegistry::get(‘Users’);
if ($email == NULL) {
$this->Flash->error((‘Please insert your email address’));
}
if ($user = $userTable->find(‘all’)->where([‘email’=>$email])->first()) {
$user->token = $token;
if ($userTable->save($user)){
$mailer = new Mailer(‘default’);
$mailer->Transport(‘Smtp’);
$mailer->From([‘noreply[at]codethepixel.com’ => ‘myCake4’])
->setTo($email)
->setEmailFormat(‘html’)
->setSubject(‘Forgot Password Request’)
->deliver(‘Hello
Please click link below to reset your password
Reset Password’);
}
$this->Flash->success(‘Reset password link has been sent to your email (’.$email.’), please check your email’);
}
if ($total = $userTable->find(‘all’)->where([‘email’=>$email])->count()==0) {
$this->Flash->error((‘Email is not registered in system’));
}
}
}
public function resetpassword($token)
{
if($this->request->is(‘post’)){
$hasher = new DefaultPasswordHasher();
$newPass = $hasher->hash($this->request->getData(‘password’));
$userTable = TableRegistry::get(‘Users’);
$user = $userTable->find(‘all’)->where([‘token’=>$token])->first();
$user->password = $newPass;
if ($userTable->save($user)) {
$this->Flash->success(‘Password successfully reset. Please login using your new password’);
return $this->redirect([‘action’=>‘login’]);
}
}
}
public function login() {
if ($this->request->is(‘post’)) {
$user = $this->Auth->identify();
if ($user) {
if ($user[‘is_active’] === 1) {
$users = $this->Users->get($user[‘id’]);
$users->ip_address = $this->request->clientIp();
$users->last_login = date(‘Y-m-d h:i:s’);
if ($this->Users->save($users)) {
$this->Auth->setUser($user);
return $this->redirect($this->Auth->redirectUrl());
} else {
$this->Flash->error((‘Unable to login by your credentials.’));
}
} else {
$this->Flash->error((‘This user not activated, please contact our administrator.’));
}
}
$this->Flash->error(__(‘Invalid username or password, try again’));
}
}
public function logout() {
return $this->redirect($this->Auth->logout());
}
}
После открытия страницы «Забыли пароль» пользователь вводит свой адрес электронной почты после получения ошибки.
Не удается создать экземпляр абстрактного класса CakeMailerMailer
Как мне решить эту проблему, когда пользователь вводит свой адрес электронной почты, и пароль для сброса будет отправлен на электронную почту пользователя, которая будет сохранена в нашей базе данных.
Помогите мне, пожалуйста @ndm
Комментарии:
1. это код usercontroller.php
Ответ №1:
В вашем app.php
use CakeMailerTransportMailTransport;
.
.
.
'EmailTransport' => [
'default' => [
'className' => MailTransport::class,
/*
* The following keys are used in SMTP transports:
*/
'host' => 'localhost',
'port' => 25,
'timeout' => 30,
'username' => null,
'password' => null,
'client' => null,
'tls' => null,
'url' => env('EMAIL_TRANSPORT_DEFAULT_URL', null),
],
'your_project' => [
'className' => 'Smtp',
'host' => 'your_host',
'port' => XXX,
'timeout' => 30,
'username' => 'your_email',
'password' => 'your_password',
'client' => null,
'tls' => true,
'url' => env('EMAIL_TRANSPORT_DEFAULT_URL', null),
],
],
'Email' => [
'default' => [
'transport' => 'default',
'from' => 'you@localhost',
//'charset' => 'utf-8',
//'headerCharset' => 'utf-8',
],
'your_project' => [
'transport' => 'your_project',
'from' => ['your_email@teste.com' => 'My Site'],
//'charset' => 'utf-8',
//'headerCharset' => 'utf-8',
],
],
Создайте папку «Mailer» в src /Mailer. Создайте UserMailer.php файл
<?php
namespace AppMailer;
use CakeMailerMailer;
class UserMailer extends Mailer
{
public static $name = 'User';
public function reset($user)
{
$this->to($user->email)
->profile('your_project')
->emailFormat('html')
->template('your_project', 'user')
->layout('user')
->viewVars(['name' => $user->name])
->subject(sprintf('Welcome...', $user->name))
->message("texte...");
}
}
В этом случае я создал макет для своей электронной почты. Создайте папку «Email» в макете.
На вашем контроллере выполните следующие действия:
$this->getMailer('User')->send('reset', [$user]);
Не забудьте импортировать в контроллер:
use CakeMailerMailerAwareTrait;
Я использую его так.
Перейдите на панель управления godaddy и найдите информацию о SMTP. Это все, что вам нужно! Замените своей информацией
Комментарии:
1. Я использую ваши предложения в usercontroller.php amp; в настройках транспорта в app.php . после этого возникает ошибка: «Конфигурация транспорта «Smtp» не существует».
2. Не удалось преобразовать объект класса Cake Mailer Email в строку
3. «Отказано в подключении» и «Тайм-аут SMTP» обычно возникают из-за неправильных настроек: неверное имя хоста, номер порта, имя пользователя или пароль. Если вы используете GMail, это также может быть их настройка «небезопасных приложений», о которой вы можете узнать в Google больше информации.
4. Подскажите, пожалуйста, правильные настройки для gmail, настройка небезопасного приложения уже выполнена, и мой хостинг — общий хостинг godaddy. Спасибо за ваш ответ.
5. Какую версию cakephp вы используете?