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】:ParseError
was 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 迁移(使用代码)