【问题标题】:Symfony2 form trying to connect to DB on submissionSymfony2 表单尝试在提交时连接到数据库
【发布时间】:2015-01-23 00:15:55
【问题描述】:

我在 Symfony2 中有一个表单,用户在其中提交信用卡信息。表单最初呈现完美,但在提交时,我收到错误"An exception occured in driver: SQLSTATE[28000] [1045] Access denied for user 'root'@'localhost' (using password: NO)".

我的控制器动作代码:

<?php

/**
 * Class: PaymentController
 *
 * This controller is used to serve an iframe that contains a form for
 * a person's credit card information.
 *
 * @see Controller
 */
class PaymentController extends Controller
{
    /**
     * indexAction
     *
     * Display a form for a user to enter their credit card information
     *
     * @param Request $request
     */
    public function subscribeAction(Request $request)
    {
        $ccForm = new CreditCard();
        $form = $this->createForm(new CreditCardType(), $ccForm);

        //This function attempts to connect to DB on form submission 
        $form->handleRequest($request);
        //Never gets here

        if ($form->isValid()) {

        } 


        //render view here (this part works fine)
    }
}

我的问题是为什么$form-&gt;handleRequest($request) 会尝试连接到数据库?从堆栈跟踪来看,Validator 类似乎调用了 Doctrine ORM,并且它正在尝试连接到那里的数据库。我不希望它这样做,我只想将数据保存在内存中并使用它进行一些 API 调用。

我的实体类上没有元数据,这表明 Doctrine 应该尝试将其保存到数据库中。有什么想法吗?

编辑: 如果我从app/config/config.yml 中删除学说配置,如下所示,那么我可以在$form-isValid() 之后完美访问我的表单对象

# Doctrine Configuration
#doctrine:
#    dbal:
#        driver:   "%database_driver%"
#        host:     "%database_host%"
#        port:     "%database_port%"
#        dbname:   "%database_name%"
#        user:     "%database_user%"
#        password: "%database_password%"
#        charset:  UTF8
#        # if using pdo_sqlite as your database driver:
#        #   1. add the path in parameters.yml
#        #     e.g. database_path: "%kernel.root_dir%/data/data.db3"
#        #   2. Uncomment database_path in parameters.yml.dist
#        #   3. Uncomment next line:
#        #     path:     "%database_path%"
#
#    orm:
#        auto_generate_proxy_classes: false
#        auto_mapping: false

【问题讨论】:

    标签: php forms symfony doctrine


    【解决方案1】:

    如果您创建CreditCardType() 对象,它将调用您的实体,包括用于检查对象的原则和连接。您可以尝试像这样在控制器中手动创建表单:

    public function subscribeAction(Request $request)
    {
        $form = $this->createCreditCardForm();
        $form->handleRequest($request);
    
        if ($form->isValid()) {             
            $entity = $form->getData();
            // do what you want with the $entity
        } 
        //render view here 
    }
    
    private function createCreditCardForm()
    {
        return $this->createFormBuilder()->setAction($this->generateUrl('route_here_if_needed'))
            ->setMethod('GET')
            ->add('your_field', 'type')
            ->add('submit', 'submit')
            ->getForm()
        ;
    }
    

    如果你可以成功地做到这一点,那么你可以尝试修改你的类型而不创建CreditCardType()对象。

    【讨论】:

    • 你能澄清一下吗?创建 CreditCard() 对象会以某种方式调用 Doctrine?我按照symfony.com/doc/current/book/forms.html#creating-form-classes 的示例使表单可重用。它非常大 - 它包括一个国家字段和州字段,所以我不想让控制器混乱。
    • 对不起,我的意思是 CreditCardType() 对象。 (我编辑了它)你的类型不能变得模棱两可。如果您创建用于更新的类型,请插入(连接到数据库)。对于某些情况,您不能使其特殊以避免数据库连接(据我所知),除非您为这种情况创建另一种类型或特殊形式。我已经为您提供了一个如何从中检索数据的示例。 @IgorPantovic 解释得很好。
    • 因此,如果我在控制器中使用 $this->createForm() 表单并使用扩展 AbstractType 的类来构建我的表单,默认情况下它会尝试与数据库和 Doctrine 进行某种映射?文档中有这样的例子吗?
    • 不,只要您没有将任何字段或默认选项与自然将数据映射到数据库的实体连接起来。对不起,我找不到任何关于它的文档,也许你可以做一些研究。但是,只要您的表单通过createForm()createFormBuilder() 连接到使用您的实体的字段,它将需要数据库连接。您可以逐步了解其工作原理并弄清楚为什么需要数据库连接来使用您的实体在此处创建表单symfony.com/doc/current/book/doctrine.html
    • 阅读文档后,如果我什至没有将元数据添加到实体类以映射到数据库,我仍然不确定为什么它会强制建立数据库连接。将表单的创建与实体与数据库紧密结合起来似乎很奇怪。特别是因为所有文档都显示了您在提交后如何持久保存到数据库,但没有说明(我能找到)为什么在此之前需要数据库连接。感谢帮助。我将尝试您的版本,如果失败,然后 stackoverflow.com/a/14903672/1174374
    【解决方案2】:

    不,$form-&gt;handleRequest 没有明确连接到数据库does fire form events。根据您在 CreditCardType 上的子表单,其中一个可能正在连接到数据库。

    【讨论】:

    • 嗯,我没有附加任何表单事件。也没有子表单,只有一个带有 7 或 8 个字段和一个提交按钮的基本表单。
    • @CalebTaylor :在你的问题中包含完整的信息会更好;)
    • 对不起,我试图避免倾倒大量代码行。我希望这是一个容易识别的初学者 Symfony2 错误;)
    猜你喜欢
    • 2023-03-24
    • 1970-01-01
    • 2021-10-08
    • 2015-05-28
    • 2014-06-28
    • 2014-08-06
    • 1970-01-01
    • 2012-02-18
    • 1970-01-01
    相关资源
    最近更新 更多