国产成人精品久久免费动漫-国产成人精品天堂-国产成人精品区在线观看-国产成人精品日本-a级毛片无码免费真人-a级毛片毛片免费观看久潮喷

您的位置:首頁技術文章
文章詳情頁

php學習Eloquent修改器源碼示例解析

瀏覽:6日期:2022-06-14 08:12:55
目錄引言Demo源代碼總結引言

感覺好長時間沒寫東西了,一方面主要是自己的角色發生了變化,每天要面對各種各樣的事情和突發事件,不能再有一個完整的長時間讓自己靜下來寫代碼,或者寫文章。

另一方面現在公司技術棧不再停留在只有 Laravel + VUE 了,我們還有小程序、APP 等開發,所以我關注的東西也就多了。

接下來我還是會繼續持續「高產」,把寫技術文章當作一個習慣,堅持下去。

好了,廢話不多說,今天來說一說「Eloquent: 修改器」。

一直想好好研究下 Eloquent。但苦于 Eloquent 有太多可研究的,無法找到一個切入點。前兩天看一同事好像對這個「Eloquent: 修改器」了解不多,所以今天就拿它作為入口,扒一扒其實現源代碼。

首先還是拿一個 Demo 為例:

Demo<?phpnamespace 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: 修改器 https://www.jb51.net/article/177489.htm__get()使用說明 http://php.net/manual/zh/language.oop5.overloading.php#object.get

以上就是php學習Eloquent修改器源碼示例解析的詳細內容,更多關于php Eloquent修改器的資料請關注好吧啦網其它相關文章!

標簽: PHP
主站蜘蛛池模板: 欧美一级视频免费观看 | yy6080午夜国产免费福利 | 欧洲老妇bbbbbxxxxx | 能在线观看的一区二区三区 | 牲欧美| 久色视频 | 国产精品亚洲综合天堂夜夜 | 亚洲欧美日韩色 | 欧美高清另类自拍视频在线看 | 欧美专区一区二区三区 | 久久免费小视频 | 成人国产网站v片免费观看 成人国产午夜在线视频 | 国产在线欧美日韩精品一区二区 | 一级做a爰片久久毛片唾 | 呦视频在线一区二区三区 | 免费黄色毛片视频 | 国产免费成人在线视频 | 亚洲久久网站 | 一级特级aaaa毛片免费观看 | 国产精品亚洲专一区二区三区 | 美女黄频免费观看 | 日韩精品一区二区三区 在线观看 | 欧美一级毛片免费看高清 | 久久99精品久久久久久秒播放器 | 在线看精品 | caoporen个人免费公开视频 | 国产99视频精品免视看9 | 日本一区二区三区精品视频 | 成人欧美一区二区三区视频 | 日韩第一视频 | 成人国产精品高清在线观看 | 国产成人精品999在线观看 | 色吊丝avav色吊丝 | 97精品国产91久久久久久 | 中文字幕亚洲国产 | 在线日韩中文字幕 | 亚洲国产系列久久精品99人人 | 国产特一级毛片 | 99免费精品 | www日| 日本特黄a级高清免费酷网 日本特黄特色 |