【问题标题】:Magic methods in LaravelLaravel 中的魔法方法
【发布时间】:2018-10-22 03:23:54
【问题描述】:

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

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

你能做到

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

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

【问题讨论】:

  • 文档?您要问的内容非常广泛,因为 laravel 在任何地方都使用它,包括您的 User::all() 电话。 PHP 称它们为魔术方法php.net/manual/en/language.oop5.magic.php,有些语言只是称之为重载。 github.com/barryvdh/laravel-ide-helper 是一个包,它将为 Laravel 中的一些“魔法”创建 PHPDoc 条目。
  • The docs? - 然后链接我的文档?
  • laravel.com/docs/5.0/views。看起来他们已经在最近版本的文档中删除了它,可能是为了阻止对魔法方法的依赖。

标签: php laravel


【解决方案1】:

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

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

Laravel 通过在 View 类上实现 __call 方法来利用这一点。它检查开发人员调用的方法的开头是否以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]);
}

这提供了您正在体验的功能,并且这种技术实际上在几个不同的地方使用,例如,在查询构建器/Eloquent 中,您可以通过简单地调用方法开始动态地将 where 子句添加到查询中使用where 并且方法调用的其余部分是指您正在检查的列:

User::whereEmail('foo@bar.com'); // Equal to User::where('email', 'foo@bar.com');

【讨论】:

  • 那么我是否必须查看 Illuminate\whatever 以查看它是否支持此功能,或者某处是否有预定义列表?我无法通过快速搜索找到一个。
  • 我不确定描述使用此功能的场所类型的具体列表。事实上,我认为它的文档还是很稀少的。在我的脑海中,您可以将它与 Eloquent、查询构建器、邮件、响应和视图一起使用。可能还有更多。一般而言,只要有 ->with(...) 方法或您可以将字符串映射到变量的方法传递的方法,就可能存在该功能。
猜你喜欢
  • 2022-11-10
  • 2014-12-14
  • 1970-01-01
  • 2015-08-08
  • 1970-01-01
  • 2018-08-21
  • 1970-01-01
  • 2021-06-22
相关资源
最近更新 更多