如何针对缺失的操作采取措施?

时间:2010-12-02 21:16:01

标签: php cakephp cakephp-1.3

我对cakePHP很新。

我正在使用像这样的控制器:

class DesignersController extends AppController
{
    var $name = 'Designers';

    function index()
    {
        $data = $this->Designer->find('all');
        $this->set('designers', $data); 
    }

    function belle_etoile()
    {
        $this->show_designer("belle etoile");
    }

    function ritani()
    {
        $this->show_designer("ritani");
    }

    function swarovski()
    {
        $this->show_designer("swarovski");
    }

    function verragio()
    {
        $this->show_designer("verragio");
    }


    private function show_designer($designer)
    {
        $this->layout = 'first';
        $data = $this->Designer->find('first', array('conditions' => array('Designer.name' => $designer)));
        $this->set('data', $data);  
        $this->render('show_designer');
    }

}

正如您所看到的,许多“操作”都是show_designer/param操作的快捷方式,其中param是快捷方式操作的名称。

这些操作中的每一个都是数据库中的“设计者”。我只是不想制作网址designers/show_designer/ritani,我希望它只是designers/ritani

这样可行,但问题是:

我必须为每个设计师创建一堆冗余函数,如果添加了新的设计器,那么在我为它添加函数之前它将无法工作。

如果请求的操作丢失,我希望有一个函数/操作,并且具有作为参数请求的操作

因此,如果我请求网址designers/stardust,因为 stardust 未被定义为操作,它会使用 stardust 调用catch_all操作作为参数。

所以我没有一堆冗余功能,而是可以拥有它:

function catch_all($action)
{
    $this->show_designer($action)
} 

无论如何都要做这样的事情?

2 个答案:

答案 0 :(得分:4)

改用路由

// add this to app/config/routes.php
Router::connect('/designer/*', array('controller' => 'designers', 'action' => 'designer'));

在您的控制器中

// and remove all actions 'belle_etoile', 'swarovski' etc
// change `show_designer` to `public designer`
class DesignersController extends AppController {
    var $name = 'Designers';

    function designer($name)
    {
        $this->layout = 'first';
        $data = $this->Designer->find('first', array('conditions' => array('Designer.name' => $name)));
        if(!empty($data)) {
            $this->set('data', $data);  
            $this->render('show_designer');
        } else {
            $this->redirect('index');
        }
    }
}

答案 1 :(得分:0)

您是否尝试过添加调用方法:

function __call($action,$params = array())
{
    $this->show_designer($action)
}

我不是100%支持蛋糕调用它的方法,但它应该有效:

用法示例:

finale class Test
{
    function __call($action,$params = array())
    {
        echo $action . " called:<br />";
        foreach($params as $param)
        {
            echo "Param: "$param . "<br />";
        }
    }
}
$test = new Test();
$test->SomeNonExistantmethod("param 1","param 2");

这将输出:

SomeNonExistantmethod called:
param: param 1
param: param 2

你的课程就像这样:

class DesignersController extends AppController
{
    var $name = 'Designers';
    var $allowed = array(
        "belle_etoile",
        "ritani",
        "swarovski",
        "verragio"
    );

    function index()
    {
        $data = $this->Designer->find('all');
        $this->set('designers', $data); 
    }

    function __call($action,$params = array())
    {
        if(in_array($action,$this->allowed))
        {
            $this->show_designer($action);
        }
    }

    private function show_designer($designer)
    {
        $this->layout = 'first';
        $data = $this->Designer->find('first', array('conditions' => array('Designer.name' => $designer)));
        $this->set('data', $data);  
        $this->render('show_designer');
    }
}