laravel吐槽系列之一

本文涉及的产品
日志服务 SLS,月写入数据量 50GB 1个月
简介:
最近项目中经常使用到了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导致的是文档查阅的不方便。
一个框架好用不好用,文档是一个至关重要的环节。但是引用的第三方库一多了,很多使用文档官方就没有足够详细的文档说明了,然后美其名告诉你,这个是引用第三方库的,给你个链接,你去第三方库的说明文档中看把。但是你要知道,在开发过程中,文档是需要有统一性的,每一个说明文档的展示和查询规则都是有惯性的。你给个链接让我去一个不一样布局的网页,我的思维还需要进行跳跃和查找。

解决办法:忍 

吐槽点: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的堆栈非常长,然后呢,错误日志中就把堆栈打印出来了,汗,上面那么多的错误信息,竟然没有记录当前的请求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还是不爽。 

解决方法:自定义日志编辑类

首先自定义了日志编辑类:
复制代码
<?php
namespace 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中使用不爽的地方再继续吐槽和讨论。

 


本文转自轩脉刃博客园博客,原文链接:http://www.cnblogs.com/yjf512/p/4031782.html,如需转载请自行联系原作者
相关实践学习
通过日志服务实现云资源OSS的安全审计
本实验介绍如何通过日志服务实现云资源OSS的安全审计。
相关文章
|
9月前
|
人工智能 前端开发 Unix
使用tree命令把自己的代码归类文件目录的方法-优雅草央千澈以优雅草AI智能功能为例给大家展示tree命令实际用法
使用tree命令把自己的代码归类文件目录的方法-优雅草央千澈以优雅草AI智能功能为例给大家展示tree命令实际用法
333 29
使用tree命令把自己的代码归类文件目录的方法-优雅草央千澈以优雅草AI智能功能为例给大家展示tree命令实际用法
|
11月前
|
资源调度 JavaScript
|
6月前
|
人工智能 固态存储 iOS开发
5分钟搞定Photoshop 2025安装:官方下载+许可证激活避坑指南
Adobe Photoshop 2025 是 Adobe 公司推出的最新图像处理软件,广泛应用于平面设计、摄影后期和 UI 设计等领域。其核心功能包括智能 AI 工具(一键抠图、生成填充等)、高效工作流(优化图层管理与色彩调整)、跨平台兼容(支持 Windows 11 和 macOS 15)以及云协作功能(与 Adobe Creative Cloud 集成)。本文详细介绍软件的安装流程、系统要求、正版激活方法及常见问题解决方案,并提供扩展学习资源,帮助用户更好地掌握这款强大工具。
21387 2
|
9月前
|
存储 资源调度 JavaScript
一文带你了解PNPM以及 npm,yarn,pnpm区别
一文带你了解PNPM以及 npm,yarn,pnpm区别
603 9
|
11月前
|
JavaScript 前端开发 C#
从入门到放弃,我们为何从 Blazor 回到 Vue
【10月更文挑战第29天】在前端开发中,许多开发者从尝试新技术 Blazor 最终回到熟悉的 Vue。主要原因包括:1) Blazor 学习曲线陡峭,Vue 上手容易;2) Vue 开发工具成熟,开发效率高;3) Vue 性能优异,优化简单;4) Vue 社区庞大,生态丰富;5) 项目需求和团队协作更适配 Vue。选择技术栈需综合考虑多方面因素。
867 0
|
安全 API PHP
【PHP 开发专栏】PHP 模板引擎的使用
【4月更文挑战第30天】本文探讨了PHP模板引擎在Web开发中的重要性,解释了其基础知识,包括分离代码逻辑与显示、工作原理和优势。文章介绍了Smarty、Twig和Plates三个常见模板引擎的特点、使用方法及示例代码。模板引擎常用于动态页面生成、CMS系统和电商网站开发。在使用时需关注性能优化、安全和版本管理。选择合适的模板引擎能提升开发效率和代码质量。
227 2
|
11月前
|
JavaScript Java CDN
vue3完整教程从入门到精通(新人必学1,vue3快速上手)
本文提供了Vue 3从入门到精通的完整教程,涵盖了创建Vue应用、通过CDN使用Vue、定义网站以及使用ES模块构建版本的步骤和示例代码。
8359 1
vue3完整教程从入门到精通(新人必学1,vue3快速上手)
|
JavaScript 前端开发 API
新一代前端框架Vue 4.0的特性及应用
【2月更文挑战第2天】随着前端技术的不断发展,Vue作为一款优秀的前端框架在市场上得到了广泛的应用和认可。本文将介绍新一代前端框架Vue 4.0的特性及其在实际项目中的应用,帮助开发者更好地了解并应用这一技术。
1482 2