私のCakePHP3レビュー–まだ新鮮で、まだ暑い
公開: 2022-03-11先月、CakePHPチームはCakePHP 3のアルファリリースの立ち上げを発表しました。Cake開発チームはバージョン3をゲームチェンジャーと見なしているため、バージョン3のアルファリリースがオーブンから出てきたので、この記事はPHP開発のための効果的な最新のフレームワークとしてのCakePHP3の見直し。
簡単な歴史
最近、PHP開発に関しては非常に多くのオプションがあります。 PHPが成熟するにつれて、ますます多くのPHPフレームワークが登場し、開発者に幅広い選択肢を提供しています。 しかし、それはいつもそうだったわけではありません。
PHP 4がまだ標準であった2005年には、PHPフレームワークはなく、PHPでオブジェクト指向コーディングアプローチを開発することは確かに課題でした。 その後、CakePHPが登場しました。これは史上初のPHPMVCフレームワークです。 CakePHPは、最初にリリースされてから10年近くが経過し、進化を続け、PHP開発者の健全な市場シェアを維持しています。
CakePHPフレームワークはどれくらい人気がありますか? これは、GitHubで最も人気のあるPHPプロジェクトのトップ4にランクされており、約130,000プロジェクトで、32,000トピックのCakePHPGoogleグループに18,000人以上のメンバーがいます。 コードへの270人の貢献者とドキュメントへの320人の貢献者で、CakePHPが大きな支持を持っていることは否定できません。 CakePHPの現在の普及と人気の高まりは、この記事の執筆中にインタビューした、CakeSoftwareFoundationのCakePHPのコアメンバーおよびコミュニティマネージャーであるJamesWattsによる記事によく要約されています。
フレームワークのバージョン3が利用可能になったことで、CakePHPは、PHPの世界で主導的な力を維持し、今日のPHPフレームワークの多様な状況の中で主要な競争相手であり続けることが最も確実に期待されています。
CakePHPのバージョン3の新機能は何ですか?
このレビューは、CakePHP 3.0のアルファリリースに基づいています。これには、次のような多くの新機能と拡張機能が組み込まれています。
よりよい性能。 バージョン3には、ブートストラッププロセス、ルーティングプロセス、およびヘルパーテンプレートを生成するためのプロセスのいくつかの部分のパフォーマンスが向上しています。
強化されたコンポーネントとヘルパー。 バージョン3は、新しいFlashHelperおよびFlashComponentを使用して、「フラッシュメッセージ」のサポートを強化しています。 さらに、CookieComponentが拡張され、Cookie名前空間の構成とCookieデータの処理を簡単に分離できるようになりました。
改善されたセッション管理。 セッション管理は常にCakePHPの静的クラスであり、多くの点で問題があることが証明されています。 バージョン3では、リクエストオブジェクト
$this->request->session()
からセッションにアクセスできるようになりました。 この変更により、セッションのテストも容易になり、CakePHPでPHPUnit4.xを使用できるようになります。規則の一貫性が向上しました。 アプリケーションスケルトンとプラグインスケルトンは、相互の一貫性を高めるために、同じディレクトリ構造を使用するように更新されました。
テーマとプラグインが統合されました。 CakePHP 3の主な目標は、テーマをより強力で堅牢にすることでした。 その目標に向かって取り組むと、テーマがプラグインと同じ機能を提供することが本当に必要であることが明らかになりました。 したがって、任意のプラグインをテーマとして使用できるようになり、パッケージ化と再配布も簡素化されます。
ORMの改善。 ORM(オブジェクトリレーショナルマッピング)にいくつかのAPIの変更が加えられました。 特に、操作を保存するための深い関連付けを指定する方が簡単になり、新しい採用者間の学習曲線と混乱を減らすために、いくつかの規則が変更されました。
さらに、バージョン3.0のベータリリースに組み込まれる予定の追加機能がいくつかあります。 最も重要なこと:
- 国際化とローカリゼーション(i18nおよびL10n)機能の拡張
- エッジサイドインクルードに基づく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
になります)。
説明のために、ブログ投稿データベースからの2つのテーブル( articles
とusers
)の簡単なレビューを考えてみましょう。 この例では、 Articles
はUsers
に「所属」し、 Users
はArticles
に「HasMany」と言います。 これらの関係は、CakePHP3.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に知らせるために、コードに次の2つの小さな変更を加える必要があります。
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)は、CakePHPのフレームワーク規則から大きな恩恵を受けています。 データベーススキーマをCakeの標準に設定することにより、Cakeの強力なORMを介してテーブルをすばやく接続できます。 CakePHPはテーブル結合、 hasMany
、さらにはhasAndBelongsToMany
関係などを簡単に処理するため、SQLステートメントを記述する必要はほとんどありません。
CakePHPのContainableBehavior
を利用して、モデルの関連付けを通じて、SQLクエリから選択するデータベーステーブルとフィールドを指定できます。 これにより、いくつかのテーブルが深くなる可能性があり、ORMを使用すると、非常に複雑なSQLステートメントを簡単に作成できます。
ちなみに、CakePHPのContainableBehavior
は、CakePHPがPHP開発を簡素化および合理化する方法の優れた例です。 クリーンで一貫性のある方法でデータを検索およびフィルタリングするのに役立ち、アプリケーションの速度と全体的なパフォーマンスを向上させるのにも役立ちます。 (これは、提供された包含を使用して、対応する一連のunbindModel
およびbindModel
呼び出しを生成し、モデルの関連付けを一時的または永続的に変更することによって機能します。)
ORMの課題は、SQLの使用が非常に簡単になるため、開発者が注意を怠ると、意味のない非効率的なSQLクエリを記述できることです。 私は確かに、クエリを合理化していない、不十分に記述されたCakeアプリケーションを何度も見ました。 これらの問題は、システムが展開されてから数年後、データベースが大きくなり、不適切に記述されたクエリがますます遅くなるときに表面化する傾向があります。
ここでの主な問題は、最新のCakePHPバージョン3より前では、CakeのORMは、クエリを実行するときにデフォルトで関連するテーブルを取得することです。 その結果、基盤となるSQLが関連するすべてのテーブルからすべてのデータを取得するため、単純な「すべて検索」クエリが非常に肥大化する可能性があります。 バージョン3では、この動作はデフォルトではなくなりました。 (以前のバージョンのCakePHPでは、このデフォルトの動作は、 public $recursive = -1;
をメインのAppModel.php
ファイルに追加するだけで簡単に無効にできます。)
全体として、CakeのORMのレビューは、開発を合理化するのに本当に役立ち、正しく使用されれば、複雑なクエリをすばやく構築するための素晴らしいツールであることを示しています。 それでも、開発者がORMを完全に理解し、クエリが適切に最適化されていることを確認するために時間をかけることが重要です(どの言語でもそうです)。
コンポーネントとヘルパー:CakePHPライブラリ
CakePHPの優れた機能の1つは、多くの退屈で反復的で退屈な開発タスクを排除する組み込みライブラリ(コンポーネントとヘルパー)です。 MVCコンテキストでは、コンポーネントはコントローラー開発の合理化に役立ち、ヘルパーはビューのコーディングとロジック(つまり、プレゼンテーション層)を簡素化します。
たとえば、 PaginatorComponent
は、検索クエリから次/前のページインターフェイスを自動的に構築します。 JsHelper
を追加すると、突然、お気に入りのJavaScriptフレームワーク(デフォルトではjQuery)を利用したAJAXページ付けができます。
その他の便利なヘルパーの簡単なサンプルは次のとおりです。
-
TimeHelper
:日付と時刻の表示を簡単にし、時間値をフォーマットおよび評価するための一連の関数を提供します。 -
NumberHelper
:さまざまな一般的な(またはカスタマイズされた)形式と精度で数値を表示するための便利な方法を提供します。 -
TextHelper
:リンクの有効化、URLのフォーマット、選択した単語やフレーズの周囲のテキストの抜粋の作成、テキストのブロック内のキーワードの強調表示、および長いテキストの切り捨てを支援します。
そして、もっとたくさんあります。
CakePHP3に対する批判
確かに、すべてのフレームワークには長所と短所があり、CakePHPも例外ではありません。 このレビュー以外でCakePHPで平準化された最も一般的な批判のいくつかは次のとおりです。
「レガシーフレームワーク。 膨満感と遅い。」 この批判は通常、歴史的なものであり、今日の真実は限られています。 PHP 4までさかのぼってPHPバージョンをサポートするには、これまで、PHP独自のレガシー問題の多くに対処するためにCakePHPが必要でした。 PHPの成熟に伴い、特にCakePHPバージョン3のリリースに伴い、この主張は実際にその有効性を失いました。
「過度に厳格で制限的です。」 CakePHPの慣習には明らかな利点がありますが、それでもそれらを批判する人がいます。 批評家は、規則が厳しすぎると主張することがよくありますが、これらの規則が簡単に上書きされる可能性があることを認識(または承認)できません。 Cakeは、標準的な一連の規則を採用することで、開発の一貫性を保つように見えます。これは、PHPのコーディング慣行が緩いことを考えると、前向きなこととしてのみ見なされるべきです。
「遅いリリースサイクル」。 遅いリリースサイクルは必ずしも悪いわけではありません。 それどころか、あまりにも積極的なリリースサイクルは、実際にはより問題になる可能性があります。 実際、CakePHPのメジャーリリースに時間がかかる理由の一部は、まだ広く展開されている以前のバージョンのPHPとの下位互換性を確保するためです。 さらに、この保守的なリリースサイクルと下位互換性の強調により、新しいバージョンがリリースされたときにコードに大きな(そして頻繁な)変更を加える必要がなくなります。 また、CakePHP 3チームは、毎月リリースされるマイナーリリース(バグ修正、パッチ、マイナー拡張など)に関しては遅いとは言えないことにも注意してください。 同様に、ほとんどのバグチケットは投稿されてから数時間以内に回答されます。
「すぐに使えるソリューションではありません。」 他の多くの最新の「すぐに使えるWebアプリ」PHPフレームワーク(たとえば、Yiiなど)とは対照的に、CakePHPは意図的にカスタムソリューションをサポートおよび有効化するように見えます。 私は、多数の大規模なカスタムのデータベース駆動型Webサイトおよびアプリケーションを開発する際に、これから個人的に大きな恩恵を受けました。
「オブジェクトではなくデータ配列を使用します。」 バージョン3以降、これは当てはまりません。以前のバージョンでは、データを格納し、ネストされた配列として参照する必要がありました(たとえば、
$user['User']['username']
)。 CakePHP 3は最終的にこれに対処し、代わりにデータをオブジェクトとして保存します(たとえば、$user->username
)。「不十分なドキュメント。」 CakePHPのドキュメントは、必ずしも初心者を念頭に置いて書かれているとは限らないという点で、この批判にはある程度の妥当性があります(重要な情報は、1、2文で説明されることもありますが、数段落の説明が必要な場合もあります)。 )。 Cake開発チームはこれを認識しており、それに応じてドキュメントの改善に取り組んでいます。 実際、CakePHP 3ドキュメントのホームページには、ドキュメントの「品質、有効性、正確性」に対する高いレベルの取り組みが明示されています。 CakePHPはコミュニティ主導のフレームワークであるため、「このドキュメントを改善する」ボタンがドキュメントのすべてのページに提供され、CakePHPユーザーがドキュメントに独自の追加、削除、または修正を提供できるようにします。
結論
全体として、最初のリリースからほぼ10年後、CakePHPのレビューは、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は、アイルランドを拠点とするToptalエンジニアであり、CakePHPの豊富な経験があります。 彼はフレームワークを使用して100を超えるWebサイトを開発し、CakeDC(CakePHPフレームワークの背後にある営利団体)のチームと協力し、さまざまなパッチを提出し、CakePHPのドキュメントを手伝ってきました。