我使用laravel开发了一个非常大的Web应用程序。记录到单个文件或每日文件对我来说似乎太乱了。
我的目的是创建错误日志,这些日志将被分类并易于检索,以便在前端显示以获得技术支持。例如。用户输入了错误的api-key,电子邮件等等。
P.S。用户并不总是理解所显示错误的含义,因此他们会联系技术支持。
更好理解的示例:
假设我有模型关系:
User->hasMany->Project
和某些模型关系 项目出现异常,我希望它被编写和相关 该项目。等等。所以我可以做$some_project_model->logs()->get()
这样的事情,技术支持得到所有相关的日志 某个项目。
我想到的是日志的单独表格,它与某些Eloquent模型有关。但是要做到这一点,ExceptionHandler需要知道与Exception相关的模型。
那么如何实现呢?也许我可以将自定义的ExceptionHandler分配给某个类?
感谢您提出任何建议。
答案 0 :(得分:1)
所以我实际上找到了一个合适的解决方案:
首先,需要创建具有多态关系的Log表。然后在某些上下文中捕获所有异常__call
可以使用魔术方法。 __call
方法允许使用自定义代码包装每个对象方法调用。在这种情况下尝试捕获。
示例:强>
class Loggable
{
public function __call($method, $arguments)
{
try {
return call_user_func_array([$this->certain_obj, $method], $arguments);
} catch (Exception $e) {
//creating new $log orm
$this->get_orm()->loggable()->save($log);
}
}
protected function do_something() {
//something is going on
throw new \Exception();
}
}
$loggable_obj = new Loggable();
$loggable_obj->do_something();
要使其正常工作,您必须将所有可记录方法设为私有或受保护。
如果您认为'封装'不仅仅是另一个难以理解的单词,您可以使用代理类获得相同的结果。
示例:强>
class Proxy
{
private $some_obj;
public function __construct($some_obj)
{
$this->some_obj = $some_obj;
}
public function __call($method, $arguments)
{
try {
return call_user_func_array([$this->some_obj, $method], $arguments);
} catch (Exception $e) {
//creating new $log orm
$this->some_obj->get_orm()->loggable()->save($log);
}
}
}
$proxy = new Proxy($some_obj);
$proxy->whatever_method($foo, $bar);
因此,在这两种情况下,我都可以通过调用->logs()->get()
来获取与某些精确orm相关的所有日志。
根本不是火箭科学。
答案 1 :(得分:0)
一种方法可能是创建自己的自定义异常(子)类,您可以在抛出异常时添加模型和/或项目信息。然后,此信息将在ExceptionHandler中提供。
但是,对于内置或第三方异常类型,您不会拥有它。对于那些你最终必须抓住并重新抛出可能(和必要)的人来说,包装你的自定义异常类,这可能并不理想。