全球便利的方法
好了,你不能真正做到monkey patching在PHP(5.2至少),这可能是为有你后保持你的代码开发者是好事不见了。 :)
CakePHP - 作为一个具有严格约定的MVC框架 - 使您很难打破MVC范例,只允许您扩展需要隔离的部分(即AppModel
,AppController
等)并保留面向对象的基础在核心中未被触及(这使得难以添加“可以在任何地方使用”以防潜在滥用的代码)。
至于增加超越所有MVC分离的功能,这个地方是app/config/bootstrap.php
。当你在这里放置代码时,它看起来很清楚它不是框架的一部分(非常正确),但是允许你在CakePHP加载之前添加这些要素。什么在这里做一些选项可能是:(。例如,一些自定义功能,如error()
在你喜欢的方式调用CakeLog::write()
)。
- 创建功能
- 加载类(如加载所谓像..
Log
,这样你就可以在地方叫Log::error()
自己的日志类)
- 见下文:
记录器API
Cake允许将许多自定义设置为诸如记录器之类的东西,但不幸的是,在这种情况下,暴露给我们的API已经在核心中定义。在CakePHP中记录的API如下,你可以在任何地方使用任何方法,你喜欢(当然,前者只在类):
$this->log($msg, $level) // any class extending `Object` inherits this
// or
CakeLog::write($level, $message); // this is actually what is called by the above
您试图杜绝乱$level
参数实际上是quite a powerful feature:
$this->log('Cannot connect to SMTP server', 'email'); // logs to app/logs/email.log
// vs
$this->email('Cannot connect to SMTP server'); // ambiguous - does this send emails?
我们刚刚创建了一个全新的日志类型,而无需编写代码的一个额外的行,它是很清楚的我们的代码的意图是什么。
定制记录器
的核心开发人员有先见之明add a condition使我们能够完全替代记录器类,我们应该想:
function log($msg, $type = LOG_ERROR) {
if (!class_exists('CakeLog')) { // winning
require LIBS . 'cake_log.php';
}
// ...
正如你可以看到,核心CakeLog
类只有在没有这样的类的情况下才会被实例化,让您有机会插入自己创建的东西(或者进行一些调整的精确副本 - 尽管您想在升级时手动同步更改) -
// app/config/bootstrap.php
App::import('Lib', 'CakeLog'); // copy cake/libs/cake_log.php to app/lib/cake_log.php
以上将让您欣赏到CakeLog
类的在你的应用程序,实现完全控制,所以你可以不喜欢动态地添加调用的类名到你的日志消息。然而,这样做(和其他类型的日志记录 - 如数据库)的更直接的方式将create a custom log stream:
CakeLog::config('file', array(
'engine' => 'FileLog', // copy cake/libs/log/file_log.php to app/libs/log/file_log.php
));
TL; DR - 尽管你可以CakePHP的引导程序之前加载自己的代码或者在提供的每个MVC图层中独立使用,您都不应该篡改核心提供的对象层次结构。这使得很难添加全局继承的类方法。
我的建议:使用API给你,并专注于增加更多的功能,而不是语法上的细微之处。 :)
谢谢deizel,这是我从中学到了很多东西的广泛见解。使用日志消息的类名只是帮助跟踪错误消息。你是对的,功能更重要,但我只是好奇,想扩大我对cakephp的知识:) – 2012-01-11 10:34:24
没问题。添加调用类名是个好主意。我会采取创建自定义日志流的方法,它不应该太难:https://github.com/cakephp/cakephp/blob/340a9fd60425e73bea5e2f130fc6c4ece8e769d1/cake/libs/log/file_log.php#L61 – deizel 2012-01-11 12:59:52