문제
마녀가 교리 중첩 세트 기능을 사용하고있는 일부 모델이 있습니다. 내 응용 프로그램에서 필요하기 때문에 트리에서 요소의 기능 삭제 기능을 추가하고 싶습니다. 나는 문서화에서 스 니펫으로 시도했지만 그 코드에 대해 매우 이상한 오류가 발생하고 있습니다.
Yaml은 여기에 있습니다. http://pastie.org/820978
그리고 나는 내 메뉴 에서이 코드로 시도하고 있습니다. 마녀는 생성 된 추상 클래스베이스 멘누를 확장하고 Basemenu는 proctrine_record를 확장합니다 :)
어쨌든 내 코드 :
public function getMenuItem($id)
{
return Doctrine::getTable('Menu')->find($id);
}
public function delete($id)
{
$item = $this->getMenuItem($id);
//echo get_class($item); will return Menu so object exists !?
$item->getNode()->delete();
}
그리고 나는 이것을 오류로 얻는다 :
치명적인 오류 : 회원 기능 getNode ()로 호출하지 않음.
그리고 방금 get_class ($ item)가 전쟁을 겪고 있음을 알았습니다.
경고 : get_class ()는 매개 변수 1이 객체가 될 것으로 기대합니다. 부울은 ...
그러나 나는 이것에 대한 해결책이 필요하며 모든 힌트를 환영합니다 ...
해결책
getNode ()는 Doctrine_Record가 아닌 Doctrine_Node를 반환합니다.
Doctrine_record를 삭제할 수 있지만 Doctrine_Node는 삭제할 수 없습니다. 어쨌든 지속되지 않기 때문입니다.
올바른 논리는 단순히 다음과 같습니다.
$item = $this->getMenuItem($id)->delete();
또한 모델 '삭제'에서 메소드를 이름을 지정하지 마십시오 !! 이것은 Doctrine_record의 delete () 메소드를 무시할 것이므로 디버깅을 미치게합니다.
다른 팁
나는 개인적으로 교리를 사용하는 것을 좋아하지 않습니다 :: gettable ( "table_name")은 코드를 매우 건조하게 만들지 않기 때문입니다. 어떤 이유로 "table_name"이 변경되면 많은 장소에서 변경해야합니다.
Zend Framework 앱에서 교리를 사용 했으므로 일반적인 사용 패턴에는 모듈의 모든 모델의 보호 된 인스턴스를 인스턴스화하는 것이 포함됩니다.
그 패턴을 사용하면 컨트롤러에서 이것을 할 것입니다.
$this->_Menu
->getTable()
->find($id)
->getNode()
->delete();
당신이 당신의 기능을 비슷하게 유지하고 싶다면, 나는 다음과 같은 것을 사용할 것입니다
public function getMenuItem($id)
{
if (empty($id))
{
throw new Exception ("A parameter of id is required to retrieve a menu item".);
}
return $this->getTable()->find($id);
}
public function delete($id)
{
$item = $this->getMenuItem($id);
if ($item instanceof Doctrine_Record == false)
{
throw new Exception("Item is not a valid Menu Record.");
}
$item->getNode()->delete();
}
답변은 귀하의 질문에 있습니다 : $ 항목은 객체가 아닙니다 (값은 거짓이라고 생각하지만 var_dump ($ item)을 사용할 수 있습니다).
경고 : get_class ()는 매개 변수 1이 객체가 될 것으로 기대합니다. 부울은 ...
치명적인 오류 : 회원 기능 getNode ()로 호출하지 않음.