首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Laravel模型相关日志

Laravel模型相关日志
EN

Stack Overflow用户
提问于 2017-07-31 21:01:44
回答 2查看 742关注 0票数 2

我用laravel开发了一个相当大的web应用程序。对我来说,登录到单个文件或日常文件似乎太麻烦了。

我的目的是创建错误日志,这将是分类和容易检索显示在前端技术支持。用户输入错误的api-键,电子邮件,什么的。

用户并不总是理解显示的错误的含义,所以他们联系了技术支持。

更好理解的示例: 假设我有模型关系:User->hasMany->Project,在某些项目中出现了一个异常,我希望它是与项目相关的。e.t.c.所以我可以做一些类似$some_project_model->logs()->get()和技术支持的事情,得到所有与特定项目相关的日志。

我脑子里想的是独立的圆木桌子,它与某些雄辩的模型有关。但要做到这一点,ExceptionHandler需要知道异常与哪个模型相关。

那么这是如何实现的呢?也许我可以将自定义ExceptionHandler分配给特定的类?

谢谢你的建议。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-08-06 23:03:49

所以我找到了一个合适的解决方案:

首先,需要创建具有多态关系的日志表。然后,可以使用__call魔术方法来捕获特定上下文中的所有异常。__call方法允许用自定义代码包装每个对象方法调用。在这种情况下试着抓住。

示例:

代码语言:javascript
运行
复制
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();

要使其工作,必须使所有可争用的方法都是私有的或受保护的。

如果您认为“封装”不仅仅是另一个难懂的词,那么您可以使用代理类实现相同的结果。

示例:

代码语言:javascript
运行
复制
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相关的所有日志。

根本不是一门火箭科学。

票数 2
EN

Stack Overflow用户

发布于 2017-07-31 23:57:47

一种方法可能是创建您自己的自定义异常(子)类,您可以在抛出异常时将模型和/或项目信息添加到该类中。然后,这些信息就可以在ExceptionHandler中获得。

但是,对于内置或第三方异常类型,您不会使用它。对于那些最终不得不捕获和重新抛出可能(必要的),包装在您的自定义异常类,这可能是不理想的。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45425226

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档