Laravel 5.5为什么删除方法中的外键违规不会引发异常?

时间:2019-01-10 14:06:04

标签: laravel-5.5 postgresql-9.3 apache2.4 php-7.0

我在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配置显然有问题。不幸的是,该问题的公认答案不能解决我的问题。我增加了堆栈大小,但问题仍然存在。

0 个答案:

没有答案