我正在尝试使用Laravel连接到LDAP服务器。重要的是要说我使用PHP函数ldap_connect
和ldap_bind
而不是使用包来处理它。
关键是当我提供错误的用户和密码时,ldap_bind
函数会向我们提供PHP警告。我对这个警告没问题,并且在文档中,当没有发生绑定时,函数返回 false 。
但是,当触发此警告时,Laravel会抛出异常。这不是一个例外,Laravel不应该抛出异常,我不想将此作为例外处理;我只需构建一个if
条件,它将向用户返回一条消息。
Laravel是否将所有警告都视为异常?
答案 0 :(得分:3)
这是Laravel的预期行为。 Laravel会将任何错误转换为ErrorException
实例。这是Illuminate/Foundation/Bootstrap/HandleExceptions.php
类中的bootstrap()
方法。
public function bootstrap(Application $app)
{
$this->app = $app;
error_reporting(-1);
set_error_handler([$this, 'handleError']);
set_exception_handler([$this, 'handleException']);
register_shutdown_function([$this, 'handleShutdown']);
if (! $app->environment('testing')) {
ini_set('display_errors', 'Off');
}
}
error_reporting(-1);
会将PHP设置为报告所有错误(阅读更多here)。
虽然这部分代码:
set_error_handler([$this, 'handleError']);
将设置自定义错误处理程序。如果您检查handleError()
方法,很明显Laravel会将任何错误转换为ErrorException
实例。
public function handleError($level, $message, $file = '', $line = 0, $context = [])
{
if (error_reporting() & $level) {
throw new ErrorException($message, 0, $level, $file, $line);
}
}
详细了解用户定义的错误处理程序here。
希望这清楚。 :)
答案 1 :(得分:0)
不确定原因,因为我没有写它,但我认为让它以这种方式工作会使记录变得更容易。
警告会记录在php的错误日志中,但无法将其他信息作为上下文传递。
如果该警告变为异常,那么您可以将异常传递给记录器以及其他信息,例如被命中的路由,请求变量等等,并将所有内容记录在一起。您还可以通过将其指定为日志,调试,信息,通知,警告,错误,严重,警报和紧急情况以及通过monolog来决定问题的严重性,并根据您的需要处理每个问题。这将创建一个更容易阅读的日志,使您的代码更容易调试。
此外,正如其他人所指出的那样,它还允许你在try catch块中完成你的工作,我相信它也会创建更整洁,更清晰的代码,而不是试图检查一些变量=== false