С регистрацией было все норм, но после того как решил автоматически при регистрации давать пользователю роль что-то пошло не так. Собственно код:
SiteController
<?php
namespace MailerBundle\Controller;
use MailerBundle\Entity\User;
use MailerBundle\Form\UserType;
use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Symfony\Component\HttpFoundation\Request;
class SiteController extends Controller
{
/**
* @return \Symfony\Component\HttpFoundation\Response
*/
public function indexAction()
{
return $this->render('MailerBundle:Site:index.html.twig');
}
public function loginAction(Request $request)
{
$authenticationUtils = $this->get('security.authentication_utils');
$error = $authenticationUtils->getLastAuthenticationError();
$lastUsername = $authenticationUtils->getLastUsername();
return $this->render(
'MailerBundle:Site:login.html.twig', [
'last_username' => $lastUsername,
'error' => $error,
]
);
}
/**
* @param Request $request
* @return \Symfony\Component\HttpFoundation\Response
*/
public function signupAction(Request $request)
{
$user = new User();
$form = $this->createForm(new UserType(), $user);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
$password = $this->get('security.password_encoder')
->encodePassword($user, $user->getPassword());
$user->setPassword($password);
$em = $this->getDoctrine()->getManager();
$em->persist($user);
$em->flush();
return $this->redirectToRoute('email');
}
return $this->render(
'MailerBundle:Site:signup.html.twig', [
'form' => $form->createView()
]
);
}
}
Entity\User:
<?php
namespace MailerBundle\Entity;
use Doctrine\Common\Collections\ArrayCollection;
use Doctrine\ORM\Mapping as ORM;
use Symfony\Component\Security\Core\User\UserInterface;
/**
* @ORM\Table(name="user")
* @ORM\Entity
*/
class User implements UserInterface, \Serializable
{
/**
* @var integer
* @ORM\Column(name="id", type="integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
*/
private $id;
/**
* @var string
* @ORM\Column(name="name", type="string", length=255, unique=true)
*/
private $name;
/**
* @var string
* @ORM\Column(name="password", type="string", length=255)
*/
private $password;
/**
* @param string $password
*/
public function setPassword($password)
{
$this->password = $password;
}
/**
* @var array
*/
private $credentials;
/**
* @return array
*/
public function getCredentials()
{
return $this->credentials;
}
/**
* @param array $credentials
*/
public function setCredentials($credentials)
{
$this->credentials = $credentials;
}
/**
* User constructor.
*/
public function __construct()
{
$this->id = uniqid('user', true);
$this->credentials = ['ROLE_USER'];
}
/**
* @return string
*/
public function getName()
{
return $this->name;
}
/**
* @return int|string
*/
public function getId()
{
return $this->id;
}
/**
* @param $name
*/
public function setName($name)
{
$this->name = $name;
}
/**
* @return string
*/
public function toJson()
{
$result = json_encode([
$this->credential,
$this->name,
$this->id
]);
if (json_last_error()) {
trigger_error("Cannot encode json");
}
return $result;
}
/**
* Returns the roles granted to the user.
*
* <code>
* public function getRoles()
* {
* return array('ROLE_USER');
* }
* </code>
*
* Alternatively, the roles might be stored on a ``roles`` property,
* and populated in any number of different ways when the user object
* is created.
*
* @return (Role|string)[] The user roles
*/
public function getRoles()
{
return ['ROLE_USER'];
}
/**
* Returns the password used to authenticate the user.
*
* This should be the encoded password. On authentication, a plain-text
* password will be salted, encoded, and then compared to this value.
*
* @return string The password
*/
public function getPassword()
{
return null;
}
/**
* Returns the salt that was originally used to encode the password.
*
* This can return null if the password was not encoded using a salt.
*
* @return string|null The salt
*/
public function getSalt()
{
return null;
}
/**
* Returns the username used to authenticate the user.
*
* @return string The username
*/
public function getUsername()
{
return $this->name;
}
/**
* Removes sensitive data from the user.
*
* This is important if, at any given point, sensitive information like
* the plain-text password is stored on this object.
*/
public function eraseCredentials()
{
}
/**
* String representation of object
* @link http://php.net/manual/en/serializable.serialize.php
* @return string the string representation of the object or null
* @since 5.1.0
*/
public function serialize()
{
return serialize([
$this->id,
$this->name,
// implode(', ', $this->roles)
]);
}
/**
* Constructs the object
* @link http://php.net/manual/en/serializable.unserialize.php
* @param string $serialized <p>
* The string representation of the object.
* </p>
* @return void
* @since 5.1.0
*/
public function unserialize($serialized)
{
$unserialized = unserialize($serialized);
list(
$this->id,
$this->name
) =$unserialized;
// $this->roles = explode(', ', $unserialized['roles']);
}
}
UserRepository:
<?php
namespace MailerrBundle\Entity;
use Symfony\Component\Security\Core\Exception\UnsupportedUserException;
use Symfony\Component\Security\Core\User\UserInterface;
use Doctrine\ORM\EntityRepository;
use Symfony\Component\Security\Core\User\UserProviderInterface;
class UserRepository extends EntityRepository implements UserProviderInterface
{
public function loadUserByUsername($username)
{
return $this->createQueryBuilder('u')
->where('u.name = :name')
->setParameter('name', $username)
->getQuery()
->getOneOrNullResult();
}
public function refreshUser(UserInterface $user)
{
$class = get_class($user);
if (!$this->supportsClass($class)) {
throw new UnsupportedUserException(
sprintf(
'Instances of "%s" are not supported.',
$class
)
);
}
return $this->find($user->getId());
}
public function supportsClass($class)
{
return $this->getEntityName() === $class
|| is_subclass_of($class, $this->getEntityName());
}
}
securiity.yml:
security:
encoders:
MailerBundle\Entity\User:
algorithm: bcrypt
providers:
db_provider:
entity:
class: MailerBundle:User
property: name
firewalls:
main:
anonymous: ~
form_login:
login_path: login
check_path: login
target_path_parameter: email
provider: db_provider
access_control:
- { path: ^/email, roles: ROLE_USER }
Кому интересны вьюхи и формы, можно посмотреть здесь:
https://github.com/artemzakholodilo/murka