Laravel中的魔术方法

时间:2018-10-21 18:49:36

标签: php laravel

所以我最近意识到,而不是使用

$users = User::all();
return view('home')->with('users', $users);

您能够做到

return view('home')->withUsers($users);

我相信这些被称为“魔术方法”-这些文件记录在某处吗?有没有我可以找到的列表,或者是唯一的列表吗?

1 个答案:

答案 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');