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

在 PHP/Laravel 中,给定`return $this->belongsTo

在 PHP/Laravel 中,给定`return $this->belongsTo

PHP
守着一只汪 2021-12-03 16:44:45
在此示例代码中:public function user(){    return $this->belongsTo(User::class);}public function sandwich(){    return $this->belongsTo(Sandwich::class);}我想知道User::class叫什么,因为你也可以这样写上面的例子:public function user(){    return $this->belongsTo(\App\User);}public function sandwich(){    return $this->belongsTo(\App\Sandwich);}所以我喜欢 Laravel 当你使用语法糖时“只知道”模型在哪里,但它叫什么?我想阅读一些有关它的文档,以便更好地了解幕后发生的事情。它在某些方面让我想起了“路由模型绑定”,所以我想要的答案是指向某处相关文档页面的链接,或者我可以通过谷歌来了解那里究竟发生了什么。
查看完整描述

2 回答

?
哆啦的时光机

TA贡献1779条经验 获得超6个赞

我想知道 User::class 叫什么


一个完整的名称是类名解析。它结合了 PHP 解析运算符:: 和class 关键字。它不是 Laravel 语法糖,而是 PHP 语法糖。


在所有情况下,它都会返回类的完全限定名称,该名称只是一个包含类文件的绝对/相对路径的字符串 - 取决于使用它的文件/类的命名空间。


来自PHP 手册


... 使用 ClassName::class 获取类 ClassName 的完全限定名称


另一方面,从你提到的 Laravel 用例


public function user()

{

    return $this->belongsTo(User::class);

}

Laravel Eloquent 方法belongsTo()和所有类似的方法都指定要传递的参数是字符串。这些方法解析字符串参数以定位模型的类定义。


来自Laravel 文档


传递给该hasOne方法的第一个参数是相关模型的名称。


因此使用


return $this->belongsTo('\App\User');

或者


return $this->belongsTo(User::class);

在语法上是等价的。这意味着方法定义完全相同,并且没有参数类型检查,因为两个参数都是字符串。


所以我喜欢 Laravel “只知道”当你使用语法糖时模型在哪里。


是的,它只知道。但这真的很简单。它使用 Eloquent 方法的字符串参数(现在我们知道无论语法如何,它都是一个字符串)和当前类提供的 Namespace 来定位模型定义。


例如这个类定义


<?php


use Illuminate\Database\Eloquent\Model;


class User extends Model

{

    /**

     * Get the phone record associated with the user.

     */

    public function phone()

    {

        return $this->hasOne('App\Phone');

    }

}

相当于


<?php


namespace App;


use Illuminate\Database\Eloquent\Model;


class User extends Model

{

    /**

     * Get the phone record associated with the user.

     */

    public function phone()

    {

        return $this->hasOne(Phone::class);

    }

}

也相当于


<?php


use Illuminate\Database\Eloquent\Model;


class User extends Model

{

    /**

     * Get the phone record associated with the user.

     */

    public function phone()

    {

        return $this->hasOne(App\Phone::class);

    }

}

您会注意到第一个和第三个示例不需要该namespace指令,因为它们使用的是绝对路径名。


查看完整回答
反对 回复 2021-12-03
?
拉莫斯之舞

TA贡献1820条经验 获得超10个赞

实际上 Laravel 并不知道模型在哪里


如果这个例子有效:


public function user()

{

    return $this->belongsTo(User::class);

}

这是因为模型可能位于同一文件夹或命名空间中,否则您可能应该像这样从其他命名空间导入所需的模型。



//At the top of the file you will import the class


use Maybe\Another\Folder\Namespace\OtherObject;


public function user()

{

    return $this->belongsTo(OtherObject::class);

}

如果您不想“导入”对象,您应该像这样使用类的完整路径。


public function user()

{

    return $this->belongsTo(App\OtherFolder\OtherObject::class);

}

总之,laravel 不知道在哪里查找类定义,但是如果您在参数中传递一个实例,该实例将为服务容器解析,但这是另一个与模型绑定更相关的主题


public function method(MyObject $instance)

{

    //Laravel will try to automatically generate an instance of $instance

}


查看完整回答
反对 回复 2021-12-03
  • 2 回答
  • 0 关注
  • 356 浏览

添加回答

举报

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