Потому что CakePHP стрелка method равно PUT, а не POST?


я недавно Обновил мой проект CakePHP версии 2.4.5.

С тех пор некоторые из моих форм, с input hidden _method выставиться как PUT автоматически. Единственный способ обойти это, установив 'type' => 'POST'.

Однако, это было не нужно, как раньше. Я не знаю, если я делаю что-то неправильно, или если это ОШИБКА.

это форма

  <?php echo $this->Form->create('User', array('url' => array('action' => 'new_password', $this->request->data['User']['forget_password'], 'admin' => false), 'autocomplete' => 'off')) ?>

    <?php echo $this->Form->hidden('User.id') ?>

    <fieldset>
      <label class="block clearfix">
        <span class="block input-icon input-icon-right">
          <?php echo $this->Form->password('User.password', array('label' => false, 'div' => false, 'class' => 'form-control', 'placeholder' => 'Digite a nova senha')) ?>
          <i class="icon-user"></i>
        </span>
      </label>

      <label class="block clearfix">
        <span class="block input-icon input-icon-right">
          <?php echo $this->Form->password('User.password_confirmation', array('label' => false, 'div' => false, 'class' => 'form-control', 'placeholder' => 'Digite novamente a nova senha')) ?>
          <i class="icon-user"></i>
        </span>
      </label>

      <div class="space"></div>

      <div class="clearfix">
        <?php echo $this->Form->button('<i class="icon-key"></i> '. __('Enviar'), array('class' => 'width-35 pull-right btn btn-sm btn-success', 'escape' => false)) ?>
      </div>

      <div class="space-4"></div>
    </fieldset>
  <?php echo $this->Form->end() ?>

И это action:

/**
 * new_password method
 *
 * @access public
 * @param String $forget_password
 * @return void
 * @since 1.0 
 * @version 1.0 
 * @author Patrick Maciel
 */
public function new_password($forget_password)
{

  $user = $this->User->findByForgetPassword($forget_password);

  if ($user == false) {
    $this->Session->setFlash(__('Link inválido'), 'flash/frontend/error');
    $this->redirect('/');
  }

  $this->layout = 'login';

  if ($this->request->is('post')) {
    $this->User->set = $this->request->data;
    if ($this->User->validates(array('fieldList' => array('id', 'forget_password', 'password', 'password_confirmation')))) {

     // ...

    } else {

     // ...

    }
  }

  $user['User']['password'] = null;
  $this->request->data = $user;

}

Примечание.: Я не setei в *type форму выше, именно, чтобы проверить, если то же самое будет происходить и произошло.*

Author: bfavaretto, 2014-01-20

4 answers

И я увидел, что происходит, является то, что если ты имеешь записи выбран, он считает, что метод PUT, как по умолчанию, если ты не имеющий активной записи он ставит, как ПОСТ.

Мы Можем увидеть это здесь:

if ($model !== false && $key) {
      $recordExists = (
          isset($this->request->data[$model]) &&
          !empty($this->request->data[$model][$key]) &&
          !is_array($this->request->data[$model][$key])
       );

      if ($recordExists) {
          $created = true;
          $id = $this->request->data[$model][$key];
      }
}

После того, как мы видим, это:

'type' => ($created && empty($options['action'])) ? 'put' : 'post',

Итак, как я понимаю, если ты использовать форму, либо создание которых ты не восстановление данных модели он будет делать один ПОСТ.

Источник: https://github.com/cakephp/cakephp/blob/master/lib/Cake/View/Helper/FormHelper.php

 5
Author: Daniel Lemes, 2014-01-20 17:59:24

, Еще не знаю, какая логика за CakePHP, чтобы сделать это, но выглядит следующим образом:

, Если action не будет add(), он рассматривает, как PUT, по крайней мере, в action есть delete.

Таким образом, если маршрут, любой шаблон, спасаясь от стандартных REST, вы должны установить вручную:

'type' => 'POST'

, И все готово.


Примечание.: проверил и удалить User.id, как удалить параметры url, Form, но все же он сохранил, как PUT

Артикул: http://book.cakephp.org/2.0/en/core-libraries/helpers/form.html#creating-forms

 1
Author: Patrick Maciel, 2014-01-20 18:18:36

CakePHP использует POST в форме и стрелка атрибут _method PUT, так как метод PUT и в целом, не является изначально поддерживается браузерами.

Framework Symfony2 делает то же самое, и вот, что они говорят в документации:

Unfortunately, life isn't quite this simple, since most browsers do not support sending PUT and DELETE requests. Fortunately Symfony2 provides you with a simple way of working around this limitation. By включая _method parameter in the query string or parameters of an HTTP request, Symfony2 will use this as the method when matching routes. Forms automatically include a hidden field for this parameter if their submission method is not GET or POST.

Источник: http://symfony.com/doc/current/cookbook/routing/method_parameters.html

 0
Author: Rodrigo Rigotti, 2014-02-26 16:09:21

При использовании put delete, form будет post, но при воздействии, метод запроса HTTP будет заменен PUT, DELETE, соответственно. Это позволяет CakePHP эмулировать поддержка REST в веб-браузерах.

Http://book.cakephp.org/2.0/en/core-libraries/helpers/form.html#options-for-create

 0
Author: Marcelo Aymone, 2014-02-26 19:49:27