从Blade向控制器传递数组:访问元素时未定义索引


Passing an array from Blade to controller: Undefined index when accessing elements

我试图从刀片模板传递一个数组(源自自定义配置文件)到控制器将其处理成一个表单字段。配置数组应该像一个'模板',这样可以通过修改配置文件轻松创建表单。

虽然传递数组似乎工作,但我不可能访问它的元素(未定义索引)。

(部分)配置文件

return [
    'tabs' => [
        'Menu'     => [
            'name'    => 'menu',
            'type'    => 'string',
            'length'  => 100,
            'default' => null
        ],
        ...
    ]
]

在我的刀片模板中,我迭代这个数组调用控制器函数:

@foreach($tabs as $key => $fld)
    {!! 'App'Classes'Fields::createField($key, $fld, $page) !!}
@endforeach

简化后的控制器:

class Fields
{
    public static function createField($key, $fld, $page)
    {
        var_dump($fld);
        // Result-------------------------------
        // array (size=4)
        //   'name' => string 'menu' (length=4)
        //   'type' => string 'string' (length=6)
        //   'length' => int 100
        //   'default' => null        }
        var_dump($fld['name']);
        // Result-------------------------------    
        // ErrorException in Fields.php line 19: 
        // Undefined index: name
        // (The other elements also can't be accessed)
}

我真的不明白。Var_dump显示一个有效的数组,但它的元素不能被访问。我一连好几个小时都在坐立不安。这是Laravel的bug还是我自己的bug ?: -)

您是否尝试过在createField()方法中循环$fld数组以查看结果?这可以让你对这个bug有一点了解…

叶片

    @foreach($tabs as $key => $fld)
        {!! 'App'Classes'Fields::createField($key, $fld, $page) !!}
    @endforeach
<<p> 简化控制器/strong>
<?php
    class Fields {

        public static function createField($key, $fld, $page){
            // JUST FOR DEBUGGING PURPOSES: TRY THIS & SEE WHAT YOU GET.
            // BUT CHECK FIRST IF $fld IS AN ARRAY
            if( is_array($fld) ){
                foreach($fld as $key=>$value){    
                    var_dump($key);
                    var_dump($value);
                }
            }else{
                // OTHERWISE, TRY DETERMINING THE TYPE OF $fld
                var_dump("'$fld IS AN OBJECT? ", is_object($fld));
                var_dump("'$fld IS A  STRING? ", is_string($fld));
            }
            var_dump($fld);
            var_dump($fld['name']);
        }
    }

    <?php
        class Fields {
            public static function createField($key, $fld, $page){
                // CREATE VARIABLES FOR EACH EXPECTED VALUE(S):
                // INITIALIZE THEM TO NULL...
                $name = $type = $length = $default = null;
                // JUST FOR DEBUGGING PURPOSES: TRY THIS & SEE WHAT YOU GET.
                // BUT CHECK FIRST IF $fld IS AN ARRAY
                if( is_array($fld) ){
                    foreach($fld as $key=>$value){
                        switch($key){
                            case "name":
                                $name       = $value;
                                break;
                            case "type":
                                $type       = $value;
                                break;
                            case "length":
                                $length     = $value;
                                break;
                            case "default":
                                $default    = $value;
                                break;                          
                        }                           
                    }
                }
                echo $name;
                echo $type;
                echo $length;
                echo $default;
            }
        }