我有登记表。 当我保存用户时,我想在其他数据库表中添加行。第二个表用于角色,它只有两个字段:user_id和role_id。 这是我的数据库结构:
CREATE TABLE `roles` (
`id` INT(11) NOT NULL AUTO_INCREMENT,
`name` VARCHAR(255) NOT NULL COLLATE 'utf8_unicode_ci',
PRIMARY KEY (`id`),
UNIQUE INDEX `UNIQ_B63E2EC75E237E06` (`name`)
)
COLLATE='utf8_unicode_ci'
ENGINE=InnoDB
AUTO_INCREMENT=3
;
CREATE TABLE `users` (
`id` INT(11) NOT NULL AUTO_INCREMENT,
`userName` VARCHAR(255) NOT NULL COLLATE 'utf8_unicode_ci',
`password` VARCHAR(255) NOT NULL COLLATE 'utf8_unicode_ci',
`fullName` VARCHAR(255) NOT NULL COLLATE 'utf8_unicode_ci',
`email` VARCHAR(255) NOT NULL COLLATE 'utf8_unicode_ci',
PRIMARY KEY (`id`),
UNIQUE INDEX `UNIQ_1483A5E9586CA949` (`userName`),
UNIQUE INDEX `UNIQ_1483A5E9E7927C74` (`email`)
)
COLLATE='utf8_unicode_ci'
ENGINE=InnoDB
AUTO_INCREMENT=5
;
CREATE TABLE `user_roles` (
`user_id` INT(11) NOT NULL,
`role_id` INT(11) NOT NULL,
PRIMARY KEY (`user_id`, `role_id`),
INDEX `IDX_54FCD59FA76ED395` (`user_id`),
INDEX `IDX_54FCD59FD60322AC` (`role_id`),
CONSTRAINT `FK_54FCD59FA76ED395` FOREIGN KEY (`user_id`) REFERENCES `users` (`id`),
CONSTRAINT `FK_54FCD59FD60322AC` FOREIGN KEY (`role_id`) REFERENCES `roles` (`id`)
)
COLLATE='utf8_unicode_ci'
ENGINE=InnoDB
;
所以,这是我的UserController,我在那里保存用户:
namespace AppBundle\Controller;
use AppBundle\Entity\User;
use AppBundle\Form\UserType;
use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Component\Security\Core\Encoder\UserPasswordEncoderInterface;
class UserController extends Controller
{
/**
* @Route("/register", name="user_register")
* @param Request $request
* @param UserPasswordEncoderInterface $passwordEncoder
* @return \Symfony\Component\HttpFoundation\RedirectResponse|\Symfony\Component\HttpFoundation\Response
*/
public function registerAction(Request $request, UserPasswordEncoderInterface $passwordEncoder)
{
$user = new User();
$form = $this->createForm(UserType::class, $user);
$form->handleRequest($request);
if($form->isSubmitted() && $form->isValid()){
$password = $passwordEncoder->encodePassword($user,$user->getPlainPassword());
$user->setPassword($password);
$em = $this->getDoctrine()->getManager();
$em->persist($user);
$em->flush();
return $this->redirectToRoute("cat_index");
}
return $this->render('users/register.html.twig',
array('form' => $form->createView()));
}
}
我希望每个用户都拥有id = 1的角色。所以每个注册用户都会有ROLE_USER。 在我的实体用户中,我没有角色的设定者。我只是得到了。如何添加和设置正在检查id为1的角色并为用户设置角色? 这是我的用户实体:
<?php
namespace AppBundle\Entity;
use AppBundle\AppBundle;
use AppBundle\Controller\SecurityController;
use AppBundle\Repository\RoleRepository;
use Doctrine\Common\Collections\ArrayCollection;
use Doctrine\Common\Collections\Collection;
use Doctrine\ORM\Mapping as ORM;
use Symfony\Component\Security\Core\User\UserInterface;
use AppBundle\Entity\Role;
use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use AppBundle\Repository;
/**
* User
*
* @ORM\Table(name="users")
* @ORM\Entity(repositoryClass="AppBundle\Repository\UserRepository")
*/
class User implements UserInterface, \Serializable
{
/**
* @var int
*
* @ORM\Column(name="id", type="integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
*/
private $id;
/**
* @var string
*
* @ORM\Column(name="userName", type="string", length=255, unique=true)
*/
private $userName;
/**
* @var string
*/
private $plainPassword;
/**
* @var string
*
* @ORM\Column(name="password", type="string", length=255)
*/
private $password;
/**
* @var string
*
* @ORM\Column(name="fullName", type="string", length=255)
*/
private $fullName;
/**
* @var string
*
* @ORM\Column(name="email", type="string", length=255, unique=true)
*/
private $email;
/**
* @ORM\ManyToMany(targetEntity="AppBundle\Entity\Role")
* @ORM\JoinTable(name="user_roles",
* joinColumns={@ORM\JoinColumn(name="user_id", referencedColumnName="id")},
* inverseJoinColumns={@ORM\JoinColumn(name="role_id", referencedColumnName="id")})
* @var Collection|Role[]
*/
private $roles;
/**
* User constructor.
*/
public function __construct()
{
$this->roles = new ArrayCollection();
}
/**
* Get id
*
* @return int
*/
public function getId()
{
return $this->id;
}
/**
* Set userName
*
* @param string $userName
*
* @return User
*/
public function setUserName($userName)
{
$this->userName = $userName;
return $this;
}
/**
* Get userName
*
* @return string
*/
public function getUserName()
{
return $this->userName;
}
/**
* Set password
*
* @param string $password
*
* @return User
*/
public function setPassword($password)
{
$this->password = $password;
return $this;
}
/**
* Get password
*
* @return string
*/
public function getPassword()
{
return $this->password;
}
/**
* Set fullName
*
* @param string $fullName
*
* @return User
*/
public function setFullName($fullName)
{
$this->fullName = $fullName;
return $this;
}
/**
* Get fullName
*
* @return string
*/
public function getFullName()
{
return $this->fullName;
}
/**
* Set email
*
* @param string $email
*
* @return User
*/
public function setEmail($email)
{
$this->email = $email;
return $this;
}
/**
* Get email
*
* @return string
*/
public function getEmail()
{
return $this->email;
}
/**
* @return array
*/
public function getRoles()
{
$roles = [];
foreach ($this->roles as $role){
$roles[] = $role->getName();
}
if(empty($roles)){
$roles[] = 'ROLE_USER';
}
return $roles;
}
/**
* 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()
{
// TODO: Implement getSalt() method.
}
/**
* 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()
{
// TODO: Implement eraseCredentials() method.
}
public function serialize()
{
return serialize([
$this->getId(),
$this->getUserName(),
$this->getPassword()
]);
}
public function unserialize($serialized)
{
list(
$this->id,
$this->userName,
$this->password
) = unserialize($serialized);
}
/**
* @return string
*/
public function getPlainPassword(): string
{
return $this->plainPassword.'';
}
/**
* @param string $plainPassword
*/
public function setPlainPassword(string $plainPassword)
{
$this->plainPassword = $plainPassword;
}
}
我正在使用symfony 3 怎么做?谢谢!