翼度科技»论坛 编程开发 PHP 查看内容

php学习Eloquent修改器源码示例解析

6

主题

6

帖子

18

积分

新手上路

Rank: 1

积分
18
引言

感觉好长时间没写东西了,一方面主要是自己的角色发生了变化,每天要面对各种各样的事情和突发事件,不能再有一个完整的长时间让自己静下来写代码,或者写文章。
另一方面现在公司技术栈不再停留在只有 Laravel + VUE 了,我们还有小程序、APP 等开发,所以我关注的东西也就多了。
接下来我还是会继续持续「高产」,把写技术文章当作一个习惯,坚持下去。
好了,废话不多说,今天来说一说「
  1. Eloquent: 修改器
复制代码
」。
一直想好好研究下 Eloquent。但苦于 Eloquent 有太多可研究的,无法找到一个切入点。前两天看一同事好像对这个「
  1. Eloquent: 修改器
复制代码
」了解不多,所以今天就拿它作为入口,扒一扒其实现源代码。
首先还是拿一个 Demo 为例:

Demo
  1. <?php
  2. namespace App\Models;
  3. use Illuminate\Database\Eloquent\Model;
  4. use Carbon\Carbon;
  5. class Baby extends Model
  6. {
  7.     protected $table = 'baby';
  8.     protected $appends = ['age'];
  9.     public function getAgeAttribute()
  10.     {
  11.         $date = new Carbon($this->birthday);
  12.         return Carbon::now()->diffInYears($date);
  13.     }
  14. }
复制代码
这个代码比较简单,就是通过已有属性
  1. birthday
复制代码
,计算 Baby 几岁了,得到
  1. age
复制代码
属性。
前端就可以直接拿到结果:
  1. return $baby->age;
复制代码
同样的,还有
  1. setXxxAttribute
复制代码
方法来定义一个修改器。

源代码

读代码还是从使用入手,如上通过
  1. $baby->age
复制代码
调用
  1. age
复制代码
属性,这个属性没在类中定义,所以只能通过 PHP 的魔术方法
  1. __get()
复制代码
调用了。
我们看看
  1. Model
复制代码
类的
  1. __get()
复制代码
方法:
  1. /**
  2. * Dynamically retrieve attributes on the model.
  3. *
  4. * @param  string  $key
  5. * @return mixed
  6. */
  7. public function __get($key)
  8. {
  9.     return $this->getAttribute($key);
  10. }
复制代码
好了,我们开始解读源代码了:
  1. /**
  2. * Get an attribute from the model.
  3. *
  4. * @param  string  $key
  5. * @return mixed
  6. */
  7. public function getAttribute($key)
  8. {
  9.     if (! $key) {
  10.         return;
  11.     }
  12.     // If the attribute exists in the attribute array or has a "get" mutator we will
  13.     // get the attribute's value. Otherwise, we will proceed as if the developers
  14.     // are asking for a relationship's value. This covers both types of values.
  15.     if (array_key_exists($key, $this->attributes) ||
  16.         $this->hasGetMutator($key)) {
  17.         return $this->getAttributeValue($key);
  18.     }
  19.     ...
  20. }
复制代码
重点自然就在第二个
  1. if
复制代码
上,主要判断
  1. attributes
复制代码
数组中是否包含该属性,如果没有,则会执行函数
  1. $this->hasGetMutator($key)
复制代码
  1. /**
  2. * Determine if a get mutator exists for an attribute.
  3. *
  4. * @param  string  $key
  5. * @return bool
  6. */
  7. public function hasGetMutator($key)
  8. {
  9.     return method_exists($this, 'get'.Str::studly($key).'Attribute');
  10. }
复制代码
这就对上了我们的
  1. Demo
复制代码
中自定义的函数
  1. getAgeAttribute()
复制代码
,也就返回
  1. true
复制代码
了。
接下来就是执行函数
  1. $this->getAttributeValue($key)
复制代码
,进而执行函数:
  1. return $this->mutateAttribute($key, $value);
复制代码
  1. /**
  2. * Get the value of an attribute using its mutator.
  3. *
  4. * @param  string  $key
  5. * @param  mixed  $value
  6. * @return mixed
  7. */
  8. protected function mutateAttribute($key, $value)
  9. {
  10.     return $this->{'get'.Str::studly($key).'Attribute'}($value);
  11. }
复制代码
好了,到此我们基本就知道了获取自定义
  1. Attribute
复制代码
的流程了。
相信解析
  1. set XxxAttribute
复制代码
也是很简单的。

总结

好长时间没写东西了,先从最简单的入手,练练手。解析
  1. Eloquent
复制代码
需要费很多脑细胞,接下来的一段时间我会围绕着这个主题好好研究下去,尽可能的全部解读一遍::
  1. .
  2. |____Capsule
  3. | |____Manager.php
  4. |____composer.json
  5. |____Concerns
  6. | |____BuildsQueries.php
  7. | |____ManagesTransactions.php
  8. |____Connection.php
  9. |____ConnectionInterface.php
  10. |____ConnectionResolver.php
  11. |____ConnectionResolverInterface.php
  12. |____Connectors
  13. | |____ConnectionFactory.php
  14. | |____Connector.php
  15. | |____ConnectorInterface.php
  16. | |____MySqlConnector.php
  17. | |____PostgresConnector.php
  18. | |____SQLiteConnector.php
  19. | |____SqlServerConnector.php
  20. |____Console
  21. | |____Factories
  22. | | |____FactoryMakeCommand.php
  23. | | |____stubs
  24. | | | |____factory.stub
  25. | |____Migrations
  26. | | |____BaseCommand.php
  27. | | |____FreshCommand.php
  28. | | |____InstallCommand.php
  29. | | |____MigrateCommand.php
  30. | | |____MigrateMakeCommand.php
  31. | | |____RefreshCommand.php
  32. | | |____ResetCommand.php
  33. | | |____RollbackCommand.php
  34. | | |____StatusCommand.php
  35. | |____Seeds
  36. | | |____SeedCommand.php
  37. | | |____SeederMakeCommand.php
  38. | | |____stubs
  39. | | | |____seeder.stub
  40. |____DatabaseManager.php
  41. |____DatabaseServiceProvider.php
  42. |____DetectsDeadlocks.php
  43. |____DetectsLostConnections.php
  44. |____Eloquent
  45. | |____Builder.php
  46. | |____Collection.php
  47. | |____Concerns
  48. | | |____GuardsAttributes.php
  49. | | |____HasAttributes.php
  50. | | |____HasEvents.php
  51. | | |____HasGlobalScopes.php
  52. | | |____HasRelationships.php
  53. | | |____HasTimestamps.php
  54. | | |____HidesAttributes.php
  55. | | |____QueriesRelationships.php
  56. | |____Factory.php
  57. | |____FactoryBuilder.php
  58. | |____JsonEncodingException.php
  59. | |____MassAssignmentException.php
  60. | |____Model.php
  61. | |____ModelNotFoundException.php
  62. | |____QueueEntityResolver.php
  63. | |____RelationNotFoundException.php
  64. | |____Relations
  65. | | |____BelongsTo.php
  66. | | |____BelongsToMany.php
  67. | | |____Concerns
  68. | | | |____InteractsWithPivotTable.php
  69. | | | |____SupportsDefaultModels.php
  70. | | |____HasMany.php
  71. | | |____HasManyThrough.php
  72. | | |____HasOne.php
  73. | | |____HasOneOrMany.php
  74. | | |____MorphMany.php
  75. | | |____MorphOne.php
  76. | | |____MorphOneOrMany.php
  77. | | |____MorphPivot.php
  78. | | |____MorphTo.php
  79. | | |____MorphToMany.php
  80. | | |____Pivot.php
  81. | | |____Relation.php
  82. | |____Scope.php
  83. | |____SoftDeletes.php
  84. | |____SoftDeletingScope.php
  85. |____Events
  86. | |____ConnectionEvent.php
  87. | |____QueryExecuted.php
  88. | |____StatementPrepared.php
  89. | |____TransactionBeginning.php
  90. | |____TransactionCommitted.php
  91. | |____TransactionRolledBack.php
  92. |____Grammar.php
  93. |____Migrations
  94. | |____DatabaseMigrationRepository.php
  95. | |____Migration.php
  96. | |____MigrationCreator.php
  97. | |____MigrationRepositoryInterface.php
  98. | |____Migrator.php
  99. | |____stubs
  100. | | |____blank.stub
  101. | | |____create.stub
  102. | | |____update.stub
  103. |____MigrationServiceProvider.php
  104. |____MySqlConnection.php
  105. |____PostgresConnection.php
  106. |____Query
  107. | |____Builder.php
  108. | |____Expression.php
  109. | |____Grammars
  110. | | |____Grammar.php
  111. | | |____MySqlGrammar.php
  112. | | |____PostgresGrammar.php
  113. | | |____SQLiteGrammar.php
  114. | | |____SqlServerGrammar.php
  115. | |____JoinClause.php
  116. | |____JsonExpression.php
  117. | |____Processors
  118. | | |____MySqlProcessor.php
  119. | | |____PostgresProcessor.php
  120. | | |____Processor.php
  121. | | |____SQLiteProcessor.php
  122. | | |____SqlServerProcessor.php
  123. |____QueryException.php
  124. |____README.md
  125. |____Schema
  126. | |____Blueprint.php
  127. | |____Builder.php
  128. | |____Grammars
  129. | | |____ChangeColumn.php
  130. | | |____Grammar.php
  131. | | |____MySqlGrammar.php
  132. | | |____PostgresGrammar.php
  133. | | |____RenameColumn.php
  134. | | |____SQLiteGrammar.php
  135. | | |____SqlServerGrammar.php
  136. | |____MySqlBuilder.php
  137. | |____PostgresBuilder.php
  138. | |____SQLiteBuilder.php
  139. | |____SqlServerBuilder.php
  140. |____Seeder.php
复制代码
参考
以上就是php学习Eloquent修改器源码示例解析的详细内容,更多关于php Eloquent修改器的资料请关注脚本之家其它相关文章!

来源:https://www.jb51.net/program/290576e3y.htm
免责声明:由于采集信息均来自互联网,如果侵犯了您的权益,请联系我们【E-Mail:cb@itdo.tech】 我们会及时删除侵权内容,谢谢合作!

举报 回复 使用道具