My CakePHP 3 검토 – 여전히 신선하고 여전히 뜨겁습니다.
게시 됨: 2022-03-11지난 달에 CakePHP 팀은 CakePHP 3의 알파 릴리스 출시를 발표했습니다. 케이크 개발 팀은 버전 3을 게임 체인저로 간주하므로 현재 뜨거운 인기를 얻고 있는 버전 3의 알파 릴리스와 함께 이 기사는 PHP 개발을 위한 효과적인 현대적 프레임워크인 CakePHP 3에 대한 새로운 시각.
짧은 역사
요즘에는 PHP 개발과 관련하여 많은 옵션이 있습니다. PHP가 성숙해짐에 따라 점점 더 많은 PHP 프레임워크가 등장하여 개발자에게 다양한 선택을 제공합니다. 그러나 항상 그런 것은 아닙니다.
PHP 4가 여전히 표준이었던 2005년에는 PHP 프레임워크가 없었고 PHP에서 객체 지향 코딩 접근 방식을 개발하는 것은 확실히 어려운 일이었습니다. 그때 최초의 PHP MVC 프레임워크인 CakePHP가 등장했습니다. 처음 출시된 후 거의 10년이 지난 동안 CakePHP는 PHP 개발자의 건강한 시장 점유율을 유지하면서 계속 발전해 왔습니다.
CakePHP 프레임워크는 얼마나 인기가 있습니까? 약 130,000개 프로젝트 중 GitHub에서 가장 인기 있는 PHP 프로젝트 4위에 올랐으며 32,000개 주제와 함께 CakePHP Google 그룹에 18,000명 이상의 회원이 있습니다. 코드 기여자 270명과 문서 기여자 320명으로, CakePHP가 큰 지지를 받고 있다는 사실은 부인할 수 없습니다. 현재 널리 퍼진 CakePHP의 인기는 내가 이 기사를 작성하는 동안 인터뷰한 Cake Software Foundation의 CakePHP 핵심 회원이자 커뮤니티 관리자인 James Watts의 기사에 잘 요약되어 있습니다.
현재 사용 가능한 프레임워크 버전 3을 통해 CakePHP는 오늘날 PHP 프레임워크의 다양한 환경 속에서 PHP 세계의 선두 주자이자 주요 경쟁자로 남을 것으로 가장 확실하게 예상됩니다.
CakePHP 버전 3의 새로운 기능은 무엇입니까?
이 리뷰는 다음을 포함한 여러 가지 새로운 기능과 개선 사항을 통합한 CakePHP 3.0의 알파 릴리스를 기반으로 합니다.
더 나은 성능. 버전 3은 부트스트랩 프로세스, 라우팅 프로세스 및 도우미 템플릿 생성을 위한 프로세스의 여러 부분에 대한 성능 향상을 통합합니다.
향상된 구성 요소 및 도우미. 버전 3은 새로운 FlashHelper 및 FlashComponent를 통해 "플래시 메시지"에 대한 향상된 지원을 제공합니다. 또한 CookieComponent가 향상되어 쿠키 네임스페이스 구성과 쿠키 데이터 처리를 보다 쉽게 분리할 수 있습니다.
향상된 세션 관리. 세션 관리는 항상 여러 면에서 문제가 있는 것으로 입증된 CakePHP의 정적 클래스였습니다. 버전 3에서는 이제 요청 개체
$this->request->session()
에서 세션에 액세스할 수 있습니다. 또한 이 변경으로 인해 세션을 더 쉽게 테스트할 수 있으며 CakePHP에서 PHPUnit 4.x를 사용할 수 있습니다.규칙의 일관성이 향상되었습니다. 애플리케이션 스켈레톤과 플러그인 스켈레톤은 서로 일관성을 유지하기 위해 동일한 디렉토리 구조를 사용하도록 업데이트되었습니다.
테마와 플러그인이 병합되었습니다. CakePHP 3의 주요 목표는 테마를 더 강력하고 강력하게 만드는 것이었습니다. 그 목표를 향해 일하면서 정말로 필요한 것은 테마가 플러그인과 동일한 기능을 제공하는 것이라는 것이 분명해졌습니다. 따라서 이제 모든 플러그인을 테마로 사용할 수 있으므로 패키징 및 재배포도 간소화됩니다.
ORM 개선. ORM(객체 관계형 매핑)에 여러 API가 변경되었습니다. 가장 주목할만한 점은 이제 저장 작업에 대한 깊은 연관을 지정하는 것이 더 간단하고 새로운 사용자 간의 학습 곡선과 혼란을 줄이기 위해 몇 가지 규칙이 변경되었다는 것입니다.
또한 버전 3.0의 베타 릴리스에 통합될 예정인 몇 가지 추가 기능이 있습니다. 가장 중요한 것은:
- 국제화 및 현지화(i18n 및 L10n) 기능 향상
- Edge Side Include 기반 CacheHelper 대체
- 더 간단하고 빠른 경로 선언을 위한 새로운 라우팅 API
실제로 버전 3은 이전 버전의 CakePHP를 뛰어넘는 상당한 업그레이드를 나타냅니다.
왜 CakePHP인가?
CakePHP에는 많은 훌륭한 기능이 있지만 이 리뷰는 특히 그것을 차별화하는 데 도움이 되는 몇 가지에 중점을 둡니다.
- 구성보다 관례
- CakePHP의 ORM(객체 관계형 매핑)
- 구성 요소 및 도우미
구성보다 관례
CakePHP는 항상 신속하고 일관된 개발을 추구해 왔으며 이를 위해 CakePHP는 관례에 큰 중점을 둡니다. 따라서 Ruby on Rails(CakePHP에서 영감을 많이 얻었음)와 마찬가지로 CakePHP는 구성 원칙보다 관례를 많이 따릅니다.
규칙은 개발자가 CakePHP 프레임워크를 사용하는 방법을 배울 때 "어디로 가는지"에 대해 생각할 필요가 없다는 것을 의미합니다. 이러한 규칙에 대한 기본값이 이미 설정되어 있기 때문입니다. CakePHP 규칙에 익숙해질 필요가 있지만 일단 숙달되면 개발자는 코드가 배치된 위치 및 기타 구성 문제에 대해 걱정할 필요 없이 핵심 개발에 집중할 수 있습니다.
CakePHP의 규칙은 상당히 자유로운 언어인 PHP 자체와 완전히 대조적입니다. 그 규약의 결과로, CakePHP는 여러 개발자와 심지어 여러 팀에 걸쳐 코딩 스타일과 구조의 일관성을 보장하는 데 도움이 됩니다. 표준 규칙 세트를 채택함으로써 Cake는 개발을 보다 일관성 있게 만들기 위해 노력합니다.
예를 들어 데이터베이스 스키마의 경우 CakePHP는 특정 변수, 테이블 이름 및 필드의 이름이 지정되는 방식과 관련하여 특정 기본 가정을 합니다. 특히, Cake는 다음을 기대합니다.
- 테이블 이름은 복수형입니다(예:
orders
). - 기본 키 필드의 이름은
id
입니다. - 외래 키 필드의 이름은 참조된 테이블 이름 뒤에
_id
가 따라오는 것을 기반으로 합니다(예:customers
테이블에 대한 외래 키는 이름이customer_id
임).
설명을 위해 블로그 게시물 데이터베이스에서 두 개의 테이블( articles
및 users
)에 대한 간단한 검토를 고려해 보겠습니다. 이 예에서 Articles
"BelongsTo"는 Users
이고 Users
는 "HasMany" Articles
입니다. 이러한 관계는 CakePHP 3.0에서 다음과 같이 지정됩니다.
In ArticlesTable.php: class ArticlesTable extends Table { public function initialize(array $config) { $this->belongsTo('Users'); } } In UsersTable.php: class UsersTable extends Table { public function initialize(array $config) { $this->hasMany('Articles'); } }
CakePHP는 기본 규칙을 가정하므로 연결을 가져올 때 찾을 외래 키(예: articles
테이블의 user_id
)를 자동으로 압니다.
그러나 CakePHP 3 에서는 기본 규칙을 쉽게 무시할 수 있다는 점을 강조하는 것이 중요합니다. 예를 들어, users
테이블의 외래 키가 user_id
대신 author_id
라고 했다고 가정해 보겠습니다. 이것을 지정하는 것은 우리가 기본값을 사용하지 않는다는 것을 CakePHP에 알리기 위해 우리 코드에 다음 두 가지 작은 변경이 필요합니다:
In ArticlesTable.php: class ArticlesTable extends Table { public function initialize(array $config) { $this->belongsTo('Users' => ['foreignKey' => 'author_id']); } } In UsersTable.php: class UsersTable extends Table { public function initialize(array $config) { $this->hasMany('Articles' => ['foreignKey' => 'author_id']); } }
따라서 규칙이 실제로 CakePHP에 필수적이며 확실히 장점이 있지만 필요할 때 규칙을 재정의하는 것은 여기에서 보듯이 매우 간단합니다.
일부 개발자는 규칙에 크게 의존하지 않는 PHP 프레임워크(예: Yii 및 Laravel)를 선호할 수 있지만 CakePHP 규칙은 실제로 상당히 유리할 수 있습니다. 다른 개발자가 작성한 코드를 개선하거나 유지 관리해야 할 때 CakePHP 개발자의 램프업 시간을 크게 줄이는 데 도움이 될 수 있습니다. 이는 여러 CakePHP 개발자 및 프로젝트에서 일관된 코딩 구조와 규칙을 생성하기 때문입니다.

CakePHP의 객체 관계형 매핑(ORM)
CakePHP의 ORM(Object-relational mapping)은 CakePHP의 프레임워크 규약으로부터 큰 이점을 얻습니다. 데이터베이스 스키마를 Cake의 표준으로 설정하면 Cake의 강력한 ORM을 통해 테이블을 빠르게 연결할 수 있습니다. CakePHP가 테이블 조인, hasMany
및 hasAndBelongsToMany
관계와 같은 것을 쉽게 처리하므로 SQL 문을 작성할 필요가 거의 없습니다.
CakePHP의 ContainableBehavior
를 활용하여 모델 연결을 통해 SQL 쿼리에서 선택할 데이터베이스 테이블과 필드를 지정할 수 있습니다. 이것은 여러 테이블에 깊이 들어갈 수 있으며 ORM을 통해 매우 복잡한 SQL 문을 신속하게 구성하기 쉽습니다.
덧붙여서, CakePHP의 ContainableBehavior
는 CakePHP가 PHP 개발을 어떻게 단순화하고 능률화할 수 있는지를 보여주는 좋은 예입니다. 깨끗하고 일관된 방식으로 데이터를 검색하고 필터링하는 데 도움이 되며 애플리케이션의 속도와 전반적인 성능을 높이는 데도 도움이 됩니다. (제공된 포함을 사용하여 해당 일련의 bindModel
및 unbindModel
호출을 생성하여 모델의 연결을 일시적으로 또는 영구적으로 변경하여 작동합니다.)
ORM의 문제는 SQL 사용을 매우 간단하게 만들어 개발자가 주의하지 않으면 의미 없이 비효율적인 SQL 쿼리를 작성할 수 있다는 것입니다. 쿼리를 능률화하지 못한 제대로 작성된 Cake 응용 프로그램을 여러 번 보았습니다. 이러한 문제는 시스템이 배포된 후 몇 년이 지나면 데이터베이스가 커지고 잘못 작성된 쿼리가 점점 느려질 때 표면화되는 경향이 있습니다.
여기서 주요 문제는 최신 CakePHP 버전 3 이전에는 기본적으로 Cake의 ORM이 쿼리를 수행할 때 연결된 테이블을 검색 한다는 것입니다. 결과적으로 기본 SQL이 연결된 모든 테이블에서 모든 데이터를 검색하므로 간단한 "모두 찾기" 쿼리가 잠재적으로 상당히 부풀려질 수 있습니다. 버전 3에서 이 동작은 더 이상 기본값이 아닙니다. (그리고 이전 버전의 CakePHP에서는 기본 AppModel.php
파일에 public $recursive = -1;
을 추가하기만 하면 이 기본 동작을 쉽게 비활성화할 수 있습니다.)
전반적으로, Cake의 ORM에 대한 리뷰는 이것이 개발을 합리화하는 데 정말로 도움이 되며 올바르게 사용된다면 복잡한 쿼리를 빠르게 작성하는 놀라운 도구임을 보여줍니다. 그럼에도 불구하고 개발자가 시간을 내어 ORM을 완전히 이해하고 쿼리가 적절하게 최적화되었는지 확인하는 것이 중요합니다(모든 언어에서 마찬가지임).
구성 요소 및 도우미: CakePHP 라이브러리
CakePHP의 훌륭한 기능 중 하나는 지루하고 반복적이며 지루한 개발 작업을 제거하는 내장 라이브러리(구성 요소 및 도우미)입니다. MVC 컨텍스트에서 구성 요소는 컨트롤러 개발을 간소화하는 데 도움이 되는 반면 도우미는 보기 코딩 및 논리(즉, 프레젠테이션 계층)를 단순화합니다.
예를 들어 PaginatorComponent
는 찾기 쿼리에서 다음/이전 페이지 인터페이스를 자동으로 마술처럼 빌드합니다. JsHelper
를 추가하면 갑자기 좋아하는 JavaScript 프레임워크(기본적으로 jQuery)로 구동되는 AJAX 페이지 매김이 생깁니다.
다른 유용한 도우미의 빠른 샘플링에는 다음이 포함됩니다.
-
TimeHelper
: 날짜 및 시간 표시를 쉽게 만들어 시간 값의 형식 지정 및 평가를 위한 기능 모음을 제공합니다. -
NumberHelper
: 다양한 공통(또는 사용자 정의된) 형식 및 정밀도로 숫자를 표시하기 위한 편리한 방법을 제공합니다. -
TextHelper
: 링크 활성화, URL 형식 지정, 선택한 단어 또는 구 주위의 텍스트 발췌 생성, 텍스트 블록의 핵심 단어 강조 표시, 긴 텍스트 자르기 등을 지원합니다.
그리고 더 많은 것이 있습니다.
CakePHP 3에 대한 비판
확실히 모든 프레임워크에는 장단점이 있으며 CakePHP도 예외는 아닙니다. 다음은 이 리뷰 이외의 CakePHP에서 제기된 가장 일반적인 비판입니다.
“레거시 프레임워크; 더부룩하고 느리다.” 이 비판은 일반적으로 오늘날 제한된(있는 경우) 진실이 있는 역사적 비판에 가깝습니다. PHP 4까지 거슬러 올라가는 PHP 버전을 지원하려면 역사적으로 CakePHP가 많은 PHP 고유의 레거시 문제를 처리해야 했습니다. PHP의 성숙과 특히 CakePHP 버전 3의 출시와 함께 이 주장은 그 타당성을 상실했습니다.
“지나치게 엄격하고 제한적입니다.” CakePHP 규약에는 분명한 장점이 있지만 그럼에도 불구하고 이를 비판하는 사람들이 있습니다. 비평가들은 종종 규칙이 너무 엄격하다고 주장하지만 이러한 규칙을 쉽게 무시할 수 있다는 점을 인식(또는 인정)하지 못합니다. 표준 규칙 세트를 채택함으로써 Cake는 PHP의 느슨한 코딩 관행을 고려할 때 긍정적인 것으로만 여겨져야 하는 개발 일관성을 유지하려고 합니다.
"느린 릴리스 주기". 느린 릴리스 주기가 반드시 나쁜 것은 아닙니다. 반대로 너무 공격적인 릴리스 주기는 실제로 더 문제가 될 수 있습니다. 사실, CakePHP 주요 릴리스에 시간이 걸리는 이유 중 일부는 여전히 널리 배포되는 PHP의 이전 버전과의 역호환성을 보장하기 위해서입니다. 더욱이, 이러한 보수적인 릴리스 주기와 역호환성에 대한 강조는 새 버전이 릴리스될 때 코드에 대한 주요(그리고 빈번한) 변경의 필요성을 제거합니다. 또한 CakePHP 3 팀은 매월 릴리스되는 마이너 릴리스(버그 수정, 패치, 마이너 향상 등)와 관련하여 느리다는 점에 유의 해야 합니다. 마찬가지로, 대부분의 버그 티켓은 게시된 후 몇 시간 이내에 답변됩니다.
"즉시 사용 가능한 솔루션이 아닙니다." 다른 많은 최신 "즉시 사용 가능한 웹 앱" PHP 프레임워크(예: Yii)와 달리 CakePHP는 의도적으로 사용자 정의 솔루션을 지원하고 활성화합니다. 저는 개인적으로 대규모의 맞춤형 데이터베이스 기반 웹 사이트 및 응용 프로그램을 개발할 때 이로부터 많은 이점을 얻었습니다.
"객체보다 데이터 배열을 사용합니다." 이것은 버전 3부터 더 이상 사실이 아닙니다. 이전 버전에서는 모든 데이터를 저장하고 중첩 배열로 참조해야 했습니다(예:
$user['User']['username']
). CakePHP 3는 마침내 이 문제를 해결하고 데이터를 객체로 저장합니다(예:$user->username
).“불량 문서.” CakePHP 문서가 항상 초보자를 염두에 두고 작성된 것으로 보이지 않는다는 점에서 이 비판에는 어느 정도 타당성이 있습니다. ). Cake 개발팀은 이를 인지하고 있으며 그에 따라 문서를 개선하기 위해 노력하고 있습니다. 사실, CakePHP 3 문서의 홈 페이지는 문서의 "품질, 유효성 및 정확성"에 대한 높은 수준의 약속을 명시적으로 명시하고 있습니다. CakePHP는 커뮤니티 기반 프레임워크이므로 문서의 모든 페이지에 "이 문서 개선" 버튼이 제공되어 CakePHP 사용자가 문서에 자신의 추가, 삭제 또는 수정 사항을 기여할 수 있도록 하고 권장합니다.
결론
전반적으로, 최초 출시 후 거의 10년이 지난 지금, CakePHP에 대한 리뷰는 그것이 그 이후에 등장한 다른 많은 PHP 프레임워크에 대해 여전히 활기차고 강력한 경쟁자임을 보여줍니다.
CakePHP는 완전하고 포괄적인 개발 솔루션입니다. 코드 기반이 성숙하고 기능이 끝이 없어 보입니다. 전반적으로, Cake는 소프트웨어 개발자뿐만 아니라 투자자에게도 중요한 개발을 빠르게 하기 위해 만들어졌습니다. 소프트웨어 개발의 가장 큰 비용은 개발 시간의 비용이며, CakePHP는 개발 시간을 획기적으로 줄이는 것을 목표로 합니다.
CakePHP는 커뮤니티가 운영하는 프로젝트입니다. 점점 더 많은 사람들이 참여해야 더 좋아질 수 있습니다. 7년 동안 참여했고 커뮤니티가 계속 성장하는 것을 보았기 때문에 저는 CakePHP의 다음 단계가 기대됩니다. CakePHP 3의 출시와 PHP와 CakePHP의 성숙도는 프레임워크가 계속해서 향상될 것임을 의미합니다.
Ruby on Rails와 유사한 많은 이점을 제공하는 PHP 기반 솔루션을 찾고 있다면(사용 편의성 및 구성에 대한 관례 측면에서) CakePHP를 추천합니다. CakePHP 블로그 튜토리얼은 설정하고 실행하는 데 몇 분 밖에 걸리지 않습니다. 또는 CakeCoded는 PHP 개발자에게 CakePHP를 익히고 사용을 시작하는 데 도움이 되는 일련의 명확한 교훈을 제공합니다. 이러한 리소스를 사용하면 CakePHP가 PHP 소프트웨어 개발 노력의 속도를 높이고 향상시킬 수 있는 정도를 빠르게 알 수 있습니다. 즐기다!
Michael Houghton은 광범위한 CakePHP 경험이 있는 아일랜드 기반의 Toptal 엔지니어입니다. 그는 프레임워크로 100개 이상의 웹사이트를 개발했으며, CakeDC(CakePHP 프레임워크 뒤에 있는 상업 단체)의 팀과 협력했으며 다양한 패치를 제출했으며 CakePHP 문서 작성을 도왔습니다.