Laravel 的文档也有很多没提到的"坑"啊

2017-03-15 13:46:43 +08:00
 changwei

今天用 Laravel 的查询构造器写事务提交代码,出现了一个坑。

Laravel 官方文档 http://laravelacademy.org/post/6133.html 事务提交最重要的失败之后捕获错误的案例代码没有提供。而且 Laravel 本身自己搞了一套异常处理类,但是在文档里面没有明确指出该使用哪个异常处理类捕获事务提交失败的代码,我还是借助搜索引擎查到 https://segmentfault.com/a/1190000008268648 文章中讲到用\Illuminate\Database\QueryException来捕获异常。而文档开头对异常处理的讲解篇幅也很少, http://laravelacademy.org/post/5774.html 只讲了用户如何自己定义自己的异常处理类,没有列出 Laravel 本身的某些服务需要用哪些异常处理类捕获。如果没有这篇文章的话,我都可能要自己去一个一个的翻源码了。(然而 Laravel 看源码也麻烦,得先看 Facades 上代理了哪些类的哪些方法,然后一个一个去找实现类,然而实现类里面又是层层调用和跳转,对于涉世未深的 PHPer 来说真的很麻烦)

还有就是 session 部分, Laravel 中自己实现了一套 session 驱动,虽然在文档中也说明了。但是没有明确指出 file 驱动使用的并不是 php 自带的 session 处理句柄(在别的框架中file驱动默认都是用php原生session处理),导致在 sf.gg 等网站上有大量提问都是关于“为什么 Laravel 中无法使用 php 原生 session 处理函数”的问题。还有就是文档中没有写明如果中途使用 exit 等函数强制终止脚本 之前必须要用 Session::save()立即保存 session 数据,这个在 sf.gg 上也有很多人提问。

你们是如何看待这些“坑”?其他框架的文档中是否也有类似的情况?(此贴不是单纯对开源项目的吐槽还请大家轻喷,我当然愿意为官方文档的完善贡献一些力量)

2630 次点击
所在节点    分享发现
7 条回复
xzem
2017-03-15 13:55:32 +08:00
坑肯定有的, 而且官方文档一般也不会讲的那么详细.
changwei
2017-03-15 14:48:06 +08:00
@xzem 这个不能叫详细把,这些都属于基本内容。看看 http://www.kancloud.cn/manual/thinkphp5/139063 ThinkPHP 的案例代码都很详细,包括 CodeIgniter 等框架的文档都是如此。 Laravel 的文档很多地方给人的感觉就是点到为止,比较适合有很多 PHP 框架开发经验的开发者用。
xzem
2017-03-15 16:28:46 +08:00
@changwei 对啊,我说的就是"不会讲的那么详细", ThinkPHP 感觉也不是很详细. 你发的链接不是用 \Exception 来捕获的吗? 同样 laravel 也可以用 \Exception 捕获啊
changwei
2017-03-15 23:46:36 +08:00
@xzem 但是关于数据库事物执行的异常,用 exception 真的无法捕获到,这个是官方文档没有提到过的东西。
xzem
2017-03-16 09:39:30 +08:00
@changwei 下面手机打字,有错误请见谅。
我看你说用 Illuminate\Database\QueryException 来捕获事务异常,然后我去看了下这个异常类。 它继承了 PDOException , PDOException 继承了 RuntimeException, RuntimeException 继承了 Exception . 所以直接用 Exception 捕获是可以捕获的,就像你发的那个 thinkphp 的例子就是用 Exception 捕获异常的。 php 的所有异常类都基于 Exception 这个基础异常类的扩展类,所以用 Exception 应该能捕获所有能捕获的异常
changwei
2017-03-16 21:17:57 +08:00
@xzem 查明原因了, exception 要加个反斜杠,因为它是根命名空间的类。。。看来我错怪了 Laravel ,不过第二个 session 的坑确实坑了我好久。。。
xzem
2017-03-16 21:38:53 +08:00
@changwei 如果你没有从根命名空间指定类, 或没有 use 这个类, 那么使用的时候会从当前类的命名空间下找这个类, 会报错找不到 xxx\xxx\Exception 类.

session 的问题应该是由于 laravel 的的 session 是基于 middleware 来实现的, 而 session 的保存是在 laravel 的最后那个结束时会调用的(这里是我猜的), 所以在中途 exit 会导致 session 没有保存进文件,下次使用的时候会取不到.

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/347607

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX