我用laravel开发了一个相当大的web应用程序。对我来说,登录到单个文件或日常文件似乎太麻烦了。
我的目的是创建错误日志,这将是分类和容易检索显示在前端技术支持。用户输入错误的api-键,电子邮件,什么的。
用户并不总是理解显示的错误的含义,所以他们联系了技术支持。
更好理解的示例: 假设我有模型关系:
User->hasMany->Project
,在某些项目中出现了一个异常,我希望它是与项目相关的。e.t.c.所以我可以做一些类似$some_project_model->logs()->get()
和技术支持的事情,得到所有与特定项目相关的日志。
我脑子里想的是独立的圆木桌子,它与某些雄辩的模型有关。但要做到这一点,ExceptionHandler需要知道异常与哪个模型相关。
那么这是如何实现的呢?也许我可以将自定义ExceptionHandler分配给特定的类?
谢谢你的建议。
发布于 2017-08-06 23:03:49
所以我找到了一个合适的解决方案:
首先,需要创建具有多态关系的日志表。然后,可以使用__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相关的所有日志。
根本不是一门火箭科学。
发布于 2017-07-31 23:57:47
一种方法可能是创建您自己的自定义异常(子)类,您可以在抛出异常时将模型和/或项目信息添加到该类中。然后,这些信息就可以在ExceptionHandler中获得。
但是,对于内置或第三方异常类型,您不会使用它。对于那些最终不得不捕获和重新抛出可能(必要的),包装在您的自定义异常类,这可能是不理想的。
https://stackoverflow.com/questions/45425226
复制相似问题