View Code
一共有28个须要Install的,这个导致的结果是初始化可运行的项目大小有25M之大。
这么bigger than bigger的玩意,首先会带来支配上的不便利。
支配laravel项目的时候会有两种办法,一种是只发布除了vendor之外的项目干系的文件,然后运行composer进行vender的更新,其余一种是直接将vendor进入版本库,利用版本库的发布将所有代码发布到线上机器去。我个人方向第二种,能把代码库中的文件直接放到做事器上就能运行的多牛逼。但是这样子,代码库就变得超大了,不大便利了。
其次,这么多的vendor导致的是文档查阅的未便利。
一个框架好用不好用,文档是一个至关主要的环节。但是引用的第三方库一多了,很多利用文档官方就没有足够详细的文档解释了,然后美其名见告你,这个是引用第三方库的,给你个链接,你去第三方库的解释文档中看把。但是你要知道,在开拓过程中,文档是须要有统一性的,每一个解释文档的展示和查询规则都是有惯性的。你给个链接让我去一个不一样布局的网页,我的思维还须要进行跳跃和查找。
办理办法:忍「社区福利」30G-PHP进阶资料,助力大家达到30K吐槽点:laravel的路由可以写functionlaravel的路由非常强大,强大到无敌了。比如说呢,什么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(39;login', ['as' => 'login', 'uses' => 'UserController@login']);
但是特殊在做后台开拓的时候真是特殊无法忍受,每次增加一个路由都须要在route中加入这么一条玩意。
末了我取折衷的办法,在后台开拓的时候,多利用这样的语句:
Route::controller('series', 'SeriesController’);
这样,在controller中定义的getXXX和postXXX就能自动解析了,就不须要那么繁杂的写route路径了。
办理办法:多利用Route::controller吐槽点:日志记录信息太多了看看默认的laravel.log中的一个缺点:
我能骂脏话么,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就足够了
吐槽点: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最全的大厂口试题喜好我的文章就关注我吧,持续更新中.....