Laravel吐槽系列之(一)

最近專案中經常使用到了laravel框架,對於這個框架之前只是弱弱地接觸了一點,沒有深入接觸,這下有時間好好研究它了(主要是不得不研究了)。說實話,laravel讓我

開啟

眼界了,之前對框架的使用一直停留在yii1。X階段。總之那句話說的對,剛接觸laravel的phper就只有兩個反應,一個是撿到寶了,一個是覺得它是垃圾。我能,就屬於後者,所以現在在努力讓自己愛上laravel。但是一切總是有那麼

硌人

的地方,我就想寫寫一些東西來吐槽laravel。

吐槽點:laravel的vendor引用的元件過多

laravel是遵循composer來寫的一個框架,問題是這個框架又引入了其他的幾個元件,然後其他的元件又引入了一些元件,反正下面是我composer create的時候需要引入的元件,自己看看吧。。。

View Code

一共有28個需要Install的,這個導致的結果是初始化可執行的專案大小有25M之大。

這麼bigger than bigger的玩意,首先會帶來部署上的不便利。

部署laravel專案的時候會有兩種方式,一種是隻釋出除了vendor之外的專案相關的檔案,然後執行composer進行vender的更新,另外一種是直接將vendor進入版本庫,使用版本庫的釋出將所有程式碼釋出到線上機器去。我個人傾向第二種,能把程式碼庫中的檔案直接放到伺服器上就能執行的多牛逼。但是這樣子,程式碼庫就變得超大了,不大便利了。

其次,這麼多的vendor導致的是文件查閱的不方便。

一個框架好用不好用,文件是一個至關重要的環節。但是引用的第三方庫一多了,很多使用文件官方就沒有足夠詳細的文件說明了,然後美其名告訴你,這個是引用第三方庫的,給你個連結,你去第三方庫的說明文件中

看把

。但是你要知道,在開發過程中,文件是需要有統一性的,每一個說明文件的展示和查詢規則都是有慣性的。你給個連結讓我去一個不一樣佈局的網頁,我的思維還需要進行跳躍和查詢。

解決辦法:忍

「社群福利」30G-PHP進階資料,助力大家達到30K

吐槽點:laravel的路由可以寫function

laravel的路由非常強大,強大到無敵了。比如說呢,什麼controller,action啥的都是浮雲,哥可以在app/route。php裡面直接寫上路由對應的funciton,啥controller都不用寫了,一個檔案可以do everything。但是,什麼都能做的框架就是把規則的制定推給使用者。比如在route中可以允許寫function,我第一次看到的時候覺得渾身都不對了,一個制定路由的檔案,你就制定哪個路由到哪個action就好,幹毛在一個叫route。php的檔案裡面,制定具體的執行方法。我估摸很多團隊都會約定不允許在route裡面寫funciton,因為這樣就個路由的設定就很雞肋了。

解決辦法:團隊自行做一些規定來限制路由的功能。

吐槽點:laravel沒有預設路由

我這裡說的是比如yii中有預設路由的方式controller/action。比如user/index 預設就對應到userController 的IndexAction中去。但是在laravel中,它將這種名稱依賴的預設路由去掉了。所有laravel中使用的路由都需要手動在route。php中制定諸如這樣的命令:

Route::get(‘login’, [‘as’ => ‘login’, ‘uses’ => ‘UserController@login’]);

但是特別在做後臺開發的時候真是特別無法忍受,每次增加一個路由都需要在route中加入這麼一條玩意。

最後我取折衷的辦法,在後臺開發的時候,多使用這樣的語句:

Route::controller(‘series’, ‘SeriesController’);

這樣,在controller中定義的getXXX和postXXX就能自動解析了,就不需要那麼繁雜的寫route路徑了。

解決辦法:多使用Route::controller

吐槽點:日誌記錄資訊太多了

看看預設的laravel。log中的一個錯誤:

Laravel吐槽系列之(一)

我能罵髒話麼,laravel中由於使用了大量的元件,導致laravel的堆疊非常長,然後呢,錯誤日誌中就把堆疊打印出來了,汗,上面那麼多的錯誤資訊,竟然沒有記錄當前的請求URL和請求引數。看著這麼多錯誤資訊的日誌,我竟然無言以對,我應該看哪裡,去哪裡找出這個錯誤呢?

對於日誌儲存,laravel使用monlog,雖然說是很強大了,但是它還有個問題,就是如果你想要讓日誌記錄到不同日誌檔案實現起來比較複雜。首先你可能會想到使用useFiles或者useDailyFiles來記錄到不同的檔案,但是Log是Facade模式的,一旦修改了useFile,你就要修改回來才行。其次,你可能會想到使用這個文章中的方法:

http://laravel。io/forum/02-09-2014-laraverl-custom-logs,new一個,再Info,好吧,實際後來我也是用類似的方法封裝了下。最後,你的方法可能就是寫個log的ServiceProvider,覆蓋或者重寫原先的

哪個

Log。

總之達成目的的方法一定不止一個,but,總之,原先的

哪個

Log還是不爽。

解決方法:自定義日誌編輯類

首先自定義了日誌編輯類:<?phpnamespace Yejiafneng\Helpers; use Monolog\Logger;use Monolog\Handler\StreamHandler;use Illuminate\Log\Writer; class BLogger{ // 所有的LOG都要求在這裡註冊 const LOG_ERROR = ’error‘; const LOG_SHOP = ’shop‘; const LOG_QUERY = ’query‘; const LOG_LOGIN = ’login‘; private static $loggers = array(); // 獲取一個例項 public static function getLogger($type = self::LOG_ERROR, $day = 30) { if (empty(self::$loggers[$type])) { self::$loggers[$type] = new Writer(new Logger($type)); } $log = self::$loggers[$type]; $log->useDailyFiles(storage_path()。’/logs/‘。 $type 。’。log‘, $day); return $log; }}

然後在app/start/global.php中修改錯誤日誌回撥函式為:

// 錯誤日誌資訊App::error(function(Exception $exception, $code){ // 如果沒有路徑就直接跳轉到登入頁面 if ($exception instanceof NotFoundHttpException) { return Redirect::route(’login‘); } Log::error($exception); $err = [ ’message‘ => $exception->getMessage(), ’file‘ => $exception->getFile(), ’line‘ => $exception->getLine(), ’code‘ => $exception->getCode(), ’url‘ => Request::url(), ’input‘ => Input::all(), ]; BLogger::getLogger(BLogger::LOG_ERROR)->error($err);});

這裡沒有修改laravel自身的錯誤日誌記錄,因為保留一個全集的錯誤應該還是有必要的,但是實際上我使用過程中只要看自己定義的error。log就足夠了

Laravel吐槽系列之(一)

Laravel吐槽系列之(一)

吐槽點:ORM的where太弱

laravel的ORM使用的是Eloquent ORM。如果你要獲取出Student表中female=1 並且 teacher_id為4 並且class_id為3的所有學生,你需要這麼寫:

Student::where(’female‘, 1)->where(’teacher_id‘, 4)->where(’class_id‘, 3)->get();

好難受,如果一個還行,要是多個呢?。。。難道就不能在一個where中使用個數組麼?

解決辦法:在基類中擴充套件一個multiwhere

於是我就在BaseModel中定義了:

// 多where public function scopeMultiwhere($query, $arr) { if (!is_array($arr)) { return $query; } foreach ($arr as $key => $value) { $query = $query->where($key, $value); } return $query; }

這樣子,上面的語句就可以這麼使用:

Student::multiwhere([‘female’=>1, ’teacher_id’ => 4, ‘class_id’ => 3])->get();

一下子腰也不酸了,頭也不疼了。。。

後記

laravel還是能讓一個phper學習到很多的,我努力著愛之深責之切的原則,後續使用laravel中使用不爽的地方再繼續吐槽和討論。

PHP最全的大廠面試題

喜歡我的文章就關注我吧,持續更新中。。。。。