2014-06-17 26 views
8

我們熟悉CakePHP中的組件和幫助程序。如何在幫助程序和組件中使用常用函數在CakePHP中

我有一個ABC組件和XYZ助手,它們都具有相同的功能(大約2000行共4000行)。 有什麼辦法可以在Controller和.CTP文件中使用相同的功能。 2次使用相同功能並不好。

任何方法,所以我可以使用組件/幫助函數在幫助器/組件沒有重寫?

相同的方法進組分和輔助>>

元器件

類DATAComponent延伸元器件{

public $components = array('Session', 'THmail'); 

public function UsaStateList() 
{ /********/} 

助手

class LabHelper extends AppHelper { 
    public function UsaStateList() 
    { /********/} 
} 

回答

7

那麼,你將不得不重寫,它不會自行解決。

CakePHP仍然是PHP,所以你可以很容易地應用常用模式來保持乾燥。最直接的方法可能是將共享功能移到實用程序類中,您的組件和幫助程序既可以在內部使用,也可以保持其公共API不變。

一些CakePHP助手做類似的事情,例如檢查時間助手。

Traits可能是一種選擇也取決於官能團的量被共享和多少它綁在一個組件/輔助使用。

+0

我注意到upvotes進來爲我而舊的答案,發現賞金。它可能並不明顯,但是這個答案已經在賞金之前加了很久,也就是說它不是@trante正在尋找的詳細的,規範的(不確定他究竟在尋找什麼)。 – ndm

2

我想在助手中使用一個組件。所以我提出了以下解決方案。

<?php 

App::uses('AppHelper', 'View/Helper'); 
App::import('Component', 'MyComponent'); 

class MyHelperHelper extends AppHelper { 

    private $MyComponent = null; 

    public function __construct(View $View, $settings = array()) { 
     $collection = new ComponentCollection(); 
     $this->MyComponent = new MyComponentComponent($collection); 
     parent::__construct($View, $settings); 
    } 

    public function myCustomFunction() { 
     return $this->MyComponent->myCustomFunction(); 
    } 

} 
+3

如果你在幫助器中使用組件,你在做Cake MVC錯誤。組件用於控制器,助手用於視圖。 – BadHorsie

1

確定要使用一個單一的功能部件和輔助,我能想到的3件事情可以做:

  1. 調用從你的助手了組件的功能。
  2. 從組件中的助手調用函數。
  3. 創建模型或使用放置該功能的現有模型,並且可以在組件或幫助中使用此功能。

選項numbre 3: 在你的助手和組件,您需要導入模型,假設你的函數是一個模式「StateList」:

如何調用模型的funcion「StateList」在你的幫手,所以:

App::import("Model", "StateList"); 
$model = new StateList(); 
$model->UsaStateList(); 

如何調用模型 「StateList」 的funcion在您的組件,所以:

$model = ClassRegistry::init('StateList'); 
$model->UsaStateList(); 

代答,如果你想使用相同的函數在控制器剛:

$this->loadModel('StateList'); 
$this->StateList->UsaStateList(); 
+1

'$ model = new StateList();'是壞的。 '$ model = ClassRegistry :: init('StateList');'從任何地方都很好。 – bancer

2

我會去與在庫文件夾中的一類。如何處理只有靜態方法的庫類是非常清楚的。所以,我省略了這種情況。實例化類的可行解決方案可以是在控制器中創建它,並將其放入註冊表中。如果您確實需要訪問CakeRequest,CakeResponse和CakeSession(請注意CakeSession有很多靜態方法,因此您通常不需要該類的實例),您可以從該控制器中設置該類:

$MyLib = new MyLib(); 
$MyLib->setRequest($this->request); // optional 
ClassRegistry::addObject('MyLib', $MyLib); 

然後從視圖或任何其他地方,你會剛剛從註冊表中獲得MyLib中的一個實例:

ClassRegistry::getObject('MyLib'); 

或者乾脆

$list = ClassRegistry::getObject('MyLib')->UsaStateList(); 

所以,你的類將是是這樣的:

// /Lib/MyLib.php 
class MyLib { 
    public function setRequest(CakeRequest request) {...} 
    public function UsaStateList() {...} 
} 
1

簡單的答案

常用功能在您的應用程序,添加一個庫或工具類。

應用程序/庫/ MyClass.php

class MyClass { 

    public static function usaStateList() { 
     // ... 
    } 
} 

然後你要訪問功能取其文件的頂部添加此:

App::uses('MyClass', 'Lib'); 

,並致電功能你喜歡的地方:

$myClass = new MyClass(); 
$states = $myClass::usaStateList(); 

更好的答案

它看起來對我來說,你的具體問題是,你希望能夠得到一個列表的美國在你的控制器和視圖兩種狀態。做到這一點的最好方法是建立美國各州的數據庫表。

  1. 在你的數據庫稱爲us_states創建一個表。

    例SQL:

    CREATE TABLE `us_states` (
        `id` INT NOT NULL AUTO_INCREMENT PRIMARY KEY, 
        `name` VARCHAR(20) NOT NULL, 
        `abbreviation` CHAR(2) NOT NULL 
    ) ENGINE = MYISAM 
    
  2. 插入所有狀態如在該表中的數據。您可以在互聯網上找到已經爲您提供的SQL轉儲(例如Like this one)。

  3. 在CakePHP中創建一個UsState模型。

    /** 
    * Model for US States 
    * 
    * @package app.Model 
    */ 
    class UsState extends AppModel { 
    
        /** 
        * Default sort order 
        * 
        * @var string|array 
        */ 
        public $order = 'UsState.name'; 
    } 
    

那麼你可以做的就是利用該模型從控制器訪問的狀態是什麼。

/** 
    * Your Controller 
    * 
    * @package app.Controller 
    */ 
    class YourController extends AppController { 

     public function index() { 

      // Get a list of US states 
      $this->loadModel('UsState'); 
      $states = $this->UsState->find('all'); 
     } 

    } 

如果你想訪問你查看這些狀態,那麼你就應該沿着這些數據,你通常會任何其他變量傳遞。

我想你會想這樣做,所以你可以有一個美國的選擇菜單,也許。

 public function index() { 

      // Get a list of US states 
      $this->loadModel('UsState'); 
      $states = $this->UsState->find('all'); 

      // Make the states into an array we can use for a select menu 
      $stateOptions = array(); 
      foreach ($states as $state) { 
       $stateOptions[$state['id']] = $state['name']; 
      } 

      // Send the options to the View 
      $this->set(compact('stateOptions')); 
     } 

並在您的視圖中可以顯示,像這樣的選擇菜單:

echo $this->Form->select('us_state_id', $stateOptions); 
相關問題