關於yaf的控制器命名,乙個糾結的問題(續)

2021-06-16 13:25:51 字數 2040 閱讀 9282

loader相關的步驟,已經補上!

what

我們要達成什麼樣的目標?

1、修改yaf控制器的命名規範,如zf一樣:「控制器類名 = 模組名_控制器名controller」,檔案命名不變。

2、為了相容以前預設模組中的**,在預設模組中,控制器命名規則使用yaf預設的規則,即:「控制器類名 = 控制器名controller」

howhow之前,我們有必要先弄清why。

前面的文章裡說過了,yaf之所以不支援根據模組名來區分控制器,是因為在yaf 的自動載入過程中對這些特定命名的類(或外掛程式或模型)進行了特殊處理,並且沒有對這些類所屬的模組加以區分。比如:module1_indexcontroller 類繼承了module1_basecontroller類,yaf在分發的時候,會例項化這個控制器,自然也就會想辦法載入它和base,你可以在yaf_dispatcher.c中找到例項化控制器的函式,它叫做「yaf_dispatcher_get_controller」,並且被宣告為:

而module1_basecontroller則是通過yaf_loader中的autoload自定載入的,yaf對控制器、外掛程式和模型的差別化處理正是在這個autoload方法中實現的。所以,我們還得更改這個方法中對於模組處理的方式,來讓php可以自動的找到module1_basecontroller類。

好了,知道命名規則的實現原理了,我們就有的放矢地修改這個命名規則。寫到這裡我不禁感嘆鳥哥v5啊,所有我們用到的引數都幫我們準備妥當了:除了控制器名、模組名居然還有預設模組名!

萬事具備,只欠東風:

在yaf_dispatcher.c中的yaf_dispatcher_get_controller函式中找到如下**:

if (yaf_g(name_suffix))  else

改為如下**:

if (yaf_g(name_suffix)) else

} else else

}

**的意思直白,不用多說。

下面是autoload方法的修改:

在yaf_loader.c中新增如下靜態函式

/** 

break;

} yaf_module_directory_name, default_slash, seg, default_slash, category);

if (yaf_g(name_suffix)) else }}

/* }}} */

這個函式實現對控制、外掛程式和模型在命名上區分出模組並改變自定載入的目錄。

然後在,autoload方法中找到形如「/* this is a controller class */」的注釋,再在「break」語句之前的一行,新增如下**:

yaf_loader_category_withmodule(&file_name, file_name_len, &directory, class_name, yaf_controller_directory_name tsrmls_cc);

這行**是對上面定義的函式的呼叫,以影響下文中載入的類名和載入目錄。

好了,儲存、重新make、目的達成!

親測可用!o(∩_∩)o哈哈~

think

整個過程中,總結了一下幾個問題:

1、鳥哥的**質量確實好

2、我的c語言功底確實爛

3、修改或編寫c擴充套件,對於phper來說並不是想象的那麼痛苦和困難,試著鑽進去之後,你會發現:你愛php,你更愛c語言。

end到目前為止,我還不了解鳥哥如此設計模組控制器命名規則的初衷,他有時間的話,一定找他問問明白。順便向他推銷一下文中所述的命名規則,畢竟像zf靠攏一點的話,更容易拉zf的粉絲過來用yaf。

另外在yaf的使用過程中,發現乙個forward的問題,這個問題是:如果在控制器的init方法中forward,會導致apache(win)或php-fpm(linux)的崩潰,抽空也研究一下。

祝yaf越來越好。

關於yaf的控制器命名,乙個糾結的問題。

在zf中,控制器是可以繼承其他控制器的,無論是繼承本模組的還是繼承其他模組的控制器,但在yaf中,這種做法會遇到一些小障礙.舉個慄子 controllers base.php index.php modules module1 controllers base.php index.php如果modu...

關於在乙個控制器裡新增另乙個控制器的View的問題

最近的專案由於專案需要,涉及過多次在當前控制器上新增另乙個控制器的view問題。這裡做個筆記,為了方便,當前檢視控制器記為控制器1,新增的檢視記為控制器2 第一種情況 1.首先,因為控制器2的檢視上有需要與使用者互動的需求,所以一定要設定2為1的子控制器 viewcontroller vc2 vie...

如何建立乙個控制器

控制器的常見建立方式有以下幾種 1 直接建立 mjviewcontroller mj mjviewcontroller alloc init 2 通過storyboard建立 需要新建乙個storyboard檔案 1 先載入storyboard檔案 test是storyboard的檔名 uistor...