Cakephp配置文件视图正在查找错误的控制器


Cakephp profile view looking for the wrong controller

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

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

但是当我点击提交url更改到

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

所以我换了

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

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

我试着把create函数的第一个参数改为people,但因为它指的是模型,而不是控制器,所以我把它改回了

我得到的错误是

Error: PeopleController could not be found.

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

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

你知道它为什么要更改url并查找错误的控制器吗?

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

不考虑当前url-表单操作被覆盖为显式操作:

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

这将强制url指向操作edit/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

事实并非如此,模型是复数,控制器是令人困惑的复数(people实际上可以使用,但它意味着许多人)

不要不必要地定义属性

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

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