0

我有这两种方法(创建和更新)的代码。每次我需要更新或创建新用户时,我都需要用盐对用户密码进行编码。

$factory = $this->get('security.encoder_factory');
$encoder = $factory->getEncoder($entity);
$password = $encoder->encodePassword($entity->getPassword(), $entity->getSalt());
$entity->setPassword($password);

为了避免代码重复,我应该怎么做?

  • 在控制器中创建一个新方法getEncondedPassword($entity) : return $encodedPassword
  • $encoder使用 DI 注入as required 字段将此逻辑添加到表单
  • 将此逻辑添加到模型中,并$encoder在实体对象的构造函数中传递。

谢谢!

4

3 回答 3

0

现在我已经改进了(我至少认为......)这个问题的答案。

我创建了一个类,它将接收来自 DI 的 $encoderFactory

#services.yml 
parameters:
    password_encoder.class: Beubi\SignatureBundle\Handler\PasswordEncoder
services:
    password_encoder:
            class: %password_encoder.class%
            arguments: [@security.encoder_factory]

因此,我创建了一个将在 Service 容器中使用的类:

class PasswordEncoder
{
    protected $encoderFactory;

    public function __construct(EncoderFactory $encoderFactory)
    {
        $this->encoderFactory = $encoderFactory;
    }

    public function encodePassword($entity){
        $encoder = $this->encoderFactory->getEncoder($entity);
        return $encoder->encodePassword($entity->getPassword(), $entity->getSalt());
    }
}

然后在我的控制器中:

$password = $this->get('password_encoder')->encodePassword($entity);
$entity->setPassword($password);

这样,我的 User 对象就不知道 $factoryEncoder 或如何编码密码。 我期待更多关于这个问题的评论......

于 2012-12-23T01:58:44.917 回答
0

我认为正确的选择是模型/实体方法。所以,我把我的解决方案留在这里:

public function hashPassword($container)
{
    $factory = $container->get('security.encoder_factory');

    $encoder = $factory->getEncoder($this);
    $password = $encoder->encodePassword($this->getPassword(), $this->getSalt());
    return $password;
}

在控制器中:

//hash user password
$userEntity->setPassword($userEntity->hashPassword($this->container));
于 2012-12-14T12:22:44.800 回答
0

如果您的创建和编辑相当简单且几乎相同,则可以将其组合成一个函数,该函数实际生成并验证表单。
一些代码:

class ProductController extends Controller
{
    /**
     * @Route("/create", name="_product_create")
     */
    public function createAction()
    {
        $product = new Product();

        return $this->productForm($product, $this->getRequest(), 'create');
    }

    /**
     * @Route("/edit/{product_id}", name="_product_edit_id")
     */
    public function editIdAction($product_id)
    {
        $entity_manager = $this->getDoctrine()->getEntityManager();
        $product_repository = $entity_manager->getRepository('VendorBundle:Product');

        $product = $product_repository->findOneBy(
            array('id' => $product_id)
        );

        return $this->productForm($product, $this->getRequest(), 'editId');
    }

    protected function productForm(Product $product, Request $request, $twig_name)
    {
        $form = $this->createForm(new ProductType(), $product);

        if ($request->getMethod() == 'POST') {
            $form->bindRequest($request);

            if ($form->isValid()) {
                // Do whatever we want before persisting/flushing

                return $this->redirect($redirect_url);
            }
        }

        $twig_params = array(

        );

        return $this->render(
            'VendorBundle:Product:' . $twig_name . '.html.twig', $twig_params
        );
    }

}

这将呈现create.html.twigeditId.html.twig取决于路线。
如果$product->getId() === null我们正在创建一个新实体,否则我们正在编辑。

于 2012-12-13T22:37:44.073 回答