0

このコードを 2 つのメソッド (作成と更新) で使用しています。新しいユーザーを更新または作成する必要があるたびに、ユーザーのパスワードをソルトでエンコードする必要があります。

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

コードの重複を避けるにはどうすればよいですか?

  • コントローラーに新しいメソッドを作成するgetEncondedPassword($entity) : return $encodedPassword
  • DI を使用してフォームにこのロジックを追加し、$encoder必要に応じてフィールドを挿入します。
  • このロジックをモデルに追加し$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

作成と編集が非常に単純でほとんど同じである場合は、実際にフォームを生成して検証する 1 つの関数に組み合わせることができます。
いくつかのコード:

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.twigこれはルートにeditId.html.twig応じてレンダリングされます。新しいエンティティを作成している
場合は、編集しています。$product->getId() === null

于 2012-12-13T22:37:44.073 に答える