Laravel 工匠迁移失败

Posted

技术标签:

【中文标题】Laravel 工匠迁移失败【英文标题】:Laravel artisan migrate fail 【发布时间】:2016-04-06 17:29:43 【问题描述】:

我遇到了这个问题:http://pastebin.com/B5MKqD0T

php 致命错误:未捕获的 TypeError:参数 1 传递给 Illuminate\Exception\WhoopsDisplayer::display() 必须是 异常,给出 ParseError 的实例

但我不知道如何解决它,我是 laravel 和 composer 等的新手。

我正在使用 laravel 4.0(因为我正在关注我朋友的旧教程)

【问题讨论】:

如果您对我在下面的回答感到满意,您可以接受:) Laravel 发布了 4.2.20 解决了这个问题。 twitter.com/laravelphp/status/791302938027184128Dylan Buth 的回答是正确的 【参考方案1】:

ParseErrorwas introduced 在 PHP 7 中。另一方面,您使用的是不支持 PHP7 的 Laravel 4。

Laravel 5.1 是第一个支持 PHP 7 的 Laravel 版本。

所以,有两种解决方案:

    将 Laravel 升级到 >= 5.1(强烈推荐这个!) 将 PHP 降级到 5.*

阅读更多关于 PHP7 中可抛出异常的信息:https://trowski.com/2015/06/24/throwable-exceptions-and-errors-in-php7/

【讨论】:

如何降级到 php 5? 这取决于您的操作系统,请指定它以便我为您提供帮助。 我使用的是 Windows 10 我也在用xampp 去xampp网站下载PHP 5.6版本:i.imgur.com/BfcfCpl.png【参考方案2】:

找到了一个很好的解决方法来禁用 laravel 错误处理程序。将此添加到您的 app/config/local/app.php 的顶部(就在返回数组(...)之前:

set_error_handler(null);
set_exception_handler(null);

【讨论】:

这是一个很好的解决方案,如果你不想或不能降级到 PHP 5.*,以及更新到 Laravel 5.* 的工作量太大【参考方案3】:

还有另一种方法,您可以用自己的方法包装 Laravel 异常处理程序,将新的 Error 类型转换为 Exception 实例,然后再传递回 Laravel。

在应用程序的某处创建以下类:

namespace Some\Namespace;

use Error;
use Exception;

class ErrorWrapper

    private static $previousExceptionHandler;

    public static function setPreviousExceptionHandler($previousExceptionHandler)
    
        self::$previousExceptionHandler = $previousExceptionHandler;
    

    public static function handleException($error)
    
            if (!self::$previousExceptionHandler) 
                return;
            

            $callback = self::$previousExceptionHandler;

            if ($error instanceof Error) 
                 $callback(new Exception($error->getMessage(), $error->getCode()));
            
            else 
                 $callback($error);
           
      

在 config/app.php 的开头,您可以将包装类注册为默认错误处理程序:

$existing = set_exception_handler( 
    ['Some\Namespace\ErrorWrapper', 'handleException']);

ErrorWrapper::setPreviousExceptionHandler( $existing );

【讨论】:

【参考方案4】:

Laravel 发布了 4.2.20 解决了这个问题。 https://twitter.com/laravelphp/status/791302938027184128

【讨论】:

以上是关于Laravel 工匠迁移失败的主要内容,如果未能解决你的问题,请参考以下文章

如何在没有工匠的情况下运行 laravel 迁移(使用代码)

调试 Laravel 5 工匠迁移意外 T_VARIABLE FatalErrorException

Laravel 5.7 工匠迁移

Laravel工匠迁移不创建新表

Laravel 5.2 工匠“迁移”不起作用

工匠迁移:laravel 5.3 中的回滚错误