2014-11-02 110 views
0

我正在开发一个CakePHP项目,并且我意识到很多我的控制器具有几乎相同的代码。我决定我应该尝试做一个排序“BaseController”,并具有其他控制器扩展是......是这样的:扩展常见功能的控制器

class BaseController extends AppController { 

    public $components = array(
     'RequestHandler' 
    ); 

    public function get($param = "all", $value = "") { 
     $this->layout = 'ajax'; 
     if($param == "all") { 
      $data = $this->Base->find('all'); 
     } elseif ($param == "id") { 
      $data = $this->Base->findById($value); 
     } else { 
      ... 
     } 
    } 

    ... 
} 

但在这一点上,我迷路了。我做不是想要有一个基础数据库表和模型...我只是想要的东西,所以不必写几乎相同的get()方法十几次......并让我说我做了一个控制器“FooController “这扩展了这个控制器......我该如何使get()现在与Foo模型/表交互?

我认为有一个Cake的方法来做到这一点,而不是有吨的重复代码......但我一直没能找到它。

+1

使用组件 – 2014-11-02 01:54:37

+0

Hi @ mcgowan.b,我正在查看组件的[documentation](http://book.cakephp.org/2.0/en/controllers/components.html)。我没有看到一种方式,我可以使用它与各种模型的数据库,我错过了什么? – smerny 2014-11-02 17:46:05

+0

手册中提到“组件是控制器之间共享的逻辑包,这是您希望实现的功能,以及所有控制器中可用的常见功能。 [手动](http://book.cakephp.org/2.0/en/controllers/components.html) – 2014-11-02 20:25:02

回答

0

假设你想要与富模式,以取代Base,我个人会通过模型名作为参数:

public function get($param = 'all', $value = '', $model = 'Foo') 
{ 
    $this->layout = 'ajax'; 

    if($param == 'all') { 
     $data = $this->{$model}->find('all'); 
    } elseif ($param == 'id') { 
     $data = $this->{$model}->findById($value); 
    } 
} 

不熟悉足够的蛋糕给一个更好的解决方案,可能不会伤害在调用find之前做一些模型存在检查。

如果这对于每个CakePHP方法来说都不合适,请原谅我。

+0

虽然我可以看到这是如何工作的,但它似乎仍然需要我在'Foo'控制器中具有所有这些功能其他控制器),只是调用上面的相关函数。 – smerny 2014-11-02 22:19:46

+0

我明白了,所以看起来你需要首先使用可扩展的模型。我猜当我看到'Base'时,我认为Foo模型已经在扩展提供findBy函数的模型 – 2014-11-03 13:41:41