Segmentfault 用的框架里的Data模式是什么?
在 http://www.infoq.com/cn/news/2012/09/... 中提到的。
擁有18年軟件開發(fā)和IT教學(xué)經(jīng)驗(yàn)。曾任多家上市公司技術(shù)總監(jiān)、架構(gòu)師、項(xiàng)目經(jīng)理、高級(jí)軟件工程師等職務(wù)。 網(wǎng)絡(luò)人氣名人講師,...
在SegmentFault框架中我們把Data
定義為一個(gè)數(shù)據(jù)管理對象,主要方便在模板中展現(xiàn)。它可以展現(xiàn)單個(gè)數(shù)據(jù),也可以展現(xiàn)多個(gè)數(shù)據(jù),這主要是通過繼承Iterator
接口來實(shí)現(xiàn)的迭代器功能。比如我們展示下從數(shù)據(jù)庫取出數(shù)據(jù)到頁面展示的效果
在Action中我們會(huì)這樣寫
// 從model中取出數(shù)據(jù) $questions = $this->questionModel->listQuestions(); // 將數(shù)組放入迭代器 $this->questions = new Data_Question($questions); // 展現(xiàn)模板 $this->view->render('questions.php');
到View中我們就可以操作Data_Question
對象了
<?php foreach($questions as $q): ?> <h2><a href="<?php $q->url(); ?>"><?php $q->title(); ?></a></h2> <p><?php $q->summary(100, '...'); ?></p> <?php endforeach; ?>
可以看出來它的用法大大簡化直觀,你不需要echo
了,因?yàn)槲覀冊?code>Data基類中幫你用__call
函數(shù)實(shí)現(xiàn)了通過字段名作為方法名直接輸出的工作,當(dāng)然你也可以echo $q->title
,因?yàn)槲覀円矊?code>__get函數(shù)做了處理,你可以直接調(diào)用當(dāng)前的字段。
更重要的是配合緩存技術(shù)的使用,我們可以達(dá)到非常夢幻的方法,比如問題作者$q->user
,它可以直接返回一個(gè)Data_User
的對象,那么我們就可以做到使用的時(shí)候再查詢,想用什么數(shù)據(jù)就寫什么數(shù)據(jù),比如我們輸出每個(gè)問題的作者相關(guān)信息
<a href="<?php $q->user->url(); ?>"><?php $q->user->name(); ?> . <?php $q->user->rank(); ?></a>
這只是些最基本的用法,還有更多復(fù)雜的用法就不一一介紹了,比如輸出字段的時(shí)候可以帶參數(shù)等等