簡體   English   中英

形式從 symfony2.8 升級到 3.0 時向后兼容性中斷

[英]Backward compatibility breaks in forms upgrading from symfony2.8 to 3.0

因此,我一直拖着腳步從 symfony 2.8 升級到 3.0(或實際上是現在的目標 3.4)與之前的一些小更新一樣麻煩。 有些框架就是喜歡強迫你重寫代碼,我猜......

無論如何,我知道這已在許多其他帖子中得到處理,但我想讓它萬無一失,就像“傻瓜的 symfony 表單”將您的表單從 symfony 2.8 移動到 3.0 一樣。

如果您通過 app_dev.php 運行您的應用程序,您會在頁腳中獲得關於不推薦使用的內容的很好的提示,換句話說,哪些內容在 3.0 版中不起作用。

此特定問題的棄用消息是:

將類型實例傳遞給 FormBuilder::add()、Form::add() 或 FormFactory 已從 2.8 版開始被棄用,並且在 3.0 中將不受支持。 改用完全限定的類型類名

我必須對表單做的第一件事是更改從控制器調用它們的方式。 symfony 文檔滿意地說:

前:

$form = $this->createForm(new MyType());

后:

$form = $this->createForm(MyType::class);

但是等等,那么我如何傳遞我的變量? 我的表單調用看起來更像這樣:

$form = $this->createForm(new extraOpeningType($user), $extraOpening);

我傳遞了與表單匹配的實體,以及用於許可目的的附加實體。 對於 Sensiolabs 的優秀變更日志人員來說,這個問題甚至不足以對其發表評論。

其他人注意到了這一點並在這里寫了一個問題( https://github.com/symfony/symfony/issues/18662 ),盡管他的示例代碼中有一個或兩個錯字。 這里還有一篇 SO 文章( Passing data to buildForm() in Symfony 2.8, 3.0 and above )對解決這個問題非常有幫助。

所以就我而言,在 symfony3.0 之前的版本中,我曾經這樣調用表單:

$form = $this->createForm(new extraOpeningType($user), $extraOpening);

$user 是我在表單數據中出於權限處理目的而傳入的變量,而 $extraOpening 是與表單匹配的實際實體。 從現在開始,您現在必須通過以下方式傳遞這些變量:

use ExtraOpeningBundle\Form\ExtraOpeningType as extraOpeningType; //this goes in the controller head, among your USE statements
...
$form = $this->createForm(extraOpeningType::class, $extraOpening, ['user' => $user]);

如果你不想在頭部使用 USE 語句,你可以把完全限定的路徑放到你的 Type 中,像這樣(注意 Type 路徑上的前導反斜杠):

$form = $this->createForm(\ExtraOpeningBundle\Form\ExtraOpeningType::class, $extraOpening, ['user' => $user]);

在接收方,在您的表單中(類型,如 symfony 所稱),您之前有一個構造函數來拉入傳遞的變量......

class ExtraOpeningType extends AbstractType
{
    function __construct($user)
    {
        $this->user = $user;
    }

    /**
     * {@inheritdoc}
     */
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $user = $this->user;

現在它看起來像這樣:

class ExtraOpeningType extends AbstractType
{
    /**
     * {@inheritdoc}
     */
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $this->user = $options['user'];  

盡管您需要將剛剛創建的這個自定義選項添加到批准的選項列表中,否則您將面臨一個錯誤,指出“用戶”不是一個有效的選項。 因此,修改您的 configureOptions 方法如下(如果您尚未使用該方法,請創建該方法):

class ExtraOpeningType extends AbstractType
{

...

    /**
     * {@inheritdoc}
     */
    public function configureOptions(OptionsResolver $resolver)
    {
        $resolver->setDefaults(array(
            'user' => null
        ));
    }

Symfony 通常是一個夢想,但在更新時它可能是一場噩夢。 許多向后兼容性中斷。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM