我有一个用于编辑以前存在的userprofile的函数,这里是控制器
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'));
我尝试将创建函数的第一个参数更改为人们,但是因为这是指模型而不是控制器应该是人,所以我将其更改回来
我得到的错误是
Error: PeopleController could not be found.
所以它正在寻找错误的控制器,但我不确定在哪里寻找控制器。
我确实使用了控制器类名称没有资本化但是我对这些约定提出了一些建议并将其大写,但是其他以前的函数我仍然工作正常,所以我不认为这是问题
为什么要更改网址并寻找错误的控制器?
答案 0 :(得分:2)
无论当前网址如何 - 表单操作都会被覆盖为显式操作:
echo $this->Form->create(
'people',
array('action'=>'edit') // <-
);
这将强制网址指向操作edit
或/people/edit/<current id>
。
为防止这种情况,请不要指定操作,表单将提交到当前网址:
echo $this->Form->create(
'people'
);
使用url
密钥,不 action
密钥,该密钥仅更改操作:
echo $this->Form->create(
'people',
array(
'url'=>'/submit/here/please/' // <- or specify as an array
)
);
关于模型和控制器名称的约定是模型是单数的,控制器是复数:
Model | Controller
Singular Plural
Person People
在问题中并非如此,模型是复数,控制器是一个令人困惑的复数复数(实际上可以使用人民,但这意味着many groups of people)
在这个问题中,还有这个:
class PeoplesController extends AppController
{
public $name = "peoples";
充其量没有做任何事情,但由于name属性被定义为小写,而cake期望它是CamelCased - 这可能会导致行为不一致。
最好遵循惯例并命名控制器People
,模型Person
和根本不指定名称。
遵循惯例,以便更轻松地骑行。
函数命名与单词“person”重复
而不是:
public function viewPerson($id = NULL) {
(所以..代码使用人,人和人?)
建议使用:
public function view($id = NULL) {
毕竟,在人员控制器中 - 还有什么其他类型的东西可供查看(如果答案很多,这是另一回事)?
这会使网址简单(/peoples/view/1
,而不是/peoples/viewPeople/1
),并使代码本身更易于阅读(PeoplesController::view
而不是PeoplesController::viewPerson
)。
如果您不想更改操作方法的名称,那么将它们lower cased and underscored设置为至少意味着网址始终是有效的,而不是/lower_case_controller/camelCasedAction/args
。