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指令,因为它们使用的是绝对路径名。
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
}
- 2 回答
- 0 关注
- 356 浏览
添加回答
举报