php - laravel中抽象Model类如何处理 "::find()"、 "::where()"等静态动态方法调用

标签 php laravel eloquent

我正在学习如何在 laravel 中实现一些功能,因为我想了解一些软件设计技术和原则。

我理解当在抽象模型类实现魔术方法的 Eloquent 模型上进行诸如“App\User::find(1) 或 App\User::whereId(1)”之类的静态方法调用时__callStatic"像这样:

/**
 * Handle dynamic static method calls into the method.
 *
 * @param  string  $method
 * @param  array  $parameters
 * @return mixed
 */
public static function __callStatic($method, $parameters)
{
    $instance = new static;
    return call_user_func_array([$instance, $method], $parameters);
}

我也明白这一行 '$instance = new static;'制作静态调用所在的任何 Eloquent 模型的实例,例如 App\User。

但是我不完全理解下一行“call_user_func_array([$instance, $method], $parameters);”中发生的事情。

据我目前所了解的,函数 call_user_func_array() 应该在 Eloquent 模型实例(例如 App\user)上调用 $method(例如 find($parameters))。

但我不明白为什么不是这样,而且我发现 Eloquent 模型上不存在该方法。我尝试调用一个不存在的方法,如“blah()”:

App\User::blah();

但我收到异常“BadMethodCallException,消息为‘调用未定义的方法 Illuminate\Database\Query\Builder::fisd()’”。

请问“Builder”类是如何进入场景的?

为什么异常不是 ""BadMethodCallException with message 'Call to undefined method Illuminate\Database\Eloquent\Model::fisd()'""?

我看不到扩展 Builder 类的模型类。

最佳答案

发生这种情况的原因是因为它随后触发类上的 __call 方法,该方法将尝试使用 newQuery() 调用该方法,返回 的实例> builder

__call__callStatic 一样,当您尝试调用一个类上不可访问(或不存在)的方法时被调用。

因此,当您尝试静态调用 find() 时,它会被 __callStatic 捕获,因为它不存在,然后尝试调用 find () 在新实例上再次不存在,因此它被 __call 捕获并最终尝试在 Builder 上调用该方法。

希望这对您有所帮助!

关于php - laravel中抽象Model类如何处理 "::find()"、 "::where()"等静态动态方法调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42058038/

相关文章:

php - 获取按月分组的 2 个日期之间的月总天数

javascript - 将 javascript 变量转换为 php 并使用 session 发送它

php - 如何选择表格的某些列?

foreach - Blade 不显示数据库中的模型值

PHP检查字符串是否为UTF-8的最快方法?

php - MySQL Regexp 哪里喜欢值

php - Laravel,dispatchAfterResponse 不释放前端请求

php - Laravel 存储文件系统和 Amazon S3 出现 CredentialsException

mysql - 优化 Eloquent 关系检索

php - 我将如何在 Laravel Eloquent 中执行这个存储过程和子查询 SQL?