1

我有一个用于编辑以前存在的用户配置文件的功能,这里是控制器

class PeoplesController extends AppController
{
    public $name = "peoples";
    public $helpers = array('Html', 'form', 'Js');
    public $components = array('RequestHandler');

     public function viewPerson($id = NULL) {
        $this->set('person', $this->people->read(NULL, $id));
    }

    public function editPerson($id = NULL)
    {
        if(empty($this->data)) {
            $this->data = $this->people->read(NULL, $id);
        }
        else {
            if($this->people->save($this->data)) {
                $this->Session-setFlash('The profile has been updated');
                $this->redirect(array('action'=>'viewPerson', $id));
            }
        }

    }
}   

视图输出一个预先填充了先前数据的表单

<h2>Edit Profile</h2>

 <?php 

  echo $this->Form->create('people', array('action'=>'edit'));

echo $this->Form->input('firstName');
echo $this->Form->input('secondName');
echo $this->Form->input('addressOne');
echo $this->Form->input('addressTwo');
echo $this->Form->input('city');
echo $this->Form->input('county');
echo $this->Form->input('country');
echo $this->Form->input('postCode', array(
        'label' => 'Zip Code',
    ));
echo $this->Form->input('dob', array(
        'label' => 'Date of birth',
        'dateFormat' => 'DMY',
        'minYear' => date('Y') - 70,
        'maxYear' => date('Y') - 18,
    ));
echo $this->Form->input('homePhone');
echo $this->Form->input('mobilePhone');
echo $this->Form->input('email', array(
        'type' => 'email'
    ));

$goptions = array(1 => 'Male', 2 => 'Female');
$gattributes = array('legend' => false);

echo $this->Form->radio('gender', 
    $goptions, $gattributes
    );

echo $this->Form->input('weight');
echo $this->Form->input('height');

echo $this->Form->input('referedBy');

echo $this->Form->input('id', array('type'=>'hidden'));

echo $this->Form->end('Edit Profile');
    ?>

视图似乎工作正常@

http://localhost/Cake/peoples/editPerson/2

但是当我点击提交时,网址更改为

http://localhost/Cake/people/edit/2

所以我改变了

echo $this->Form->create('people', array('action'=>'edit'));

echo $this->Form->create('people', array('action'=>'editPerson'));

我尝试将 create 函数的第一个参数更改为 peoples 但由于这是指模型而不是控制器它应该是 people 所以我将其改回

我得到的错误是

Error: PeopleController could not be found.

所以它正在寻找错误的控制器,但我不确定在哪里寻找控制器。

我确实曾经让控制器类名不大写,但我遵循了一些关于约定的建议并将其大写,但我以前的其他功能仍然可以正常工作,所以我认为这不是问题

有什么想法为什么要更改 url 并寻找错误的控制器?

4

1 回答 1

2

表单动作被设置为编辑动作

不管当前的 url - 表单动作被覆盖为显式动作:

echo $this->Form->create(
    'people', 
    array('action'=>'edit') // <-
);

这将强制 url 指向 actionedit/people/edit/<current id>.

为防止这种情况,只需不指定操作,表单将提交到当前 url:

echo $this->Form->create(
    'people'
);

指定表单操作 url

使用url键,而不是action只改变动作的键:

echo $this->Form->create(
    'people', 
    array(
        'url'=>'/submit/here/please/' // <- or specify as an array
    )
);

避免/纠正混淆名称

关于模型和控制器名称的约定是模型是单数,控制器是复数:

Model    |   Controller
Singular     Plural
Person       People

在问题中并非如此,模型是复数,控制器是令人困惑的复数复数(实际上可以使用Peoples,但这意味着很多

不要不必要地定义属性

在这个问题中,还有这个:

class PeoplesController extends AppController
{
     public $name = "peoples";

充其量不会做任何事情,但是由于 name 属性被定义为小写并且 cake 期望它是 CamelCased - 这可能会导致不一致的行为。

最好遵循约定并命名控制器People,模型Person并且根本不指定名称。

不要重复自己

并遵循惯例,让骑行更轻松。

函数命名与“人”字重复

代替:

public function viewPerson($id = NULL) {

(所以..代码使用人员、人员和人员?)

建议使用:

public function view($id = NULL) {

毕竟,在人员控制器中 - 还有什么其他类型的东西可以查看(如果答案是很多东西,那就是另一回事了)?

这使得 url 变得简单(/peoples/view/1, 而不是/peoples/viewPeople/1),并且使代码本身更易于阅读(PeoplesController::view而不是PeoplesController::viewPerson)。

如果您不想更改操作方法的名称,将它们设置为小写和下划线至少意味着 URL 是一致的,而不是/lower_case_controller/camelCasedAction/args.

于 2013-07-04T13:17:22.670 回答