2016-07-28 228 views
0

這可能相當奇怪,但我想製作一個類掃描儀。PHP類掃描儀

比方說,我希望做一個REST的路線,但我懶得寫航線爲每個類。所以,我的文件夾結構如下:

lib 
|-router.php 
service 
|-modulea 
    |-this.php 
    |-that.php 
|-moduleb 
    |-notthis.php 
    |-notthat.php 

內部服務類,我就會把註釋像

class This { 
    /** 
    * @path this/@id 
    */ 
    public function get($id) { 
    } 
} 

現在,如果我想掃描服務文件夾中的所有類,然後調用

Router->register('this/@id', 'This->get(@id)')

每次找到與@Path註釋一類時間

我的問題是,實現它的最好方法是什麼?

  1. 對於掃描,我認爲這是一個昂貴的過程。所以我打算放一臺掃描儀,然後創建一個文件,當它檢測到文件夾結構發生變化時將被重寫。但是,如何在通話期間有效檢測文件夾中的更改,使緩存無效並重新掃描?我真的不想每N次重新掃描一次。所以我想做一個校驗和,只有當檢測到變化時重新掃描。這個數據文件將被用來通過Router類來提供路由數據。

  2. 對於註釋,我計劃按照PHPDoc的標準語法,但什麼是閱讀@Path註釋的有效途徑?我應該使用ReflectionClass,還是隻更好地get_file_contents並解析它?因爲我認爲我不需要實例化類,只收集所有信息並將它們放入序列化文件中。

注意:我不是在尋找框架。我正在尋找一種方法來編譯所有控制器的列表,並將它們提供給框架。

謝謝

+0

ReflectionClass是非常適合你的目的。 http://php.net/manual/de/class.reflectionclass.php – Xatenev

回答

1

您應該查看一些針對您的問題的現有解決方案。

只是爲了看看註釋,我所知道的最好的選擇是Doctrine Annotations

您可能也有興趣在現有的路由組件,如Symfony Router - 可以作爲一個獨立的組件,包括註釋進行配置,或在Symfony框架內。

+0

正如我所說的,我懶得寫那些RouteCollection命令,並計劃掃描其內部服務的所有控制器類,寫一個FileLoader養活。 – Magician

+0

聽起來就像你只是想下載一個新的Symfony項目,它的所有設置都去了,只需創建一個控制器類,在函數之前放置'@Route(「/ somepath」)'並且一切正常。 Symfony路由器使用註釋,無需列出路由文件 – mcfedr

+0

Ah..found it ... SensioFrameworkExtraBundle ..謝謝。是的,那會做。我認爲Symfony路由器只能手動輸入。 – Magician

0

你可以使用symfony路由系統來做到這一點。安裝在你的項目中的路由器組件composer require symfony/routing