【问题标题】:Cakephp profile view looking for the wrong controllerCakephp 配置文件视图寻找错误的控制器
【发布时间】:2013-07-04 11:08:01
【问题描述】:

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

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 并寻找错误的控制器吗?

【问题讨论】:

  • 当我刚开始的时候,我在阅读蛋糕惯例之前已经创建了表格,所以我就照做了。其他人向我建议这可能是问题所在,如果它很好,但如果是这样的话,我想知道为什么其他功能可以正常工作?

标签: php cakephp cakephp-2.0


【解决方案1】:

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

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

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

这将强制 url 指向操作 edit/people/edit/&lt;current id&gt;

为了防止这种情况,只需不指定操作,表单将提交到当前 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,但它的意思是many groups of 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)。

如果您不想更改操作方法的名称,将它们设为 lower cased and underscored 至少意味着 URL 的大小写一致,而不是 /lower_case_controller/camelCasedAction/args

【讨论】:

  • 谢谢,我将做出这些改变以更好地遵循惯例,让人们/人民的事情变得不那么混乱,看看我是怎么做的
  • 再次感谢,我经历并重命名了 thigns 以遵循惯例并使其更有意义,因此不得不在我的其他功能中更改很多东西,并且惊喜我现在明白了一切都比我按照教程更好地融合在一起
猜你喜欢
  • 1970-01-01
  • 2011-05-24
  • 1970-01-01
  • 2013-09-19
  • 1970-01-01
  • 2021-03-02
  • 2015-11-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多