Php 无法访问细枝上的雄辩属性

Php 无法访问细枝上的雄辩属性,php,eloquent,twig,slim,Php,Eloquent,Twig,Slim,我正在尝试使用Slim中的Twig访问一个有说服力的属性,但得到了一个错误 我有一个字段和一个类型对象,关系如下 class Field extends \Illuminate\Database\Eloquent\Model { protected $table = 'fields'; public function type() { return $this->belongsTo('models\Type'); } 当执行{{f}}(作为一个字段)时,输出如下: {"fie

我正在尝试使用Slim中的Twig访问一个有说服力的属性,但得到了一个错误

我有一个字段和一个类型对象,关系如下

class Field extends \Illuminate\Database\Eloquent\Model {

protected $table = 'fields';

public function type()
{
    return $this->belongsTo('models\Type');
}
当执行
{{f}}
(作为一个字段)时,输出如下:

{"field_id":"1","field_name":"Your name","form_id":"2","type_id":"1","placeholder":"Please give us your name"}
当执行
{{f.type}}
时,结果是:

消息:在第97行的“pages/editform.html”中呈现模板(“类对象Illumb\Database\Eloquent\Relations\BelongsTo无法转换为字符串”)时引发异常

如果我尝试执行
{{f.type.name}
,不会抛出异常,但也不会打印任何内容

如果我用PHP做的话

    $fields = $form->fields;
    var_dump($fields[0]->type->name);
该值得到正确的输出

有什么想法吗?,
谢谢

我也有同样的问题,偶然发现了这个问题。我自己解决了之后,我想我会尽力帮你的

尝试在模型上执行快速加载:

Field::with('type')->get()
这将允许您在没有其他问题的情况下执行以下操作

{{ f.type }}

请参阅此处的更多信息:

如果您不想进行快速加载,您可以覆盖
字段
类中的magic
\uu isset
方法,以返回
类型
关系属性的
true

public function __isset($name)
{
    if (in_array($name, [
        'type'
    ])) {
        return true;
    } else {
        return parent::__isset($name);
    }
}
解释

问题在于Eloquent如何实现关系的“动态属性”(在您的例子中为
f.type
),以及Twig用于访问变量“属性”的规则之间的交互

从Twig文档中:

为了方便起见,
foo.bar
在PHP层上执行以下操作:

  • 检查
    foo
    是否为数组和
    bar
    是否为有效元素
  • 如果不是,并且如果
    foo
    是一个对象,请检查
    bar
    是否为有效属性
  • 如果不是,并且如果
    foo
    是一个对象,请检查
    bar
    是否是有效的方法(即使
    bar
    是构造函数-使用
    \u construct()
  • 如果不是,并且如果
    foo
    是对象,请检查
    getBar
    是否为有效方法
  • 如果不是,并且如果
    foo
    是一个对象,请检查
    isBar
    是否为有效方法
  • 如果不是,则返回空值
另一方面,foo['bar']仅适用于PHP数组:

  • 检查
    foo
    是否为数组和
    bar
    是否为有效元素
  • 如果不是,则返回空值
这里的关键是它说“检查酒吧是一个有效的属性”的部分。这意味着在PHP级别上,Twig正在
$f->type
上调用
isset
。雄辩,所以你可能认为这不会是个问题

但是,请看一下它是如何实际实现模型关系的
\uu isset

/**
 * Determine if an attribute exists on the model.
 *
 * @param  string  $key
 * @return bool
 */
public function __isset($key)
{
    return (isset($this->attributes[$key]) || isset($this->relations[$key])) ||
            ($this->hasGetMutator($key) && ! is_null($this->getAttributeValue($key)));
}
它通过查看已加载关系的数组(
isset($this->relations[$key])
)来确定关系是否已“设置”。问题是如果
类型
尚未加载,Eloquent会说它未“设置”

因此,当Twig查看
$f->type
时,它会认为
type
不是有效的属性,并继续下一个规则:

…如果
foo
是对象,请检查
bar
是否为有效方法

现在,它将查找找到的方法
type()
。唯一的问题是什么
type()。和
属于对象
对象不是模型

如果您想让Twig知道属性
$f->type
确实存在,您有两个选择:

  • 您可以按照@roger collins的建议,将相关的
    类型
    对象与
    字段一起加载,或者
    
  • 您可以在
    字段中重载
    \u isset
    魔术方法:

公共函数集($name)
{
if(in_数组($name[
“类型”
])) {
返回true;
}否则{
返回父项::__isset($name);
}
}


这将迫使Twig认识到
类型
字段
的有效属性,即使在相关模型实际加载之前也是如此。

我真的不知道Twig,但出于某种原因,它似乎调用了函数,而不是让Laravel执行它的魔法。你可以试试这个:
{{f.type.name.get()}}
不起作用,因为现在我不得不求助于:
公共函数getTypeString(){$type=type::find($this->type\id);return$type->name;}
很有魅力,很有趣的概念值得学习,非常感谢!现在我明白了!谢谢各位。仅供参考,
isset
代码中的小错误。在
类型之后缺少
]){