将 Laravel 5.5 升级到 5.6 错误
Posted
技术标签:
【中文标题】将 Laravel 5.5 升级到 5.6 错误【英文标题】:Upgrading Laravel 5.5 to 5.6 error 【发布时间】:2018-07-13 16:09:08 【问题描述】:我正在尝试将我的 Laravel 5.5
升级到 5.6.
我已按照 laravel 网站上的说明进行操作,但出现此错误:
Your requirements could not be resolved to an installable set of packages.
Problem 1
- The requested package laravel/framework 5.6.* is satisfiable by laravel/framework[5.6.x-dev] but these conflict with your requirements or minimum-stability.
所以,我根据this laracast 讨论的第一个答案更改了我的composer.json
文件并添加了两行:**"minimum-stability": "dev", "prefer-stable": true,**
。
在我遇到另一个错误之前,一切似乎都运行良好:
Loading composer repositories with package information
Updating dependencies (including require-dev)
Package operations: 0 installs, 6 updates, 0 removals
- Updating sebastian/diff (2.0.1 => 3.0.0): Downloading (100%)
- Updating phpunit/phpunit-mock-objects (5.0.6 => 6.0.0): Downloading (100%) - Updating phpunit/php-timer (1.0.9 => 2.0.0): Downloading (100%)
- Updating phpunit/php-token-stream (2.0.2 => 3.0.0): Downloading (100%) - Updating phpunit/php-code-coverage (5.3.0 => 6.0.1): Downloading (100%) - Updating phpunit/phpunit (6.5.6 => 7.0.0): Downloading (100%)
Writing lock file
Generating optimized autoload files
> Illuminate\Foundation\ComposerScripts::postAutoloadDump
> @php artisan package:discover
In trustedproxy.php line 66:
Undefined class constant 'HEADER_CLIENT_IP'
Script @php artisan package:discover handling the post-autoload-dump event returned with error code 1
第 66 行的问题是 Illuminate\Http\Request::HEADER_CLIENT_IP => 'X_FORWARDED_FOR',。 我在***上搜索了其他帖子,但仍然没有运气。我尝试的最后一件事是作曲家自我更新和作曲家全局更新,在帖子composer dump-autoload not recognized command中提到了
另外,我不能删除 "minimum-stability": "dev","prefer-stable": true 因为如果我这样做了,我会收到以下错误:
- Installation request for laravel/framework 5.6.* -> satisfiable by laravel/framework[5.6.x-dev].
- Removal request for laravel/framework == 5.6.9999999.9999999-dev
我已经分别附上了我的 composer.json 文件和trustedproxy.php。任何帮助将不胜感激。
"name": "laravel/laravel",
"description": "The Laravel Framework.",
"minimum-stability": "dev",
"prefer-stable": true,
"keywords": ["framework", "laravel"],
"license": "MIT",
"type": "project",
"require":
"php": ">=7.1.3",
"fideloper/proxy": "~3.3",
"laravel/framework": "5.6.*",
"laravel/tinker": "~1.0"
,
"require-dev":
"filp/whoops": "~2.0",
"fzaninotto/faker": "~1.4",
"mockery/mockery": "~1.0",
"phpunit/phpunit": "~7.0",
"symfony/thanks": "^1.0"
,
"autoload":
"classmap": [
"database/seeds",
"database/factories"
],
"psr-4":
"App\\": "app/"
,
"autoload-dev":
"psr-4":
"Tests\\": "tests/"
,
"extra":
"laravel":
"dont-discover": [
]
,
"scripts":
"post-root-package-install": [
"@php -r \"file_exists('.env') || copy('.env.example', '.env');\""
],
"post-create-project-cmd": [
"@php artisan key:generate"
],
"post-autoload-dump": [
"Illuminate\\Foundation\\ComposerScripts::postAutoloadDump",
"@php artisan package:discover"
]
,
"config":
"preferred-install": "dist",
"sort-packages": true,
"optimize-autoloader": true
trustedproxy.php (error in line 66--> Illuminate\Http\Request::HEADER_CLIENT_IP => 'X_FORWARDED_FOR',)
<?php
return [
/*
* Set trusted proxy IP addresses.
*
* Both IPv4 and IPv6 addresses are
* supported, along with CIDR notation.
*
* The "*" character is syntactic sugar
* within TrustedProxy to trust any proxy
* that connects directly to your server,
* a requirement when you cannot know the address
* of your proxy (e.g. if using Rackspace balancers).
*
* The "**" character is syntactic sugar within
* TrustedProxy to trust not just any proxy that
* connects directly to your server, but also
* proxies that connect to those proxies, and all
* the way back until you reach the original source
* IP. It will mean that $request->getClientIp()
* always gets the originating client IP, no matter
* how many proxies that client's request has
* subsequently passed through.
*/
'proxies' => [
'192.168.1.10',
],
/*
* Or, to trust all proxies that connect
* directly to your server, uncomment this:
*/
# 'proxies' => '*',
/*
* Or, to trust ALL proxies, including those that
* are in a chain of forwarding, uncomment this:
*/
# 'proxies' => '**',
/*
* Default Header Names
*
* Change these if the proxy does
* not send the default header names.
*
* Note that headers such as X-Forwarded-For
* are transformed to HTTP_X_FORWARDED_FOR format.
*
* The following are Symfony defaults, found in
* \Symfony\Component\HttpFoundation\Request::$trustedHeaders
*
* You may optionally set headers to 'null' here if you'd like
* for them to be considered untrusted instead. Ex:
*
* Illuminate\Http\Request::HEADER_CLIENT_HOST => null,
*
* WARNING: If you're using AWS Elastic Load Balancing or Heroku,
* the FORWARDED and X_FORWARDED_HOST headers should be set to null
* as they are currently unsupported there.
*/
'headers' => [
(defined('Illuminate\Http\Request::HEADER_FORWARDED') ? Illuminate\Http\Request::HEADER_FORWARDED : 'forwarded') => 'FORWARDED',
Illuminate\Http\Request::HEADER_CLIENT_IP => 'X_FORWARDED_FOR',
Illuminate\Http\Request::HEADER_CLIENT_HOST => 'X_FORWARDED_HOST',
Illuminate\Http\Request::HEADER_CLIENT_PROTO => 'X_FORWARDED_PROTO',
Illuminate\Http\Request::HEADER_CLIENT_PORT => 'X_FORWARDED_PORT',
]
];
照亮\Http\请求文件:
<?php
namespace Illuminate\Http;
use Closure;
use ArrayAccess;
use RuntimeException;
use Illuminate\Support\Arr;
use Illuminate\Support\Str;
use Illuminate\Support\Traits\Macroable;
use Illuminate\Contracts\Support\Arrayable;
use Symfony\Component\HttpFoundation\ParameterBag;
use Symfony\Component\HttpFoundation\Request as SymfonyRequest;
class Request extends SymfonyRequest implements Arrayable, ArrayAccess
use Concerns\InteractsWithContentTypes,
Concerns\InteractsWithFlashData,
Concerns\InteractsWithInput,
Macroable;
/**
* The decoded JSON content for the request.
*
* @var \Symfony\Component\HttpFoundation\ParameterBag|null
*/
protected $json;
/**
* All of the converted files for the request.
*
* @var array
*/
protected $convertedFiles;
/**
* The user resolver callback.
*
* @var \Closure
*/
protected $userResolver;
/**
* The route resolver callback.
*
* @var \Closure
*/
protected $routeResolver;
/**
* Create a new Illuminate HTTP request from server variables.
*
* @return static
*/
public static function capture()
static::enableHttpMethodParameterOverride();
return static::createFromBase(SymfonyRequest::createFromGlobals());
/**
* Return the Request instance.
*
* @return $this
*/
public function instance()
return $this;
/**
* Get the request method.
*
* @return string
*/
public function method()
return $this->getMethod();
/**
* Get the root URL for the application.
*
* @return string
*/
public function root()
return rtrim($this->getSchemeAndHttpHost().$this->getBaseUrl(), '/');
/**
* Get the URL (no query string) for the request.
*
* @return string
*/
public function url()
return rtrim(preg_replace('/\?.*/', '', $this->getUri()), '/');
/**
* Get the full URL for the request.
*
* @return string
*/
public function fullUrl()
$query = $this->getQueryString();
$question = $this->getBaseUrl().$this->getPathInfo() == '/' ? '/?' : '?';
return $query ? $this->url().$question.$query : $this->url();
/**
* Get the full URL for the request with the added query string parameters.
*
* @param array $query
* @return string
*/
public function fullUrlWithQuery(array $query)
$question = $this->getBaseUrl().$this->getPathInfo() == '/' ? '/?' : '?';
return count($this->query()) > 0
? $this->url().$question.http_build_query(array_merge($this->query(), $query))
: $this->fullUrl().$question.http_build_query($query);
/**
* Get the current path info for the request.
*
* @return string
*/
public function path()
$pattern = trim($this->getPathInfo(), '/');
return $pattern == '' ? '/' : $pattern;
/**
* Get the current decoded path info for the request.
*
* @return string
*/
public function decodedPath()
return rawurldecode($this->path());
/**
* Get a segment from the URI (1 based index).
*
* @param int $index
* @param string|null $default
* @return string|null
*/
public function segment($index, $default = null)
return Arr::get($this->segments(), $index - 1, $default);
/**
* Get all of the segments for the request path.
*
* @return array
*/
public function segments()
$segments = explode('/', $this->decodedPath());
return array_values(array_filter($segments, function ($value)
return $value !== '';
));
/**
* Determine if the current request URI matches a pattern.
*
* @param dynamic $patterns
* @return bool
*/
public function is(...$patterns)
foreach ($patterns as $pattern)
if (Str::is($pattern, $this->decodedPath()))
return true;
return false;
/**
* Determine if the route name matches a given pattern.
*
* @param dynamic $patterns
* @return bool
*/
public function routeIs(...$patterns)
return $this->route() && $this->route()->named(...$patterns);
/**
* Determine if the current request URL and query string matches a pattern.
*
* @param dynamic $patterns
* @return bool
*/
public function fullUrlIs(...$patterns)
$url = $this->fullUrl();
foreach ($patterns as $pattern)
if (Str::is($pattern, $url))
return true;
return false;
/**
* Determine if the request is the result of an AJAX call.
*
* @return bool
*/
public function ajax()
return $this->isXmlHttpRequest();
/**
* Determine if the request is the result of an PJAX call.
*
* @return bool
*/
public function pjax()
return $this->headers->get('X-PJAX') == true;
/**
* Determine if the request is over HTTPS.
*
* @return bool
*/
public function secure()
return $this->isSecure();
/**
* Get the client IP address.
*
* @return string
*/
public function ip()
return $this->getClientIp();
/**
* Get the client IP addresses.
*
* @return array
*/
public function ips()
return $this->getClientIps();
/**
* Get the client user agent.
*
* @return string
*/
public function userAgent()
return $this->headers->get('User-Agent');
/**
* Merge new input into the current request's input array.
*
* @param array $input
* @return \Illuminate\Http\Request
*/
public function merge(array $input)
$this->getInputSource()->add($input);
return $this;
/**
* Replace the input for the current request.
*
* @param array $input
* @return \Illuminate\Http\Request
*/
public function replace(array $input)
$this->getInputSource()->replace($input);
return $this;
/**
* Get the JSON payload for the request.
*
* @param string $key
* @param mixed $default
* @return \Symfony\Component\HttpFoundation\ParameterBag|mixed
*/
public function json($key = null, $default = null)
if (! isset($this->json))
$this->json = new ParameterBag((array) json_decode($this->getContent(), true));
if (is_null($key))
return $this->json;
return data_get($this->json->all(), $key, $default);
/**
* Get the input source for the request.
*
* @return \Symfony\Component\HttpFoundation\ParameterBag
*/
protected function getInputSource()
if ($this->isJson())
return $this->json();
return $this->getRealMethod() == 'GET' ? $this->query : $this->request;
/**
* Create an Illuminate request from a Symfony instance.
*
* @param \Symfony\Component\HttpFoundation\Request $request
* @return \Illuminate\Http\Request
*/
public static function createFromBase(SymfonyRequest $request)
if ($request instanceof static)
return $request;
$content = $request->content;
$request = (new static)->duplicate(
$request->query->all(), $request->request->all(), $request->attributes->all(),
$request->cookies->all(), $request->files->all(), $request->server->all()
);
$request->content = $content;
$request->request = $request->getInputSource();
return $request;
/**
* @inheritdoc
*/
public function duplicate(array $query = null, array $request = null, array $attributes = null, array $cookies = null, array $files = null, array $server = null)
return parent::duplicate($query, $request, $attributes, $cookies, $this->filterFiles($files), $server);
/**
* Filter the given array of files, removing any empty values.
*
* @param mixed $files
* @return mixed
*/
protected function filterFiles($files)
if (! $files)
return;
foreach ($files as $key => $file)
if (is_array($file))
$files[$key] = $this->filterFiles($files[$key]);
if (empty($files[$key]))
unset($files[$key]);
return $files;
/**
* Get the session associated with the request.
*
* @return \Illuminate\Session\Store
*
* @throws \RuntimeException
*/
public function session()
if (! $this->hasSession())
throw new RuntimeException('Session store not set on request.');
return $this->session;
/**
* Get the session associated with the request.
*
* @return \Illuminate\Session\Store|null
*/
public function getSession()
return $this->session;
/**
* Set the session instance on the request.
*
* @param \Illuminate\Contracts\Session\Session $session
* @return void
*/
public function setLaravelSession($session)
$this->session = $session;
/**
* Get the user making the request.
*
* @param string|null $guard
* @return mixed
*/
public function user($guard = null)
return call_user_func($this->getUserResolver(), $guard);
/**
* Get the route handling the request.
*
* @param string|null $param
*
* @return \Illuminate\Routing\Route|object|string
*/
public function route($param = null)
$route = call_user_func($this->getRouteResolver());
if (is_null($route) || is_null($param))
return $route;
return $route->parameter($param);
/**
* Get a unique fingerprint for the request / route / IP address.
*
* @return string
*
* @throws \RuntimeException
*/
public function fingerprint()
if (! $route = $this->route())
throw new RuntimeException('Unable to generate fingerprint. Route unavailable.');
return sha1(implode('|', array_merge(
$route->methods(), [$route->getDomain(), $route->uri(), $this->ip()]
)));
/**
* Set the JSON payload for the request.
*
* @param \Symfony\Component\HttpFoundation\ParameterBag $json
* @return $this
*/
public function setJson($json)
$this->json = $json;
return $this;
/**
* Get the user resolver callback.
*
* @return \Closure
*/
public function getUserResolver()
return $this->userResolver ?: function ()
//
;
/**
* Set the user resolver callback.
*
* @param \Closure $callback
* @return $this
*/
public function setUserResolver(Closure $callback)
$this->userResolver = $callback;
return $this;
/**
* Get the route resolver callback.
*
* @return \Closure
*/
public function getRouteResolver()
return $this->routeResolver ?: function ()
//
;
/**
* Set the route resolver callback.
*
* @param \Closure $callback
* @return $this
*/
public function setRouteResolver(Closure $callback)
$this->routeResolver = $callback;
return $this;
/**
* Get all of the input and files for the request.
*
* @return array
*/
public function toArray()
return $this->all();
/**
* Determine if the given offset exists.
*
* @param string $offset
* @return bool
*/
public function offsetExists($offset)
return array_key_exists(
$offset, $this->all() + $this->route()->parameters()
);
/**
* Get the value at the given offset.
*
* @param string $offset
* @return mixed
*/
public function offsetGet($offset)
return $this->__get($offset);
/**
* Set the value at the given offset.
*
* @param string $offset
* @param mixed $value
* @return void
*/
public function offsetSet($offset, $value)
$this->getInputSource()->set($offset, $value);
/**
* Remove the value at the given offset.
*
* @param string $offset
* @return void
*/
public function offsetUnset($offset)
$this->getInputSource()->remove($offset);
/**
* Check if an input element is set on the request.
*
* @param string $key
* @return bool
*/
public function __isset($key)
return ! is_null($this->__get($key));
/**
* Get an input element from the request.
*
* @param string $key
* @return mixed
*/
public function __get($key)
if (array_key_exists($key, $this->all()))
return data_get($this->all(), $key);
return $this->route($key);
谢谢
【问题讨论】:
我确实做到了,但它不存在。我不想添加或更改任何东西,因为我害怕我会破坏某些东西。 这可能有助于将 laravel 5.5 更新到 5.7 或 5.8 https://***.com/a/56556264/8486565 【参考方案1】:我做到了,效果很好。
1.作曲家.json:
发件人:
"require":
"php": ">=7.0.0",
"fideloper/proxy": "~3.3",
"laravel/framework": "5.5.*",
"laravel/tinker": "~1.0"
,
收件人:
"require":
"php": ">=7.1.3",
"fideloper/proxy": "~4.0",
"laravel/framework": "5.6.*",
"laravel/tinker": "~1.0"
,
2。将 app\Http\Middleware\TrustedProxies.php 文件替换为以下内容:
<?php
namespace App\Http\Middleware;
use Illuminate\Http\Request;
use Fideloper\Proxy\TrustProxies as Middleware;
class TrustProxies extends Middleware
/**
* The trusted proxies for this application.
*
* @var array
*/
protected $proxies;
/**
* The headers that should be used to detect proxies.
*
* @var string
*/
protected $headers = Request::HEADER_X_FORWARDED_ALL;
3.作曲家更新
【讨论】:
"fideloper/proxy": "~4.0",
成功了。在升级指南laravel.com/docs/5.6/upgrade 中找不到它 - 可以在文档中找到其余部分。谢谢!
"fideloper/proxy": "~4.0" 在第一行提到@Updating Dependencies
。
@Robert 可能是后来添加的,只是说:)
我必须做“4.0”而不是“~4.0”否则作曲家实际上并没有更新它。
Declaration of Illuminate\Support\Carbon::__set_state(array $array) should be compatible with Carbon\Carbon::__set_state($state)
的任何解决方案?【参考方案2】:
Laravel 的 Request 对象扩展了 Symfony 的 Request 对象。 Laravel 5.5 依赖于具有该常数的 Symfony 3。 Laravel 5.6 依赖于 Symfony 4,它没有那个常量。
根据您的可信代理配置,您似乎正在使用 Laravel “外部”的可信代理包。 Laravel 在 5.5 的框架内引入了可信代理包,并创建了一个专用的\App\Http\Middleware\TrustProxies
中间件供你使用。
我建议转而使用中间件并按照Laravel documentation 中的说明进行配置。这将有助于防止将来出现此类兼容性问题。
进行切换:
在app/Http/Kernel.php
中,如果\Fideloper\Proxy\TrustProxies::class
在您的$middleware
数组中,请将其删除。如果\App\Http\Middleware\TrustProxies::class
不在您的$middleware
数组中,请添加它。
打开您的 app/Http/Middleware/TrustProxies.php
文件并使用您的代理进行更新。
删除您的 config/trustedproxy.php
文件。
从providers
数组中的config/app.php
中删除Fideloper\Proxy\TrustedProxyServiceProvider::class
。
更新您的 composer.json 文件以使用“fideloper/proxy”:“~4.0”。运行composer update fideloper/proxy
更新包。
【讨论】:
还有这个use Fideloper\Proxy\TrustProxies as Middleware;
Laravel 5.6 请使用标签 4.0+:composer require fideloper/proxy:~4.0
proxy@4【参考方案3】:
我已经从 5.5 更新到 5.6
composer.json
"minimum-stability":"dev",
"prefer-stable": true,
这将安装最新的 Laravel 包,然后TrustedProxies
会出现问题。
为 Laravel 5.6 安装最新的代理版本。
请为 Laravel 5.6 使用标签 4.0+:
composer require fideloper/proxy:~4.0
More details
【讨论】:
如果我要从 composer.json 中删除这两行,我应该如何继续?当我尝试在没有它们的情况下更新到 5.6 时,我的帖子中出现了第一个错误 您需要将这两行添加到composer.json中,我尝试不使用这些行,但它不起作用。"minimum-stability":"dev"
会将大部分软件包更新为不稳定版本,但是这个 "prefer-stable":true
将下载稳定版本,在我的情况下,除了 laravel、黄昏和护照,所有软件包都是稳定的,我得到了 latavel 和其他两个的开发版本.【参考方案4】:
第一次安装 Laravel 5.6 我也遇到了这个错误。 只需按照以下几个步骤即可修复它:
确保您的文件composer.json
要求具有:
“要求”:
"php": "^7.1.3",
“fideloper/代理”:“^4.0”,
,
然后尝试composer update
以确保您的作曲家是最新的
最终运行:composer require fideloper/proxy:~4.0
完成!
【讨论】:
【参考方案5】:对于尝试直接从 laravel 5.5 升级到 5.7 并遇到此问题的任何人,请从 app->config->trustedproxy.php
中删除trustedproxy.php 文件。
希望对某人有所帮助。
【讨论】:
我只想说非常感谢你!!!我似乎无法摆脱错误。 很高兴它对您有所帮助。【参考方案6】:只需要更改 composer.json 文件中的 fideloper/proxy:-
你的 composer.json 文件现在:-
"fideloper/proxy": "~3.3",
把它改成 ^4.0 这样的东西:-
"fideloper/proxy": "^4.0",
之后你需要运行更新作曲家就可以了。
composer update
【讨论】:
【参考方案7】:您的问题来自您对库 TrustedProxy 的使用。
它使用 Symfony 的 HEADER_CLIENT_IP
常量,该常量在 Symfony 3.3 中弃用,并在 Symfony 4.0 中完全删除。
由于 Laravel 5.6 已更新为使用 Symfony 4 组件,这将不再有效。
解决方法是do what patricus suggested,使用 Laravel 的 TrustProxies 中间件。
【讨论】:
丹尼尔,我该如何解决?我可以删除它们吗?【参考方案8】:我做了以下事情并让我的项目在 Laravel 5.6-dev 上运行:
关注了什么patricus suggested 将 fideloper/proxy 更改为“~4.0”,并在我的 composer.json 文件末尾添加了"minimum-stability":
"dev", "prefer-stable": true
。
【讨论】:
【参考方案9】:将 app\Http\Middleware\TrustedProxies.php 替换为:
<?php
namespace App\Http\Middleware;
use Illuminate\Http\Request;
use Fideloper\Proxy\TrustProxies as Middleware;
class TrustProxies extends Middleware
protected $proxies;
protected $headers = Request::HEADER_X_FORWARDED_ALL;
将 config\trustedproxy.php 替换为:
<?php
return [
'proxies' => null,
'headers' => Illuminate\Http\Request::HEADER_X_FORWARDED_ALL,
];
【讨论】:
【参考方案10】:出于某种原因,这里的建议都不适合我。我正在使用 quickadmin 面板和可能与它有关的各种依赖项。
最终奏效的是删除 laravel/dusk,然后自行更新为 "fideloper/proxy": "~4.0",
。然后更新 laravel/framework 到 5.6,然后重新安装黄昏。
我不需要:
"minimum-stability":"dev",
"prefer-stable": true,
也许最近的更新已经解决了这个问题。
【讨论】:
【参考方案11】:面临同样的问题,并获得了一些解决此问题的指南。不幸的是,这些都没有用,我也没有用。实际上,解决此问题不需要额外的步骤或任务。
只需遵循https://laravel.com/docs/5.6/upgrade 的官方升级指南,然后删除位于config/trustedproxy.php
的trustedproxy
配置文件
【讨论】:
【参考方案12】:在 Laravel 5.7 中遇到了同样的问题。您可以在您的.env
或.env.dusk.local
中添加TELESCOPE_ENABLED=false
:Source
【讨论】:
以上是关于将 Laravel 5.5 升级到 5.6 错误的主要内容,如果未能解决你的问题,请参考以下文章
从 laravel 5 升级到 laravel 5.5 导致错误参数 1 传递给 App\Exceptions\Handler::report()