2013-02-08 3 views
0

컨트롤러 A에서이 컨트롤러와 관련이없는 모델을로드합니다. 하나의 변수로 제어기 B의 모델 이름을 관리하는 데 관심이 있으므로 테이블/모델 B의 이름이 변경되면 많은 행을 수동으로 변경할 필요가 없습니다. 어떻게 내가 'ModelB'명시 적으로 써 단어 대신에 변수 이름을 사용합니까 ", COMMENT # 1"을 주석 라인의 경우 :CakePHP : 컨트롤러에서 테이블 이름을 하나의 변수로 관리하기

public $modelBName = 'ModelB'; 

public function controller_a_function() { 
    $this->loadModel($this->modelBName); // I use the variable here for model B 

    $this->ModelB->model_b_function(); // COMMENT #1 
} 

질문 : 아래의 예를 들어

컨트롤러 A의 코드? 이 줄은 코드 전체에 여러 번 나타나며 가능하면 변수 $modelBName을 사용하고 싶습니다. ModelB은 변경되지 않을 가능성이 있지만 어떤 이유로 든 여러 행을 편집하는 대신 하나의 변수 만 변경하는 것이 좋습니다.

답변

2

간단한 대답; 이것을 사용하십시오 :

$this->{$this->modelBName}->find('all'); 

속성 이름 주위에 중괄호 {}가 있음에 유의하십시오. 자세한 정보는 매뉴얼에서 찾을 수 있습니다.

http://php.net/manual/en/language.variables.variable.php

클리너 접근 방식은 '공장'방법의 일종 될 수있다;

/** 
* Load and return a model 
* 
* @var string $modelName 
* 
* @return Model 
* @throws MissingModelException if the model class cannot be found. 
*/ 
protected function model($modelName) 
{ 
    if (!isset($this->{$modelName})) { 
     $this->loadModel($modelName); 
    } 

    return $this->{$modelName}; 
} 

다음과 같이 사용할 수 있습니다.

$result = $this->model($this->modelBName)->find('all'); 
debug($result); 

, 당신은 모델을 지정하려면,하지만 그것은 반환하지 않으려면 '$ this->을 modelBName'자동; 이처럼 사용할 수

/** 
* Load and return the model as specified in the 'modelBName' property 
* 
* @return Model 
* @throws MissingModelException if the model class cannot be found. 
*/ 
protected function modelB() 
{ 
    if (!isset($this->{$this->modelBName})) { 
     $this->loadModel($this->modelBName); 
    } 

    return $this->{$this->modelBName}; 
} 

: 응답에 대한

$result = $this->modelB()->find('all'); 
debug($result); 
+0

안녕하세요, 중괄호가 작동합니다. 나는 이것이 좋고 일반적인 관행이라면 궁금해한다. 나는이 일을하는 다른 사람의 코드를 보지 못했다. 그들은 모델을 사용할 필요가있을 때마다'$ this-> ModelName-> someFunction'을 항상 수행한다. 어떤 생각? – musicliftsme

+0

일반적인 '$ uses'배열을 사용하면 모델이 이미로드되어 있으므로 수동으로 모델을로드 할 필요가 없습니다. 모델 이름에 변수를 사용할 때 이점이별로 없습니다. IMO는 현재 작업하고있는 모델을 '확실하지'않게 만듭니다. 예 : $ this-> User-> save()를 호출하면 $ this-> {$ this-> modelName} -> save()보다 훨씬 명확합니다. – thaJeztah

+0

모든 동작이 컨트롤러에서 사용되는 전체 모델 세트를 필요로하지 않기 때문에 나는 단지'$ uses' 배열 대신에 컨트롤러 액션에서'loadModel ('model_name')'을 사용하고 있습니다. 나는 이것에 가독성을 가지고 가고 제안을 취할 것이라고 생각한다. – musicliftsme

1

모델 이름과 테이블 이름이 혼란 스럽다고 생각합니다. 당신은 예를 들어, $useTable 속성을 사용하여 다른 데이터베이스 테이블을 사용하는 모델을 설정할 수 있습니다

class User extends AppModel { 

    public $useTable = 'users_table'; // Database table used 

} 

class Product extends AppModel { 

    public function foo() { 
     $this->loadModel('User'); 

     $this->User->find('all'); 
    } 
} 

당신은 모델의 이름을 변경 할 필요가 없습니다해야하며, 데이터베이스 테이블의 이름을 변경하는 경우 당신이 할 수있는 단순히 모델의 $useTable 속성을 업데이트하십시오.

+0

안녕하세요, 감사합니다. 용어를 혼란스럽게 만들었지 만 제 게시물을 수정했습니다. 기본적으로 모델 B의 이름 인'ModelB'에 대한 변수를 COMMENT # 1 행에 쓰지 않고 사용하려고합니다. – musicliftsme

관련 문제