Buggy CakePHP 코드: CakePHP 개발자가 저지르는 가장 흔한 6가지 실수

게시 됨: 2022-03-11

CakePHP는 놀라운 PHP 프레임워크이지만 학습 곡선이 가파르다! 전문가가 되기 위해서는 많은 연구와 훈련이 필요합니다.

저는 지금까지 7년 이상 CakePHP를 사용하게 되어 운이 좋았고 그 동안 CakePHP 커뮤니티의 많은 회원들과 함께 일할 수 있는 영광을 누렸습니다.

이 CakePHP 튜토리얼에서 저는 제가 수년 동안 보아온 몇 가지 나쁜 관행을 설명하고 이러한 실수를 피하기 위한 올바른 접근 방식을 제안하고 싶습니다. 이것은 내 코드가 완벽하다는 것은 아니지만 프로그래머로서 우리는 항상 배우고 있으므로 모범 사례를 따르고 학습하면서 조정하는 것이 중요합니다!

이 기사의 내용은 CakeCoded의 게시물에서 영감을 받았습니다. CakePHP에 대해 더 알고 싶다면 여기의 학습 섹션을 방문하십시오.

이 초보자 CakePHP 튜토리얼은 오류와 실수로 CakePHP 코드를 튀기는 것을 방지하는 데 도움이 될 것입니다!

일반적인 실수 #1: CakePHP 코딩 규칙을 따르지 않음

CakePHP 코딩 규칙은 여기에서 볼 수 있습니다. 다른 프로그래머의 코드를 볼 때 자주 발견하는 몇 가지 사항을 강조하겠습니다.

제어 구조. 종종 프로그래머가 이것을 잘못 이해하고 다른 코딩 언어의 사례를 가져오는 경우를 봅니다. CakePHP는 다음 구문을 예상합니다.

 if ((expr_1) || (expr_2)) { // action_1; } elseif (!(expr_3) && (expr_4)) { // action_2; } else { // default_action; }

첫 번째 괄호 앞에는 1칸, 마지막 괄호와 여는 괄호 사이에는 1칸의 공백이 있어야 합니다. 따라서 이것은 다음이 잘못되었음을 의미합니다.

 if($this->request->data){ }

if( , 그리고 ){ 사이의 간격에 유의하십시오.

제어 구조에서는 필요하지 않더라도 항상 중괄호를 사용하십시오. 코드의 가독성을 높이고 논리적 오류를 줄입니다.

예를 들어 다음은 올바르지 않습니다.

 if ($foo) $bar = true

이것은 다음과 같은 형식이어야 합니다.

 if ($foo) { $bar = true }

마지막으로 브래킷을 배치하는 위치를 확인합니다. 여는 대괄호는 새 줄을 시작해서는 안 됩니다. 그리고 각 새 괄호가 닫는 괄호와 일치하도록 모든 괄호가 정렬되었는지 확인합니다.

다음은 몇 가지 잘못된 예입니다.

 if ($foo) { $bar = true; }

이것은 올바르지 않습니다. 여는 괄호는 첫 번째 줄에 있어야 합니다.

 if ($foo) { $bar = true; if ($action) { $to = false; } }

들여쓰기가 올바르게 정렬되어야 합니다.

저는 프로그래머가 "하지만 너무 바빠서 코드를 깔끔하게 만들 수는 없습니다..."라는 말을 자주 듣습니다. 내 대답은 "나를 믿으세요. 깔끔한 코드는 시간이 지나도 견뎌낼 것입니다."입니다. 읽을 수 없는 CakePHP 코드를 작성하는 것은 몇 달 안에 변경해야 하는 경우 다시 떠올리는 악몽이 될 것입니다.

일반적인 실수 #2: ORM에서 포함 가능한 행동 및 재귀 수준의 부적절한 사용

나는 운이 좋게도 최근 Facebook의 데이터베이스 개발자와 비공식적인 토론을 했습니다. 우리는 CakePHP에 대해 이야기하기 시작했고 그는 나에게 이렇게 말했습니다. “오, 그건 ORM을 사용하지 않습니까? 그게 무서울 수 있어요.” 나는 그에게 무슨 뜻인지 물었고 그는 ORM(Object-relational mapping)을 사용하면 SQL 쿼리가 불필요하게 커지기 쉽다고 말했습니다.

그는 어떤 면에서 옳다. CakePHP의 마법 중 일부는 ORM을 사용하고 서로 다른 데이터베이스 테이블 관계를 그룹화하는 방식에 있습니다. 기본적으로 CakePHP는 관련된 '소속', '하나 있음' 및 '많음' 데이터를 자동으로 선택하므로 매우 큰 SQL 쿼리가 발생할 수 있습니다. 이러한 쿼리는 응용 프로그램을 처음 개발할 때는 문제가 되지 않을 수 있지만 라이브 데이터를 수집한 지 6개월 후에는 응용 프로그램이 매우 느려지고 쿼리가 최적화되지 않은 경우 충돌이 발생하는 경우가 있습니다.

기존 웹사이트를 감사할 때 두 가지를 고려합니다. 첫째, 기본 재귀 수준이 변경되었습니까? 기본적으로 CakePHP는 재귀 수준을 1로 설정하는데, 제 생각에는 너무 높습니다. 저는 항상 -1로 설정한 다음 포함 가능한 동작을 사용하여 관련 모델을 가져옵니다.

그것은 내가 찾는 두 번째로 이어집니다. Containable 동작이 사용되었습니까? 나는 종종 새로운 고객이 와서 CakePHP가 느리다고 말합니다. 그 이유는 거의 항상 Containable이 사용되지 않았기 때문입니다! 훌륭한 CakePHP 프로그래머는 배후에서 "자동 마법"이 얼마나 많이 수행되는지에 관계없이 SQL 쿼리를 최적화합니다.

포함 가능한 동작은 CakePHP 1.2까지 추가되지 않았지만, 변화를 가져왔습니까?! 가능한 한 많이 포함 가능한 것을 사용하십시오. SQL을 최적화하는 효과적인 방법입니다. Containable 동작을 구현하고 사용하는 방법에 대한 자세한 내용을 보려면 여기를 클릭하십시오.

일반적인 실수 #3: 모델 대신 컨트롤러에 비즈니스 로직 유지

좋은 CakePHP 코드는 모델 파일에 논리가 있습니다. 익숙해지려면 약간의 시간이 필요하지만 일단 숙달되면 뒤돌아보지 않아도 됩니다! 컨트롤러 파일은 MVC 패턴에서 의도한 대로 사용해야 합니다. 따라서 컨트롤러 파일을 사용하여 사용자 작업을 처리하고 비즈니스 로직이 모델 파일에 들어가도록 하십시오.

이에 대한 좋은 예는 간단한 CRUD - 일상적인 행동입니다! 블로그 튜토리얼의 게시물 추가 기능을 예로 들어 보겠습니다. 기본 추가 기능은 다음과 같습니다.

 public function add() { if ($this->request->is('post')) { $this->Post->create(); if ($this->Post->save($this->request->data)) { $this->Session->setFlash(__('Your post has been saved.')); return $this->redirect(array('action' => 'index')); } $this->Session->setFlash(__('Unable to add your post.')); } }

이 컨트롤러 작업은 간단한 추가에 적합하지만 게시물이 추가될 때 관리자에게 이메일을 보내거나 게시물이 추가될 때 다른 모델 연결을 업데이트하는 것과 같은 작업을 수행하려는 경우 어떻게 될까요? 이것은 추가 논리이지만 이 논리는 컨트롤러 파일에 들어가지 않아야 합니다.

대신 Post.php 모델에서 이에 대한 함수를 작성합니다. 아마도 다음과 같을 것입니다.

 public function addPost($data = array(), $emailAdmin = true) { $this->create(); $this->save($data); // update any other tables // send the email to the admin user if ($emailAdmin) { } // if all is successful return true; }

그러면 컨트롤러 동작이 다음과 같이 약간 변경됩니다.

 public function add() { if ($this->request->is('post')) { if ($this->Post->addPost($this->request->data)) { $this->Session->setFlash(__('Your post has been saved.')); return $this->redirect(array('action' => 'index')); } $this->Session->setFlash(__('Unable to add your post.')); } }

보시다시피 $this->Post->create() 가 모델 파일로 이동되었기 때문에 새 작업은 실제로 한 줄 줄어듭니다.

이것은 논리를 모델 파일로 이동하는 것이 좋은 아이디어이며 훨씬 더 깔끔한 코드 기반을 만드는 완벽한 일상적인 예입니다!

일반적인 실수 #4: 자주 그리고 일찍 반환하는 대신 코드에 너무 많은 복잡성 추가

이것은 항상 약간의 진행 중인 논쟁이지만 자주 반환하고 일찍 반환하면 확실히 훨씬 더 깔끔한 코드가 됩니다. 이것은 다른 무엇보다 모델 방법에 적용됩니다.

하지만 정확히 무엇을 의미합니까? 글쎄, 우리가 위의 CakePHP 튜토리얼에서 추가한 방법을 살펴보자:

 public function addPost($data = array(), $emailAdmin = true) { $this->create(); $this->save($data); // update any other tables // send the email to the admin user if ($emailAdmin) { } // if all is successful return true; }

자주 반환하고 일찍 반환한다는 것은 함수를 실행할 때 모든 것이 정상인지 정기적으로 확인한다는 것을 의미합니다. 그렇지 않은 경우 false를 반환하거나 CakePHP 오류를 반환합니다.

이것을 예를 들어 보여주는 것이 가장 쉬울 것입니다. 위의 함수를 작성할 수 있는 두 가지 방법이 있습니다.

 public function addPost($data = array(), $emailAdmin = true) { if ($data) { $this->create(); $result = $this->save($data); if ($result) { // update any other tables // send the email to the admin user if ($emailAdmin) { // send the admin email } } else { // problem saving the data return false; } // if all is successful return true; } else { // no data submitted return false; } }

코드가 어떻게 빨리 읽을 수 없게 되는지 보셨습니까? if s 와 else s 가 도처에 있고 함수는 빠르게 하나의 큰 들여쓰기가 됩니다. 오해하지 마세요. 저는 깨끗한 들여쓰기를 좋아하지만 return으로 자주 작성되는 경우 함수가 어떻게 보이는지 확인하고 초기 원칙을 반환하십시오.

 public function addPost($data = array(), $emailAdmin = true) { if (!$data) { // no data submitted return false; } $this->create(); $result = $this->save($data); if (!$result) { // problem saving the data return false; } // update any other tables // send the email to the admin user if ($emailAdmin) { // send the admin email } // if all is successful return true; }

바로 이 작은 예제에서 코드에 들여쓰기가 하나만 있고 훨씬 더 읽기 쉽다는 것을 알 수 있습니다. 논리가 실제로 더 합리적입니다. 논리가 한 줄씩 실행되도록 하고, 도중에 문제가 있으면 오류를 반환하고 다음 줄로 진행하지 마십시오.

이것은 CakePHP 프로그래머가 우리가 읽는 것과 같은 방식으로 작성할 수 있도록 합니다. 다른 블록이 아닌 왼쪽에서 오른쪽으로, 위에서 아래로 코드를 읽는 것이므로 빠르게 혼란스러워질 수 있습니다!

일반적인 실수 #5: DRY 원칙을 사용하지 않음

DRY는 Don't Repeat Yourself의 약자로, CakePHP로 코딩할 때 따라야 하는 철학입니다. 객체 지향 코드를 사용하면 동일한 코드 블록을 두 번 반복할 변명의 여지가 없습니다!

다음은 반복하지 않도록 하기 위한 몇 가지 CakePHP 팁입니다.

  • 위에서 언급했듯이 논리를 공유할 수 있도록 모델 파일에 논리를 넣는 것을 목표로 합니다.

  • 보기 파일에서 보기를 반복하는 경우 보기 코드를 요소 또는 사용자 정의 도우미로 생성하십시오.

  • 일부 구성 설정을 지정하십시오. app/Config/bootstrap.php 파일은 이를 위한 좋은 장소입니다. 이렇게 하면 응용 프로그램 이름 및 기본 이메일 주소와 같은 항목을 하드 코딩하지 않도록 하는 데 도움이 됩니다. 마지막으로 하고 싶은 일은 클라이언트가 애플리케이션에서 이메일 주소 업데이트를 요청했기 때문에 수백 개의 파일을 살펴보는 것입니다.

  • 항상 스스로에게 "내가 코드를 반복한다면 이 코드를 작성하는 더 좋은 방법이 있습니까? 그리고 이 코드를 올바른 위치에 배치하고 있습니까?"라고 자문해 보십시오. 코드를 반복해야 하는 경우 더 잘 작성할 수 있습니다.

일반적인 실수 #6: 코드에 주석을 달지 않음

마지막으로 언급할 사항은 댓글에 관한 것입니다. 첫째, 문서 차단. 문서 블록은 메서드 또는 작업을 문서화할 때입니다. 함수가 하는 일을 기록하는 데는 1분도 걸리지 않지만 코드의 가독성 측면에서 큰 차이를 만듭니다.

CakePHP 문서 블록은 페이지의 왼쪽 여백과 반대 방향으로 이동해야 합니다. 따라서 위의 코드를 사용하는 간단한 예입니다.

 /** * Adds & saves a post as well as emails the admin to let them know the post has been added. * Also performs some saving to another table * * @param array $data The post data * @param bool $emailAdmin If set to true, will email the website admin * @return bool Returns true if successful */ public function addPost($data = array(), $emailAdmin = true) {

보시다시피 문서 블록을 작성하는 데 오랜 시간이 걸리지는 않지만 코드의 수명 측면에서 큰 차이를 만듭니다. 궁극적으로 이는 코드가 개발자로서 과거에 살 수 있음을 의미합니다.

인라인 주석도 마찬가지입니다. 코드가 무엇을 하고 왜 하는지 설명하는 것을 두려워하지 마십시오! 특히 다른 개발자가 코드를 보고 있는 경우 장기적으로 코드를 훨씬 더 쉽게 이해할 수 있습니다!

마무리

CakePHP는 광범위하고 완전한 기능을 갖춘 프레임워크입니다. 구성보다 관례를 따른다는 점을 감안할 때 CakePHP는 다른 PHP 기반 프레임워크보다 엄격합니다. 이것은 논란의 여지가 있지만 내 경험에 따르면 개발자가 코드 작성 방법을 "선택"하도록 하는 대신 보다 일관되고 읽기 쉽고 이해하기 쉬운 코드 기반으로 이어집니다. 개발 팀은 Cake의 규칙에 따라 일관된 코드를 작성할 것입니다. .

이 CakePHP 튜토리얼을 따르고 코드가 잘 작성되었는지 확인함으로써 애플리케이션은 시간의 테스트를 견딜 수 있습니다. 코드는 항상 내일을 위해 작성되어야 합니다. 그래야만 다른 개발자가 몇 년 후에 특정 코드 블록을 볼 때 코드를 이해하고 예상되는 표준을 준수할 수 있습니다. CakePHP도 다르지 않으며 이 가이드가 나쁜 습관을 고치는 데 도움이 되기를 바랍니다.