顯示具有 FuelPHP 標籤的文章。 顯示所有文章
顯示具有 FuelPHP 標籤的文章。 顯示所有文章

舊版fuelphp vs redis 衝突筆記

Posted by ayuayu on 2014/09/11

裝正規redis.so的前提,還用舊版FuelPHP須注意
舊版的FuelPHP,redis路徑在Fuel/Core/Redis
如果事先use過或變過namespace,可以直接new Redis

但是裝了redis.so以後,同樣可以new Redis來使用,這裡會產生衝突,造成運作異常(例如出exception)

新版的FuelPHP,redis路徑在Fuel/Core/Redis/db.php,class名稱變成redis_db,所以是new Redis_Db,所以不會起衝突



利用FuelPHP Migration拿建立資料庫的function

Posted by ayuayu on 2014/09/02

前言:
Migration實際上原本是要自己寫的,且這個遷移實際上跟字面上的語意差很多
Migration的作用是結構控管,也就是現在的資料庫使用的結構如果是共同協作,那麼如果我需要升級一個版本,那我統一丟一組migration給你就好了,你升級以後就能使用新寫出來的某某系統,大概是這樣的概念

(點選標題閱讀全文)

FuelPHP Migration小研究

Posted by ayuayu on


簡單來說呢,migrate是一個架構改變機制
up和down設定好以後,up通常就是升級版本以後資料庫應該要怎樣
也就是我想要在新版的A資料表的B欄位名稱應該改成C
那up就是A.B 改成A.C  down就是A.C改成A.B

由於是可逆的,因此up和down必須完全是相反操作,這樣就能符合結構的版本控制
如果中間有發現什麼問題,也可以直接退版本來解決以後,再重新進到比較新的版本當中

官網沒有說很清楚,其實那個檔案XXX_filename的XXX就是版本名稱
因此如果打入php oil r migrate --version=23
就是從目前執行的版本一直執行up裡面的函式直到23號的檔案
然後如果又要退到15號,打入php oil r migrate --version=15,他就是不斷執行down的函式直到版本是15

因此這裡的架構的PHP SQL Code可逆性有嚴格要求(尤其做什麼rename 然後還有搬東西或修改架構而非創建之類的,就要特別注意)

最後,這些東西都跟資料無關,注意migration只針對資料庫架構進行調整,是不管裡面資料內容的

所以你可以看到up 裡面create一堆,down 就直接drop了(或相反)
中間不負責救資料,因此需要留意



FuelPHP的short tag

Posted by ayuayu on

不存在,不要懷疑

這是為什麼他如果想用short tag還需要掛smarty的原因

這點code igniter就好很多,不過code igniter是暫存還是每次編譯就沒有去看了
smarty是會先編一次放在暫存資料夾下面,實際上沒有運作問題(除了第一次執行,但這並非大量使用的重點考量)

FuelPHP 模組/HMVC筆記

Posted by ayuayu on 2014/07/24

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 套件筆記

Posted by ayuayu on

最低限度設置:

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 擴充實作篇

Posted by ayuayu on

學官網在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 擴充詳解

Posted by ayuayu on 2014/07/18

基本上老話題一下
官網只要你沒實作出來,文件都看不懂,因為他的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 突然無法顯示全部

Posted by ayuayu on 2014/07/17

如果有看到什麼 ...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 還真的消失了

Posted by ayuayu on

一開始就在想說 這個實際上不算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

Posted by ayuayu on 2014/07/11

https://drive.google.com/file/d/0Bz9IvLZNUkriUkdXc1l5OHZ4Y00/edit?usp=sharing

改自訂環境,CSRF,路由應用的小try

FuelPHP每次連線必warning的修正

Posted by ayuayu on 2014/07/08

WARNING - 2014-07-08 14:06:43 --> Fuel\Core\Fuel::init - The configured locale en_US is not installed on your system.

基本上每次連都會在log留下一次紀錄
然後假使這不是單機測試而是大量使用...那就GG了

註:自己安裝哪個語言可以在linux環境以下用echo $LANG來查看

找到APPPATH/config.php

然後把locale設定弄成空字串,再來訊息就不會再出現了

FuelPHP Note02

Posted by ayuayu on 2014/06/27

官網那個Model寫法是

模組本身
namespace Model;
class xxx extends \Model {

使用時
use \Model\xxx;

呼叫時 xxx::function(etc
不use的呼叫時為\Model\xxx::function(etc

但是遇到extends Model_Crud的時候就掛了,因為不能多重繼承
這時只好利用路徑_檔名的特性

改寫成:

模組本身
class Model_xxx

使用時
use Model_xxx as xxx;

呼叫時 xxx::function(etc
不use的狀況下呼叫為 Model_xxx::function(etc


FuelPHP Bootstrap 聽說有用到爆的Note

Posted by ayuayu on 2014/06/20

注意,FuelPHP的文件,直到你做出實際可跑的結果之前,你應該都看不懂他在寫什麼
那個Example完全只有設定方向,實際可以怎麼用...你還是得自行測試,根本不算Example

相對這個詭異的文件,Code Igniter提供的教學雖然比較簡單,但你可以馬上知道那個MVC運作到底在做什麼,以文件和example來說是相對比較適當的寫法

FuelPHP

1.FuelPHP的header content footer分隔用法要看 控制器=>樣板(template)
2.沒曖昧的膠水需求直接無視viewmodel,真正的view在apppath/view
3.資料庫真正設定位置在apppath/config/development(除非你去bootstrap改過環境)
註:裡面帳號密碼都是root且有優先複寫,只要沒改掉development或改掉帳密有九成會掛
4. Controller Model View用法直接去看Code Igniter的說法比較容易懂


Bootstrap(FuelPHP裡面的CSS)

Bootstrap網路上非常多用舊格式的example,然而Fuelphp使用的是3.0,直接套絕對沒效果
1.由於舊版說明文本仍然是存在的,但由於做法的不同,在3.0是沒有用的
例如大部分默認以最少套用,舊版的表單直接有預設樣式這點,新版是不存在的
2.文字符號寫法有變更,拿舊版class會直接變方框需處理
3.按鈕如果沒有變立體,是因為沒有引入theme的緣故