在此示例代码中:
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在使用该语法糖时“只知道”模型在哪里,但是它叫什么呢?我想阅读一些有关它的文档,以便我更好地了解幕后发生的事情。
它以某种方式使我想起“路由模型绑定”,所以我想要的答案是某个地方的相关文档页面的链接,或者一个我可以让Google理解那里到底发生了什么的术语。
答案 0 :(得分:4)
::class
的语法为class name resolution。该语法返回完全限定的类名的字符串表示形式,包括所有省略的名称空间信息。
此功能的几个优点是:1.无需显式指定类的完全限定名称空间,以及2.能够将完全限定名称空间作为字符串传递,同时允许IDE定位类。重构或搜索引用时的名称。
答案 1 :(得分:3)
我想知道什么叫User :: class
一个俗称的名字是类名解析。它结合了PHP解析运算符::
和class
关键字。它不是Laravel语法糖,而是PHP。
在所有情况下,它返回类的完全限定名称,该名称只是一个字符串,其中包含类文件的绝对/相对路径-取决于使用该文件/类的名称空间。
...使用ClassName :: class获得ClassName的完全限定名称
另一方面,在您提到的Laravel用例中
public function user()
{
return $this->belongsTo(User::class);
}
Laravel Eloquent方法belongsTo()
和所有类似方法均指定要传递的参数是字符串。这些方法解析字符串参数以定位模型的类定义。
传递给
hasOne
方法的第一个参数是相关模型的名称。
因此使用
return $this->belongsTo('\App\User');
OR
return $this->belongsTo(User::class);
在语法上是等效的。这意味着方法定义完全相同,并且由于两个参数都是字符串,因此不进行参数类型检查。
所以我喜欢Laravel在使用该语法糖时“只知道”模型在哪里。
是的,它知道。但这确实很简单。它使用Eloquent方法的string参数(现在我们知道,不管语法如何,它都是String)和提供的当前类的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
指令,因为它们使用的是绝对路径名。
答案 2 :(得分:1)
实际上Laravel不知道模型在哪里
如果此示例有效:
public function user()
{
return $this->belongsTo(User::class);
}
如果模型可能位于相同的文件夹中,或者Namespace,那么您可能应该从其他命名空间中导入所需的模型。
//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不知道在哪里查找类定义,但是如果您在可以为Service Container解决的param中传递实例,但这是与模型绑定更相关的另一个主题>
public function method(MyObject $instance)
{
//Laravel will try to automatically generate an instance of $instance
}