猿问

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

在此示例代码中:


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 当你使用语法糖时“只知道”模型在哪里,但它叫什么?我想阅读一些有关它的文档,以便更好地了解幕后发生的事情。


它在某些方面让我想起了“路由模型绑定”,所以我想要的答案是指向某处相关文档页面的链接,或者我可以通过谷歌来了解那里究竟发生了什么。


守着一只汪
浏览 357回答 2
2回答

哆啦的时光机

我想知道 User::class 叫什么一个完整的名称是类名解析。它结合了 PHP 解析运算符:: 和class 关键字。它不是 Laravel 语法糖,而是 PHP 语法糖。在所有情况下,它都会返回类的完全限定名称,该名称只是一个包含类文件的绝对/相对路径的字符串 - 取决于使用它的文件/类的命名空间。来自PHP 手册... 使用 ClassName::class 获取类 ClassName 的完全限定名称另一方面,从你提到的 Laravel 用例public function user(){&nbsp; &nbsp; return $this->belongsTo(User::class);}Laravel Eloquent 方法belongsTo()和所有类似的方法都指定要传递的参数是字符串。这些方法解析字符串参数以定位模型的类定义。来自Laravel 文档传递给该hasOne方法的第一个参数是相关模型的名称。因此使用return $this->belongsTo('\App\User');或者return $this->belongsTo(User::class);在语法上是等价的。这意味着方法定义完全相同,并且没有参数类型检查,因为两个参数都是字符串。所以我喜欢 Laravel “只知道”当你使用语法糖时模型在哪里。是的,它只知道。但这真的很简单。它使用 Eloquent 方法的字符串参数(现在我们知道无论语法如何,它都是一个字符串)和当前类提供的 Namespace 来定位模型定义。例如这个类定义<?phpuse Illuminate\Database\Eloquent\Model;class User extends Model{&nbsp; &nbsp; /**&nbsp; &nbsp; &nbsp;* Get the phone record associated with the user.&nbsp; &nbsp; &nbsp;*/&nbsp; &nbsp; public function phone()&nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; return $this->hasOne('App\Phone');&nbsp; &nbsp; }}相当于<?phpnamespace App;use Illuminate\Database\Eloquent\Model;class User extends Model{&nbsp; &nbsp; /**&nbsp; &nbsp; &nbsp;* Get the phone record associated with the user.&nbsp; &nbsp; &nbsp;*/&nbsp; &nbsp; public function phone()&nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; return $this->hasOne(Phone::class);&nbsp; &nbsp; }}也相当于<?phpuse Illuminate\Database\Eloquent\Model;class User extends Model{&nbsp; &nbsp; /**&nbsp; &nbsp; &nbsp;* Get the phone record associated with the user.&nbsp; &nbsp; &nbsp;*/&nbsp; &nbsp; public function phone()&nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; return $this->hasOne(App\Phone::class);&nbsp; &nbsp; }}您会注意到第一个和第三个示例不需要该namespace指令,因为它们使用的是绝对路径名。

拉莫斯之舞

实际上 Laravel 并不知道模型在哪里如果这个例子有效:public function user(){&nbsp; &nbsp; return $this->belongsTo(User::class);}这是因为模型可能位于同一文件夹或命名空间中,否则您可能应该像这样从其他命名空间导入所需的模型。//At the top of the file you will import the classuse Maybe\Another\Folder\Namespace\OtherObject;public function user(){&nbsp; &nbsp; return $this->belongsTo(OtherObject::class);}如果您不想“导入”对象,您应该像这样使用类的完整路径。public function user(){&nbsp; &nbsp; return $this->belongsTo(App\OtherFolder\OtherObject::class);}总之,laravel 不知道在哪里查找类定义,但是如果您在参数中传递一个实例,该实例将为服务容器解析,但这是另一个与模型绑定更相关的主题public function method(MyObject $instance){&nbsp; &nbsp; //Laravel will try to automatically generate an instance of $instance}
随时随地看视频慕课网APP
我要回答