所以我最近意识到,而不是使用
$users = User::all();
return view('home')->with('users', $users);
您能够做到
return view('home')->withUsers($users);
我相信这些被称为“魔术方法”-这些文件记录在某处吗?有没有我可以找到的列表,或者是唯一的列表吗?
答案 0 :(得分:2)
Laravel允许您出于方便的目的以这种方式传递数据,但它们不是魔术方法。 Magic Methods是为PHP类中的一组选择方法指定的名称,这些方法通常以双下划线__
开头,每种下划线都有自己的用途。魔术方法的示例包括__call
,__callStatic
,__toString
等。
Laravel使用PHP的魔术方法(尤其是__call
魔术方法)来提供您正在体验的功能。当您尝试调用对象上不存在的方法时,PHP将调用__call
方法。作为第一个参数,它接收被调用方法的名称,第二个参数,它接收作为数组传递给方法调用的参数。
Laravel通过在__call
类上实现View
方法来利用这一点。它检查开发人员调用的方法的开头是否以with
开头,如果是这样,它将假定方法名称的以下部分表示要将数据绑定到的变量的名称。呈现视图:
来自Illuminate\View\View
:
/**
* Dynamically bind parameters to the view.
*
* @param string $method
* @param array $parameters
* @return \Illuminate\View\View
*
* @throws \BadMethodCallException
*/
public function __call($method, $parameters)
{
if (! Str::startsWith($method, 'with')) {
throw new BadMethodCallException("Method [$method] does not exist on view.");
}
return $this->with(Str::camel(substr($method, 4)), $parameters[0]);
}
这提供了您正在体验的功能,并且实际上已经在几个不同的地方使用了该技术,例如,在“查询”构建器/雄辩的语言中,您可以通过简单地调用一个开始的方法来动态地向查询添加where子句where
中,方法调用的其余部分引用您要检查的列:
User::whereEmail('foo@bar.com'); // Equal to User::where('email', 'foo@bar.com');