我对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)
}
无论如何都要做这样的事情?
答案 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');
}
}