将 Laravel 5.5 升级到 5.6 错误



我正在尝试将我的Laravel5.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.

因此,我更改了composer.json文件并添加了 2 行:**"minimum-stability": "dev", "prefer-stable": true,**基于此 laracast 讨论的第一个答案。

一切似乎都很好,直到我收到另一个错误:

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
> IlluminateFoundationComposerScripts::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',。 我已经在stackoverflow上搜索了其他帖子,但仍然没有运气。我尝试的最后一件事是作曲家自我更新和作曲家全局更新,这在后作曲家转储自动加载无法识别命令中提到

另外,我无法删除"最小稳定性":"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 文件和受信任代理.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
}
}

可信代理.php(error in line 66--> IlluminateHttpRequest::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
* SymfonyComponentHttpFoundationRequest::$trustedHeaders
*
* You may optionally set headers to 'null' here if you'd like
* for them to be considered untrusted instead. Ex:
*
* IlluminateHttpRequest::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('IlluminateHttpRequest::HEADER_FORWARDED') ? IlluminateHttpRequest::HEADER_FORWARDED : 'forwarded') => 'FORWARDED',
IlluminateHttpRequest::HEADER_CLIENT_IP    => 'X_FORWARDED_FOR',
IlluminateHttpRequest::HEADER_CLIENT_HOST  => 'X_FORWARDED_HOST',
IlluminateHttpRequest::HEADER_CLIENT_PROTO => 'X_FORWARDED_PROTO',
IlluminateHttpRequest::HEADER_CLIENT_PORT  => 'X_FORWARDED_PORT',
]
];

照亮\Http\请求文件:

<?php
namespace IlluminateHttp;
use Closure;
use ArrayAccess;
use RuntimeException;
use IlluminateSupportArr;
use IlluminateSupportStr;
use IlluminateSupportTraitsMacroable;
use IlluminateContractsSupportArrayable;
use SymfonyComponentHttpFoundationParameterBag;
use SymfonyComponentHttpFoundationRequest as SymfonyRequest;
class Request extends SymfonyRequest implements Arrayable, ArrayAccess
{
use ConcernsInteractsWithContentTypes,
ConcernsInteractsWithFlashData,
ConcernsInteractsWithInput,
Macroable;
/**
* The decoded JSON content for the request.
*
* @var SymfonyComponentHttpFoundationParameterBag|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 IlluminateHttpRequest
*/
public function merge(array $input)
{
$this->getInputSource()->add($input);
return $this;
}
/**
* Replace the input for the current request.
*
* @param  array  $input
* @return IlluminateHttpRequest
*/
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 SymfonyComponentHttpFoundationParameterBag|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 SymfonyComponentHttpFoundationParameterBag
*/
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  SymfonyComponentHttpFoundationRequest  $request
* @return IlluminateHttpRequest
*/
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 IlluminateSessionStore
*
* @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 IlluminateSessionStore|null
*/
public function getSession()
{
return $this->session;
}
/**
* Set the session instance on the request.
*
* @param  IlluminateContractsSessionSession  $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 IlluminateRoutingRoute|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  SymfonyComponentHttpFoundationParameterBag  $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);
}
}

谢谢

我这样做了,它工作得很好。

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 AppHttpMiddleware;
use IlluminateHttpRequest;
use FideloperProxyTrustProxies 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. 作曲家更新

Laravel 的请求对象扩展了 Symfony 的请求对象。Laravel5.5依赖于Symfony 3,它有这个常数。Laravel5.6依赖于Symfony 4,它没有这个常数。

根据您的受信任代理配置,您似乎正在使用 Laravel "外部"的受信任代理包。Laravel在5.5的框架中引入了可信代理包,并创建了一个专用的AppHttpMiddlewareTrustProxies中间件供您使用。

我建议改用中间件并按照Laravel文档中的说明对其进行配置。这将有助于防止将来出现此类兼容性问题。

要进行切换:

  1. app/Http/Kernel.php中,如果FideloperProxyTrustProxies::class位于$middleware数组中,请将其删除。如果AppHttpMiddlewareTrustProxies::class不在$middleware数组中,请添加它。

  2. 打开您的app/Http/Middleware/TrustProxies.php文件并使用您的代理更新它。

  3. 删除config/trustedproxy.php文件。

  4. config/app.php中从providers数组中删除FideloperProxyTrustedProxyServiceProvider::class

  5. 更新您的 composer.json 文件以使用"fideloper/proxy":"~4.0"。运行composer update fideloper/proxy以更新包。

我已经从 5.5 更新到 5.6

作曲家.json

"minimum-stability":"dev",
"prefer-stable": true,

这将安装最新的Laravel软件包,然后TrustedProxies将出现问题。

安装Laravel 5.6的最新代理版本。

请在 Laravel 5.6 中使用标签 4.0+:

composer require fideloper/proxy:~4.0

更多详情

首先安装Laravel 5.6我也遇到了这个错误。 只需按照以下几个步骤即可修复它:

  • 确保您的文件composer.json要求具有:
"要求":{ "php": "^7.1.3", "fideloper/proxy": "^4.0", },
  • 然后尝试composer update以确保您的作曲家是最新的
  • 最后运行:composer require fideloper/proxy:~4.0
  • 做!

对于尝试直接从 laravel 5.5 升级到 5.7 并遇到此问题的任何人,请从app->config->trustedproxy.php中删除受信任的代理.php文件。 希望对某人有所帮助。

只需要在 composer.json 文件中更改 fideloper/proxy :-

您的作曲家.json文件现在:-

"fideloper/proxy": "~3.3",

将其更改为^4.0,如下所示:-

"fideloper/proxy": "^4.0",

之后,您需要运行更新编辑器,仅此而已。

composer update

您的问题来自您对库 TrustedProxy 的使用。

它使用Symfony的HEADER_CLIENT_IP

常量,该常量在Symfony 3.3中被弃用,并在Symfony 4.0中完全删除。

由于Laravel 5.6已经更新为使用Symfony 4组件,这将不再起作用。

解决这个问题的方法是按照patricus的建议去做,并使用Laravel的TrustProxies中间件。

我做了以下事情,让我的项目在 Laravel 5.6-dev 上运行:

  • 跟着什么帕特里库斯 建议
  • 将fideloper/proxy更改为"~4.0",并在我的composer.json文件的末尾添加了"minimum-stability": "dev", "prefer-stable": true

将 app\Http\Middleware\TrustedProxies.php替换为:

<?php
namespace AppHttpMiddleware;
use IlluminateHttpRequest;
use FideloperProxyTrustProxies as Middleware;
class TrustProxies extends Middleware
{
protected $proxies;
protected $headers = Request::HEADER_X_FORWARDED_ALL;
}

将 config\trustedproxy.php替换为:

<?php
return [
'proxies' => null,
'headers' => IlluminateHttpRequest::HEADER_X_FORWARDED_ALL,  
];

由于某种原因,这里的建议都对我不起作用。 我正在使用快速管理面板和可能与之相关的各种依赖项。

最终奏效的是删除 laravel/dusk,然后自行更新为"fideloper/proxy": "~4.0",。 然后将 laravel/framework 更新到 5.6,然后重新安装 dusk。

我不需要: "minimum-stability":"dev", "prefer-stable": true,

也许最近的更新已修复。

面临同样的问题,并获得了许多指南来解决此问题。不幸的是,这些都不起作用,我也没有。实际上,解决此问题不需要解决其他步骤或任务。

只需按照 https://laravel.com/docs/5.6/upgrade 年的官方升级指南进行操作,然后删除位于config/trustedproxy.phptrustedproxy配置文件

在Laravel 5.7中遇到了同样的问题。您可以在.env中添加TELESCOPE_ENABLED=false.env.dusk.local:来源

相关内容

  • 没有找到相关文章

最新更新