内容简介:感觉好长时间没写东西了,一方面主要是自己的角色发生了变化,每天要面对各种各样的事情和突发事件,不能再有一个完整的长时间让自己静下来写代码,或者写文章。另一方面现在公司技术栈不再停留在只有 Laravel + VUE 了,我们还有小程序、APP 等开发,所以我关注的东西也就多了。接下来我还是会继续持续「高产」,把写技术文章当作一个习惯,坚持下去。
感觉好长时间没写东西了,一方面主要是自己的角色发生了变化,每天要面对各种各样的事情和突发事件,不能再有一个完整的长时间让自己静下来写代码,或者写文章。
另一方面现在公司技术栈不再停留在只有 Laravel + VUE 了,我们还有小程序、APP 等开发,所以我关注的东西也就多了。
接下来我还是会继续持续「高产」,把写技术文章当作一个习惯,坚持下去。
好了,废话不多说,今天来说一说「 Eloquent: 修改器
」。
一直想好好研究下 Eloquent。但苦于 Eloquent 有太多可研究的,无法找到一个切入点。前两天看一同事好像对这个「 Eloquent: 修改器
」了解不多,所以今天就拿它作为入口,扒一扒其实现源代码。
首先还是拿一个 Demo 为例:
Demo
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
use Carbon\Carbon;
class Baby extends Model
{
protected $table = 'baby';
protected $appends = ['age'];
public function getAgeAttribute()
{
$date = new Carbon($this->birthday);
return Carbon::now()->diffInYears($date);
}
}
复制代码
这个代码比较简单,就是通过已有属性 birthday
,计算 Baby 几岁了,得到 age
属性。
前端就可以直接拿到结果:
return $baby->age; 复制代码
同样的,还有 setXxxAttribute
方法来定义一个修改器。
源代码
读代码还是从使用入手,如上通过 $baby->age
调用 age
属性,这个属性没在类中定义,所以只能通过 PHP 的魔术方法 __get()
调用了。
我们看看 Model
类的 __get()
方法:
/**
* Dynamically retrieve attributes on the model.
*
* @param string $key
* @return mixed
*/
public function __get($key)
{
return $this->getAttribute($key);
}
复制代码
好了,我们开始解读源代码了:
/**
* Get an attribute from the model.
*
* @param string $key
* @return mixed
*/
public function getAttribute($key)
{
if (! $key) {
return;
}
// If the attribute exists in the attribute array or has a "get" mutator we will
// get the attribute's value. Otherwise, we will proceed as if the developers
// are asking for a relationship's value. This covers both types of values.
if (array_key_exists($key, $this->attributes) ||
$this->hasGetMutator($key)) {
return $this->getAttributeValue($key);
}
...
}
复制代码
重点自然就在第二个 if
上,主要判断 attributes
数组中是否包含该属性,如果没有,则会执行函数 $this->hasGetMutator($key)
:
/**
* Determine if a get mutator exists for an attribute.
*
* @param string $key
* @return bool
*/
public function hasGetMutator($key)
{
return method_exists($this, 'get'.Str::studly($key).'Attribute');
}
复制代码
这就对上了我们的 Demo
中自定义的函数 getAgeAttribute()
,也就返回 true
了。
接下来就是执行函数 $this->getAttributeValue($key)
,进而执行函数: return $this->mutateAttribute($key, $value);
/**
* Get the value of an attribute using its mutator.
*
* @param string $key
* @param mixed $value
* @return mixed
*/
protected function mutateAttribute($key, $value)
{
return $this->{'get'.Str::studly($key).'Attribute'}($value);
}
复制代码
好了,到此我们基本就知道了获取自定义 Attribute
的流程了。
相信解析 set XxxAttribute
也是很简单的。
总结
好长时间没写东西了,先从最简单的入手,练练手。解析 Eloquent
需要费很多脑细胞,接下来的一段时间我会围绕着这个主题好好研究下去,尽可能的全部解读一遍::
. |____Capsule | |____Manager.php |____composer.json |____Concerns | |____BuildsQueries.php | |____ManagesTransactions.php |____Connection.php |____ConnectionInterface.php |____ConnectionResolver.php |____ConnectionResolverInterface.php |____Connectors | |____ConnectionFactory.php | |____Connector.php | |____ConnectorInterface.php | |____MySqlConnector.php | |____PostgresConnector.php | |____SQLiteConnector.php | |____SqlServerConnector.php |____Console | |____Factories | | |____FactoryMakeCommand.php | | |____stubs | | | |____factory.stub | |____Migrations | | |____BaseCommand.php | | |____FreshCommand.php | | |____InstallCommand.php | | |____MigrateCommand.php | | |____MigrateMakeCommand.php | | |____RefreshCommand.php | | |____ResetCommand.php | | |____RollbackCommand.php | | |____StatusCommand.php | |____Seeds | | |____SeedCommand.php | | |____SeederMakeCommand.php | | |____stubs | | | |____seeder.stub |____DatabaseManager.php |____DatabaseServiceProvider.php |____DetectsDeadlocks.php |____DetectsLostConnections.php |____Eloquent | |____Builder.php | |____Collection.php | |____Concerns | | |____GuardsAttributes.php | | |____HasAttributes.php | | |____HasEvents.php | | |____HasGlobalScopes.php | | |____HasRelationships.php | | |____HasTimestamps.php | | |____HidesAttributes.php | | |____QueriesRelationships.php | |____Factory.php | |____FactoryBuilder.php | |____JsonEncodingException.php | |____MassAssignmentException.php | |____Model.php | |____ModelNotFoundException.php | |____QueueEntityResolver.php | |____RelationNotFoundException.php | |____Relations | | |____BelongsTo.php | | |____BelongsToMany.php | | |____Concerns | | | |____InteractsWithPivotTable.php | | | |____SupportsDefaultModels.php | | |____HasMany.php | | |____HasManyThrough.php | | |____HasOne.php | | |____HasOneOrMany.php | | |____MorphMany.php | | |____MorphOne.php | | |____MorphOneOrMany.php | | |____MorphPivot.php | | |____MorphTo.php | | |____MorphToMany.php | | |____Pivot.php | | |____Relation.php | |____Scope.php | |____SoftDeletes.php | |____SoftDeletingScope.php |____Events | |____ConnectionEvent.php | |____QueryExecuted.php | |____StatementPrepared.php | |____TransactionBeginning.php | |____TransactionCommitted.php | |____TransactionRolledBack.php |____Grammar.php |____Migrations | |____DatabaseMigrationRepository.php | |____Migration.php | |____MigrationCreator.php | |____MigrationRepositoryInterface.php | |____Migrator.php | |____stubs | | |____blank.stub | | |____create.stub | | |____update.stub |____MigrationServiceProvider.php |____MySqlConnection.php |____PostgresConnection.php |____Query | |____Builder.php | |____Expression.php | |____Grammars | | |____Grammar.php | | |____MySqlGrammar.php | | |____PostgresGrammar.php | | |____SQLiteGrammar.php | | |____SqlServerGrammar.php | |____JoinClause.php | |____JsonExpression.php | |____Processors | | |____MySqlProcessor.php | | |____PostgresProcessor.php | | |____Processor.php | | |____SQLiteProcessor.php | | |____SqlServerProcessor.php |____QueryException.php |____README.md |____Schema | |____Blueprint.php | |____Builder.php | |____Grammars | | |____ChangeColumn.php | | |____Grammar.php | | |____MySqlGrammar.php | | |____PostgresGrammar.php | | |____RenameColumn.php | | |____SQLiteGrammar.php | | |____SqlServerGrammar.php | |____MySqlBuilder.php | |____PostgresBuilder.php | |____SQLiteBuilder.php | |____SqlServerBuilder.php |____Seeder.php 复制代码
以上所述就是小编给大家介绍的《Eloquent: 修改器》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!
猜你喜欢:- 使用python编写游戏修改器
- [ Laravel 5.7 文档 ] Eloquent ORM —— 访问器和修改器
- AAAI-17论文提出深度学习C语言修改器DeepFix:用人工智能加「;」
- 不修改模板的前提下修改VisualState中的某些值
- 修改Git已提交的的Author和EMail(批量修改脚本)
- ViewGroup 默认顺序绘制子 View,如何修改?什么场景需要修改绘制顺序?
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
Ruby原理剖析
[美] Patrick Shaughnessy / 张汉东、秦凡鹏 / 华中科技大学出版社 / 2016-12-1 / 78.80元
《Ruby原理剖析》解开Ruby编程语言的魔法面纱。全书图文并茂、深入浅出地剖析了Ruby编程语言的核心工作原理。作者本着科学实证的精神,设计了一系列实验,帮助读者轻松了解这门编程语言的工作奥秘,包括Ruby如何用虚拟机执行代码,Ruby的垃圾回收算法,以及类和模块在Ruby内部的关系等。一起来看看 《Ruby原理剖析》 这本书的介绍吧!