FuelPHP 模組/HMVC筆記
FuelPHP對HMVC敘述不明不白,附帶一提那個V還是有問題的(後來新版架構已改成presenter)
app/config裡面的'module_paths' 項目要做好路徑設定,不過不是設自己的名稱
而是內定的APPPATH.'modules'.DS,
module裡面最底限要有類似fuelphp的架構
因為module和package的差距就是module"可以路由"
也就是說,如果執行netpath/mymodule/moduleincontroller/index之類的路徑
我們是可以像自己本身專案的PHP一樣使用的
然後實際上用的方式,可以用HMVC直接請求回傳結果,拿來給原本的主程式使用
首先我們模組裡面的控制器使用以下程式:
namespace hellomodule;
Class Controller_Hellomodule extends \Controller{
public function action_index(){
echo Model_mymodel::hellol();
if( ! \Request::is_hmvc()){
echo 'Normal request!';
}
else{
echo 'HMVC request!';
}
}
}
模組裡面的模型(註:module裡面的model)使用以下的程式:
namespace hellomodule;
class Model_mymodel extends \Model{
public static function hellol(){
return 'I already hate hello world!<br/>';
}
}
此時我們直接連線到hellomodule/hellomodule/index
將得到:
I already hate hello world!
Normal request!
但是如果我們在原本的控制器用一個HMVC式的請求
$temptext = Request::forge('hellomodule/hellomodule/index',false)->execute();
此時$temptext 裡面的回傳內容如果被echo出來,將會是:
I already hate hello world!
HMVC request!
FuelPHP 套件筆記
最低限度設置:
app/config裡面的 'packages' 項目要做好路徑設定
'filename'=>PKGPATH.'filename/'大概這樣的形式
packages裡面最低限度要有classes資料夾,裡面放一個自己要用的class
然後底下要有bootstrap.php
Autoloader::add_core_namespace('套件名稱',true);
Autoloader::add_classes(array(
'NAMESPACE\\CLASSNAME' => __DIR__.'/PATH/filename.php',
));
注意
1.classname和filename可以不同
2.package裡面的檔案要有namespace,不然會redlare error
全部都做好以後,就可以直接使用package裡面的class,可以呼叫裡面的靜態function,不需要再加任何namespace
Example:
'packages' => array(
'ayu'=>PKGPATH.'ayu/',
),
測試設置: ayu/classes/ayu.php 以及ayu/bootstrap.php
ayu.php內容如下(為了確認class名稱與檔名是分開設定,這邊我們弄成不同的名稱
而namespace太容易辨識了就不再做額外處理)
<?php
namespace ayu;
class Tsukimiya{
public static function holyworld(){
echo 'Holy Package Loading and Working Success<br/>';
}
}
bootstrap.php內容如下:
<?php
Autoloader::add_core_namespace('ayu',true);
Autoloader::add_classes(array(
'ayu\\Tsukimiya' => __DIR__.'/classes/ayu.php', //即NAMESPACE\\CLASSNAME' => __DIR__.'/PATH/filename.php',
));
任意一個Controller裡面置入以下測試內容:
Tsukimiya::holyworld();
就可以得到正確的輸出
Holy Package Loading and Working Success
FuelPHP 擴充實作篇
學官網在classes下面直接加入 class MyConfig extends Config,然後隨便呼叫一個已經設定的設定值
echo "MyConfig::get('config_key1') = ".MyConfig::get('config_key1');
得到MyConfig::get('config_key1') = config_value1
隨便裡面加個函數並echo "MyConfig::test() = ".MyConfig::test();
public static function test(){
return 7;
}
得到MyConfig::test() = 7
因此隨便副寫個get
public static function get($item, $default = NULL){
return 1;
}
結果MyConfig::get('config_key1')輸出1,代表可以簡單用自訂函數去override
但是如果一定要使用官方的核心指令,那就必須要用同名class 同名函數去override
另外也必須正確把這個同名class在bootstrap當中預先add class,才能生效
實際上,FuelPHP有擴充限制,具體限制那些在官網可以看到
http://fueldocs.ycnets.com/general/extending_core.html
example 複寫log
class Log extends Fuel\Core\log{
public static function info($msg, $method = null){
return static::write(\Fuel::L_INFO, 'troll my info method ver2'.$msg, $method);
}
}
Autoloader::add_classes(array(
'Log'=>APPPATH.'classes/log.php',
));
如此,以後紀錄的info訊息都會加上一些自訂文字在裡面
FuelPHP 擴充詳解
基本上老話題一下
官網只要你沒實作出來,文件都看不懂,因為他的Example給的通常都很詭異
那他到底在寫啥呢?
擴充但不取代核心類別
也就是你用任何自己的自訂名稱去extend核心類別的項目
例如我可以用Mylog去extend Log ,我可以用MycOnFiG去extend Config
但是同名不行,不是掛掉就是沒效果
擴充且取代核心類別
這意思其實是說,我不管怎樣,下核心指令都想要用自己的
也就是例如,我view東西就是要自己的方法,log就是要有自己處理過的
這時候就去用同樣的名稱去extend,並且在bootstrap去add classes
然後最大的問題其實在
FuelPHP只有這兩種方法可以擴充,那些什麼很曖昧的作法是不存在的
所有曖昧或不合理的用法只有報錯,不執行或直接掛掉這三種狀況
(不要懷疑真的可能掛掉,例如你add class裡面丟config,又真的有那檔案,執行下去就死給你看)
例如我能不能偷偷用一個同名extend一下但不取代
或者能不能用自己方法去實作最後再回來假裝表面銜接後add class一下
因此,若當你已經知道那機制的內容,回去重看文件
恩,他寫的沒什麼大問題啊?
但是你交給一個還不懂狀況的:
fking shxt,那官網到底在寫O小朋友.....
php var_dump 突然無法顯示全部
如果有看到什麼 ...more element啥的
一定是不小心裝到什麼xdebug
以ubuntu為例,來到/etc/php5/mods-avaliable/xdebug.ini裡面(或php.ini,自行嘗試)
加入xdebug.var_display_max_children=512 (預設是128,沒幾條就會超過了)
然後重開apache2
不放心的話去phpinfo看設定
如果發現層數明顯沒有引完
則是去設定xdebug.var_display_max_depth
可能是預防太多層螢幕顯示不好看吧,要設幾層自己衡量了
FuelPHP的ViewModel 還真的消失了
一開始就在想說 這個實際上不算MVC的V(連一半都不到)
且還是optional(沒有必要實作)
新版的1.7.2已經變成Presenter Class
https://github.com/fuel/core/wiki/Changelog-v1.7.2
實際上,使用HMVC就會發現,即使請求回來頂多也就是"修正view的需求"
幾乎不會在HMVC裡面直接連過去(會這樣做的話,你應該會考慮直接讓這項目升級成主架構)
舊版本如果真的有用ViewModel意味著有小改寫的必要,不過幅度應該不大XD
補充一提,FuelPHP的V即使在HMVC也仍然能用
同樣的\Response::forge(\view::forge('PATHLINK')); 是會正確生效的
但是MVC架構卻不放在一起,只能說FuelPHP認為他本來就不是同一個層級的東西吧
FuelPHP各種try
https://drive.google.com/file/d/0Bz9IvLZNUkriUkdXc1l5OHZ4Y00/edit?usp=sharing
改自訂環境,CSRF,路由應用的小try