电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

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

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

瀏覽:4日期: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
主站蜘蛛池模板: 电机保护器-电动机综合保护器-浙江开民 | 贵州科比特-防雷公司厂家提供贵州防雷工程,防雷检测,防雷接地,防雷设备价格,防雷产品报价服务-贵州防雷检测公司 | 碳化硅,氮化硅,冰晶石,绢云母,氟化铝,白刚玉,棕刚玉,石墨,铝粉,铁粉,金属硅粉,金属铝粉,氧化铝粉,硅微粉,蓝晶石,红柱石,莫来石,粉煤灰,三聚磷酸钠,六偏磷酸钠,硫酸镁-皓泉新材料 | 手板-手板模型-手板厂-手板加工-生产厂家,[东莞创域模型] | 天一线缆邯郸有限公司_煤矿用电缆厂家_矿用光缆厂家_矿用控制电缆_矿用通信电缆-天一线缆邯郸有限公司 | 电动车头盔厂家_赠品头盔_安全帽批发_山东摩托车头盔—临沂承福头盔 | 氧化锆纤维_1800度高温退火炉_1800度高温烧结炉-南京理工宇龙新材料股份有限公司 | 时代北利离心机,实验室离心机,医用离心机,低速离心机DT5-2,美国SKC采样泵-上海京工实业有限公司 工业电炉,台车式电炉_厂家-淄博申华工业电炉有限公司 | 聚氨酯催化剂K15,延迟催化剂SA-1,叔胺延迟催化剂,DBU,二甲基哌嗪,催化剂TMR-2,-聚氨酯催化剂生产厂家 | 小型玉石雕刻机_家用玉雕机_小型万能雕刻机_凡刻雕刻机官网 | 油缸定制-液压油缸厂家-无锡大鸿液压气动成套有限公司 | AGV叉车|无人叉车|AGV智能叉车|AGV搬运车-江西丹巴赫机器人股份有限公司 | 分类168信息网 - 分类信息网 免费发布与查询 | 珠海网站建设_响应网站建设_珠海建站公司_珠海网站设计与制作_珠海网讯互联 | 铝扣板-铝方通-铝格栅-铝条扣板-铝单板幕墙-佳得利吊顶天花厂家 elisa试剂盒价格-酶联免疫试剂盒-猪elisa试剂盒-上海恒远生物科技有限公司 | 北京租车公司_汽车/客车/班车/大巴车租赁_商务会议/展会用车/旅游大巴出租_北京桐顺创业租车公司 | 上海冠顶工业设备有限公司-隧道炉,烘箱,UV固化机,涂装设备,高温炉,工业机器人生产厂家 | 精密线材测试仪-电线电缆检测仪-苏州欣硕电子科技有限公司 | 光照全温振荡器(智能型)-恒隆仪器| 宜兴市恺瑞德环保科技有限公司| 商标转让-购买商标专业|放心的商标交易网-蜀易标商标网 | 同学聚会纪念册制作_毕业相册制作-成都顺时针宣传画册设计公司 | 杜甫仪器官网|实验室平行反应器|升降水浴锅|台式低温循环泵 | 耐力板-PC阳光板-PC板-PC耐力板 - 嘉兴赢创实业有限公司 | 哈尔滨治「失眠/抑郁/焦虑症/精神心理」专科医院排行榜-京科脑康免费咨询 一对一诊疗 | 建筑资质代办-建筑企业资质代办机构-建筑资质代办公司 | 烘箱-工业烘箱-工业电炉-实验室干燥箱 - 苏州华洁烘箱制造有限公司 | 小型UV打印机-UV平板打印机-大型uv打印机-UV打印机源头厂家 |松普集团 | 应急灯_消防应急灯_应急照明灯_应急灯厂家-大成智慧官网 | 德州万泰装饰 - 万泰装饰装修设计软装家居馆 | 臭氧老化试验箱,高低温试验箱,恒温恒湿试验箱,防水试验设备-苏州亚诺天下仪器有限公司 | 锂电池砂磨机|石墨烯砂磨机|碳纳米管砂磨机-常州市奥能达机械设备有限公司 | 帽子厂家_帽子工厂_帽子定做_义乌帽厂_帽厂_制帽厂 | 锻造液压机,粉末冶金,拉伸,坩埚成型液压机定制生产厂家-山东威力重工官方网站 | 多功能真空滤油机_润滑油全自动滤油机_高效真空滤油机价格-重庆润华通驰 | Eiafans.com_环评爱好者 环评网|环评论坛|环评报告公示网|竣工环保验收公示网|环保验收报告公示网|环保自主验收公示|环评公示网|环保公示网|注册环评工程师|环境影响评价|环评师|规划环评|环评报告|环评考试网|环评论坛 - Powered by Discuz! | 托利多电子平台秤-高精度接线盒-托利多高精度电子秤|百科 | 合肥白癜风医院_[治疗白癜风]哪家好_合肥北大白癜风医院 | 陕西华春网络科技股份有限公司 | 洛阳永磁工业大吊扇研发生产-工厂通风降温解决方案提供商-中实洛阳环境科技有限公司 | 全国国际学校排名_国际学校招生入学及学费-学校大全网 |