为了账号安全,请及时绑定邮箱和手机立即绑定

Laravel 加载关系 - 框架错误?

Laravel 加载关系 - 框架错误?

PHP
眼眸繁星 2023-08-11 11:06:38
我遇到了一些奇怪的事情,我认为这可能是框架本身的错误,所以我想知道是否有类似的经历。我有两个实体:Contact和Media处于 1:M 关系。关系定义为:public function media(){    return $this->hasMany(Media::class);}现在我看到的问题是,当我继续show控制器方法并加载关系时,如下所示:public function show(Contact $contact){    $contact->load('media');    return response()->json($contact);}联系方式已解决,媒体关系如下:"first_name": "Melisa",..."media": [    {        "id": 50,    ...但是,如果我修改关系的大小写,以便我调用:public function show(Contact $contact){    $contact->load('mEdIa');    return response()->json($contact);}它返回:"first_name": "Melisa",..."m_ed_ia": [    {        "id": 50,    ...……这确实令人不安。它应该发生吗?
查看完整描述

2 回答

?
湖上湖

TA贡献2003条经验 获得超2个赞

这种行为应该在 Laravel 的文档中注明,事实并非如此。如果我是你,我会提出一个关于更新有关此行为的文档的问题,并看看会有什么反应。


但事实上,这是一个功能,而不是一个错误。


PHP 的本质在很多方面都是敏感和不敏感的。对于类和方法;PHP 是不敏感的。


class Contact {

    public function media() {

        return .. relationship;

    }

}


// valid

new CONTACT();

(new contact())->mediA();

// valid reflection

$r = \ReflectionClass('contact');

$r->hasMethod('mediA'); // true

所以这些奇怪的东西都是有效的。现在到你说的这一点:

..从我的角度来看mEdia不应该被允许。我的关系函数名称是media,我希望它被这样使用。

那么你必须这样写。你必须这样做,因为 Laravel 依赖于它。

  • PHP 根本无法验证/验证。

  • Laravel 必须改变编程语言的本质,其敏感性是通过选择故意设计的。

  • 这里的期望是;您(作为程序员)应该了解 PHP 的敏感性,因此在这种情况下,绝对不需要验证给定的输入。

  • 验证/验证这样的事情的开销将是巨大的并且没有意义。

$class = 'contact';

$method = 'mediA';


$r = new \ReflectionClass($class);

if($class !== $r->getName()) {

    throw new \Exception('unknown class');

}

if(!in_array($method, array_map(function($method) {

    return $method->name;

}, $methods))) {

    throw new \Exception('unknown method');

}


// valid from here

从各个角度来看, 的用法$contacts->with('mediA')是完全有效的。


mediA转换为数组(本身)时使用medi_a的事实Str::snake('mediA')只是您必须处理的 Laravel 的一个功能。


查看完整回答
反对 回复 2023-08-11
?
慕森王

TA贡献1777条经验 获得超3个赞

Laravel 中有这样的行为。要获得相同的密钥“mEdIa” - 您必须添加到media模型。

public static $snakeAttributes = false;


查看完整回答
反对 回复 2023-08-11
  • 2 回答
  • 0 关注
  • 70 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信