Php Laravel和Codeception-PUT表单上的测试失败

Php Laravel和Codeception-PUT表单上的测试失败,php,forms,laravel,laravel-5,codeception,Php,Forms,Laravel,Laravel 5,Codeception,我在laravel有一个资源控制器来管理我的用户。这将创建一个更新用户信息的路由,该路由使用HTTP PUT方法接收请求 这将显示artisan route:list命令输出: +--------+--------------------------------+-----------------------------------------------------------+--------------------------------------+-------------------

我在laravel有一个资源控制器来管理我的用户。这将创建一个更新用户信息的路由,该路由使用HTTP PUT方法接收请求

这将显示
artisan route:list
命令输出:

+--------+--------------------------------+-----------------------------------------------------------+--------------------------------------+--------------------------------------------------------------------------------+------------+
| Domain | Method                         | URI                                                       | Name                                 | Action                                                                         | Middleware |
+--------+--------------------------------+-----------------------------------------------------------+--------------------------------------+--------------------------------------------------------------------------------+------------+
...
|        | PUT                            | users/{users}                                             | users.update                         | App\Http\Controllers\Users\UsersController@update                              | auth       |
它在我的web浏览器上正常工作,但当我尝试使用codeception运行测试并提交表单时,我得到一个method not allowed异常,测试失败

我试图了解为什么会发生这种情况,这似乎是codeception提出的请求。该请求是通过POST而不是PUT方法发出的,以防止Laravel匹配路由

HTML表单不支持PUT方法,因此Laravel
Form
helper类按如下方式创建表单:

<form method="POST" action="https://myapp.dev/users/172" accept-charset="UTF-8">
    <input name="_method" value="PUT" type="hidden">
...

前面的常量值应该是
true
,但是,当我运行测试时,它的值是
false

您不能在HTML表单标记中使用
PUT
方法。为此,您需要使用laravel的刀片模板格式来定义表单标记

e、 g。
{!!Form::open(['url'=>'users/{users}','method'=>'put','id'=>'Form'])!!}


您还可以使用
route
属性来定义路由,而不是
url

我找到了一个解决方案,但我认为这不是编写它的正确位置。 我在
Connector\Laravel5
类中添加了一行简单的代码

public function __construct($module)
{
    $this->module = $module;
    $this->initialize();

    $components = parse_url($this->app['config']->get('app.url', 'http://localhost'));
    $host = isset($components['host']) ? $components['host'] : 'localhost';

    parent::__construct($this->app, ['HTTP_HOST' => $host]);

    // Parent constructor defaults to not following redirects
    $this->followRedirects(true);

    // Added to solve the problem of overriding the request method
    Request::enableHttpMethodParameterOverride();
}

这就解决了我的问题。

使用-vv标志运行测试,查看实际发送了哪些参数。完成。输出显示Codeception如何使用
\u method=PUT
属性按预期执行
POST
请求。但不知何故,这与我定义的PUT路径不匹配。但是,在web浏览器中这样做是正确的。我在更新处理上也有同样的问题。我有一个404错误。事实上,update方法并没有在我的控制器中执行,这会导致codeception在更新url上执行,而没有在update方法中进行处理之后应该发生的重定向。两周以来,我一直在讨论这个问题,没有找到任何解决方案或线索。请停止编写Codeception没有读取_方法值,您已经确认_方法已在请求中传递。由Laravel解释参数并调用正确的方法。Codeception测试套件包括Laravel5站点,该站点的测试形式与您的类似,方法设置为PATCH,它通过了:我已经完成了。Laravel Form helper类将该代码转换为上面的HTML代码。问题是Codeception没有读取_方法值。下次执行
编写器更新时,这些更改将丢失。对。我应该把这个代码放在哪里?tests/acceptance/_bootstrap.php可能吗?我最终通过在
tests/_bootstrap.php
文件中编写下一行代码解决了这个问题<代码>\Symfony\Component\HttpFoundation\Request::enableHttpMethodParameterOverride()
public function __construct($module)
{
    $this->module = $module;
    $this->initialize();

    $components = parse_url($this->app['config']->get('app.url', 'http://localhost'));
    $host = isset($components['host']) ? $components['host'] : 'localhost';

    parent::__construct($this->app, ['HTTP_HOST' => $host]);

    // Parent constructor defaults to not following redirects
    $this->followRedirects(true);

    // Added to solve the problem of overriding the request method
    Request::enableHttpMethodParameterOverride();
}