我有一个用于编辑以前存在的用户配置文件的函数,这里是控制器
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
。