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