我在Postgresql 9.3数据库中有两个表,公司和站点。他们与一侧的公司之间存在一对多的关系。如果已将网站分配给公司,则有一个外键约束可以防止删除公司。如果尝试直接在数据库上使用SQL查询删除ID为“ KSL”的公司,则会出现预期的错误:
错误:表“ companies”上的更新或删除违反了表“ sites”上的外键约束“ sites_company_id_fkey” 详细信息:密钥(company_id)=(KSL)仍从表“站点”中引用。
我定义了一个工匠命令,其处理程序方法具有一个简单的try / catch块:
public function handle()
{
$company = Company::find('KSL');
try{
$company->delete();
}catch(\PDOException $e){
$this->info($e->getMessage());
}
}
当我从控制台运行命令时,我得到了预期的错误消息:
SQLSTATE [23503]:外键冲突:7错误:表“ companies”上的更新或删除违反了表“ sites”上的外键约束“ sites_company_id_fkey” 详细信息:密钥(company_id)=(KSL)仍从表“站点”中引用。 (SQL:从“ companies”中删除,其中“ company_id” = KSL)
反映了Postgresql生成的本机错误消息。 但是,当我使用类似的try / catch块通过Ajax调用从Controller调用Controller的delete方法时,未捕获到异常,并且调用失败,并且没有错误的详细信息。 我简化了控制器方法,使其与控制台处理程序相同:
public function deleteModel(Request $request) {
try {
$id = 'KSL';
$company = Company::find($id);
$result = $company->delete();
return 'success';
} catch (\PDOException $e) {
return $e->getMessage();
}
}
通常,我将从请求参数中获取$ id的值。
如果在浏览器中使用带有RESTful URL的get请求,则在Firefox中会收到“连接已重置”消息,而在Chrome中会收到类似的消息。
我已经提到了我认为可以解决的old question,但是运行composer dump-autoload
无效。我已经清除了缓存,重新安装了Laravel 5.5,更新了安装程序,并多次调用composer dump-autoload
,但是由于没有任何异常或记录的错误消息,所以我没有任何线索。此开发应用程序的Debug设置为true。
我在bootstrap文件夹中的autoload.php文件中将处理程序传递给了PHP原生函数register_shutdown_function,
register_shutdown_function(function () {
$error = error_get_last();
file_put_contents(__DIR__.'/../storage/crash.log', var_export($error, true));
});
crash.log中仅显示单词“ NULL”。我检查了Apache 2.4 error.log文件以及该Laravel应用程序的特定错误日志,但是那里没有记录任何相关的详细信息。
这是异常处理程序:
<?php
namespace App\Exceptions;
use Exception;
use Illuminate\Foundation\Exceptions\Handler as ExceptionHandler;
class Handler extends ExceptionHandler
{
/**
* A list of the exception types that are not reported.
*
* @var array
*/
protected $dontReport = [
//
];
/**
* A list of the inputs that are never flashed for validation exceptions.
*
* @var array
*/
protected $dontFlash = [
'password',
'password_confirmation',
];
/**
* Report or log an exception.
*
* This is a great spot to send exceptions to Sentry, Bugsnag, etc.
*
* @param \Exception $exception
* @return void
*/
public function report(Exception $exception)
{
parent::report($exception);
}
/**
* Render an exception into an HTTP response.
*
* @param \Illuminate\Http\Request $request
* @param \Exception $exception
* @return \Illuminate\Http\Response
*/
public function render($request, Exception $exception)
{
return parent::render($request, $exception);
}
}
更新1: 我从这个问题中得到了一个线索:Stack size for Apache under Windows。我快速测试了我的在线应用程序(都在Linux机器上运行),没有问题。正确引发了异常,并为用户显示了一条清晰的清除消息。我的本地环境是Windows,与Linux环境相比,Apache遭受此连接重置错误的痛苦更大。根据该问题的答案,我增加了Apache的堆栈大小,但仍然无法正常工作。我仍然收到连接重置错误。我已经从正在运行PHP 7.3的Apache lounge重新安装了Apache的最新二进制文件。谁能对此有所启发?
更新2:
卢卡斯对this question的回答鼓励我更换服务器。当我从控制台运行php artisan serve
并调用ParentTable->delete()
方法时,我得到了预期的异常而没有崩溃。我的Apache配置显然有问题。不幸的是,该问题的公认答案不能解决我的问题。我增加了堆栈大小,但问题仍然存在。