Laravel 中的魔法方法

Ash*_*own 0 php laravel

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

$users = User::all();
return view('home')->with('users', $users);
Run Code Online (Sandbox Code Playgroud)

你有能力做到

return view('home')->withUsers($users);
Run Code Online (Sandbox Code Playgroud)

我相信这些被称为“魔法方法”——这些有没有记录在某处?有我能找到的列表还是唯一的列表?

Jon*_*hon 5

为了方便,Laravel 允许您以这种方式传递数据,但它们不是魔术方法魔法方法是给 PHP 类中一组选择的方法的名称,这些方法通常以双下划线开头__,每个都有自己的用途。魔术方法的例子是__call__callStatic__toString等。

Laravel 使用 PHP 的魔法方法,特别是__call魔法方法,来提供您正在体验的功能。该__call方法是由PHP当您尝试调用不的对象上存在的方法调用。作为它的第一个参数,它接收被调用方法的名称,第二个参数接收作为数组传递给方法调用的参数。

Laravel 通过__callView类上实现方法来利用这一点。它检查开发人员调用的方法的开头是否以开头,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]);
}
Run Code Online (Sandbox Code Playgroud)

这提供了您所遇到的功能,这种技术其实是在几个不同的地方使用,例如,在查询生成器/雄辩您可以动态地添加where子句通过简单地调用一个方法开始使用查询where和方法调用的其余部分是指您正在检查的列:

User::whereEmail('foo@bar.com'); // Equal to User::where('email', 'foo@bar.com');
Run Code Online (Sandbox Code Playgroud)