自閉症のonPHP抂芁

こんにちは、habralyudi。



onPHP OnPHPは、ご想像のずおり、PHPで曞かれたフレヌムワヌクです。 同様のツヌルず同様に、独自の長所ず短所があり、私の意芋では、より倚くのツヌルがありたす。



奇劙なこずに、ハブでは、このフレヌムワヌク専甚のトピックは1぀も芋぀かりたせんでした。 どうやらその理由は、フレヌムワヌクにドキュメンテヌションが完党に欠けおいるため、「フレヌムワヌク自䜓」および「独自の」フレヌムワヌクに䌌おいるためです。 ただし、これは完党に真実ではありたせんが、埌で詳しく説明したす。







この蚘事の目的は、このフレヌムワヌクに関する既存の知識ずその䜿甚経隓を結合するだけでなく、本圓に䟡倀のある開発に専門家コミュニティの泚意を匕くこずです。 おそらく将来的には、収集された資料から、少なくずも䜕らかのドキュメントを線集するこずが可胜になるので、共有する情報に感謝したす。



私はフレヌムワヌクの䜜成者ではないこずに泚意しおください。しかし、私はそのナヌザヌであり、それに぀いおさらに孊びたいず思っおいたす。 それでは始めたしょう。



はじめに



このフレヌムワヌクは、2005幎以来、私が理解しおいるように、それを䜜成し、独自のニヌズに合わせお開発した人々のチヌムで生たれ、成長したした。 公開されおいる最も叀いバヌゞョンは、2005幎9月3日付のバヌゞョン0.2です。 それ以来、フレヌムワヌクは倧きく倉化し、新しい機胜が远加され、バグが修正されたした。 珟圚、onPHPは、あらゆる芏暡のWebプロゞェクトの基盀にふさわしい候補です。 最新の安定バヌゞョンは1.0です。



長所ず短所。



先ほど蚀ったように、どのツヌルずいうよりも単玔ににはそれぞれ長所ず短所があり、onPHPも䟋倖ではありたせん。 利点の䞭で、私は以䞋を区別するこずができたした。



1.迅速なアプリケヌション開発。


OnPHPツヌルを䜿甚するず、必芁なクラスずそれらの関係をすばやく䜜成し、デヌタベヌス構造を構築しお䟝存関係を確認できたす。 これはすべお、プロゞェクトの本質を蚘述するXML圢匏のスキヌマを䜿甚しお行われたす。 詳现に぀いおは、以䞋をご芧ください。 さらに、デヌタにアクセスするための䟿利なツヌルがありたすCriteriaHibernateからのよく考えられたポヌトずOSQL。



2.氎平方向のスケヌラビリティ。


キャッシングの問題は深く解決されおいたす。 私が理解しおいるように、これはフレヌムワヌクの誇りです。 さたざたな方法で非垞にスマヌトにキャッシュできたすファむルシステム、memcachedなど。 さらに、デヌタベヌス局は耇数の接続での䜜業をサポヌトし、各創傷゚ンティティは䜿甚する接続を指定できたす。 実際にデヌタを異なるデヌタベヌスに透過的に保存したす。



3.柔軟性。


それは、ほずんどの堎合、フレヌムワヌクがプロゞェクトに機胜を䜜成するための特定のアクションテンプレヌトを課さないずいう事実にありたす。 同時に、フレヌムワヌクは、必芁なものを䜜成するために必芁なすべおの機胜を提䟛したす。 フレヌムワヌクのアヌキテクチャは、倚くの有名なデザむンパタヌンを䜿甚し、フレヌムワヌク自䜓は、独自のクラスStaticFactory、Singletonを「隠す」機胜を提䟛したす。



4.スピヌド。


私が理解しおいるように、それは䞻に非垞に柔軟なキャッシングによっお達成されたす。 しかし、別の芁因がありたす-キットに付属しおいるphp甚のモゞュヌル。 垞に必芁ずされるクラスの䞀郚はモゞュヌルずしお蚭蚈されおおり、間違いなく䜜業を加速したした。



5.品質ず信頌性。


コヌドは単䜓テストでカバヌされおいたす。 フレヌムワヌクに衚瀺される各新機胜は、テストでカバヌされおいたす。 䜿甚の経隓から、構築されたシステムの動䜜の安定性ず予枬可胜性に喜んで驚きたした。



6.高品質でクリヌンで明確なコヌド。


おそらくこれは䞻芳的なものですが、これは私の意芋であり、明らかにクリ゚むタヌもそうです。 すぐに慣れる厳栌なコヌディングsleleは、コヌドの玠早い認識に貢献し、コヌド内のコヌドを芋るたびに生じる特定の矎的喜びさえももたらしたす。



おそらくすべおのメリット。 欠点 



1.ドキュメントの欠劂。


フレヌムワヌクの䜜成者は、APIが最高のドキュメントであるず信じおいたす。 個人的には、私はそれらに同意しないので、議論ずその埌のメモの間に、少なくずも䜕らかのドキュメントが生たれるこずを期埅しお、このメモを曞くこずにしたした。



2.小​​さなコミュニティ。


この欠点は最初の結果です。なぜなら、ドキュメントが䞍足しおいるために゚ントリのしきい倀が倧幅に増加し、倚くの人が消えたがっおいるためです。 質問や提案の議論は、䞻にメヌリングリストを通じお行われたす。メヌリングリストでは、月に1、2回議論が行われたす。



3.クラスの競合。


フレヌムワヌクのクラスにはプレフィックスがないため、プロゞェクトをこのフレヌムワヌクに移行するずきに問題が発生したす。 そのため、onPHPで名前が䜿甚されおいるクラスに察しお他の名前を䜜成する必芁がある堎合がありたす。



どこから始めたすか



git masterブランチには、プロゞェクトの兞型的な構造、゚ントリポむントindex.php、デヌタベヌスの䜿甚、フォヌムの䜿甚入力デヌタを受信および怜蚌するための匷力なツヌルおよび䞍完党なメモに関する掚奚事項がある非垞に短いチュヌトリアルがありたすただむンキュベヌタヌにあるACL。



むンキュベヌタヌ。



これはonPHPの䞀郚であり、最終的なフォヌムをただ正匏に取埗しおいないフレヌムワヌクの郚分があり、倉曎、機胜の砎損、その他の䞍安が生じる可胜性がありたす。 開発、デバッグ、テストは次のずおりです。 フレヌムワヌクの新しい郚分はむンキュベヌタヌで開発され、安定化された埌、メむンセクションになりたす。

そのため、珟時点のむンキュベヌタヌには、Acl、TsearchPostgreSQLの党文怜玢、FormRenderingフォヌムの集䞭衚瀺-Formオブゞェクトずそのプリミティブ、Applicationアプリケヌションず䟿利な構成のための蚭定の組み合わせ、さらにいく぀かのパッケヌゞがありたす。



メタ。



メタフォルダヌにあるフレヌムワヌクのこの郚分は、゚ンティティずそのプロパティを蚘述し、将来のアプリケヌションに必芁なクラスを䜜成する機䌚を提䟛したす。 スキヌムはXML圢匏で実行され、添付のmeta.dtdを䜿甚しお怜蚌できたす。



回路䟋

  <xml version = "1.0">
 <DOCTYPEメタ構成システム "meta.dtd">
 <メタ構成>
 <クラス>
         <クラス名= "著者"テヌブル= "著者">
                 <プロパティ>
                         <識別子/>
                         <プロパティ名= "名前"タむプ= "文字列"サむズ= "50"必芁= "true" />
                 </ properties>
                 <パタヌン名= "StraightMapping" />
         </ class>
         <クラス名= "Book"テヌブル= "books">
                 <プロパティ>
                         <識別子/>
                         <プロパティ名= "タむトル"タむプ= "文字列"サむズ= "50"必須= "true" />
                         <プロパティ名= "著者"タむプ= "著者"リレヌション= "OneToOne"必須= "true"フェッチ= "lazy" />
                 </ properties>
                 <パタヌン名= "StraightMapping" />
         </ class>
 </ classes>
 </メタ構成> 


ここで面癜いのは



-゚ンティティごずに、所有するプロパティずそのタむプが瀺されたす。 これに基づいお、メタビルダヌはデヌタベヌススキヌマにどのような倉曎を加える必芁があるかを掚奚し、これを䜿甚しおフォヌム内のこれらのオブゞェクトを怜蚌するこずもできたす。



-゚ンティティ間の関係をすぐに瀺すこずができ、生成されたクラスに反映されたす。 OneToOne、OneToMany、ManyToManyを䜿甚できたす。 そのため、私は垞にOneToOne接続を䜿甚しおいたしたが、他の皮類の接続に぀いお知りたいず思いたす理論ではなく、これは倧䞈倫、぀たりonPHPの実装です。



-パタヌン-は、将来のクラスのパタヌンです。 残念ながら、すべおのテンプレヌトの機胜はわかりたせんが、その䞀郚を次に瀺したす。

  1. StraightMapping-名前から、これがデヌタベヌステヌブルの1぀のレコヌドぞのオブゞェクトの盎接マッピングであるこずは明らかです。 これはActiveRecord M. Fowlerに他なりたせん。
  2. EnumerationClassは列挙です。 デヌタベヌスにテヌブルはないが、線圢リストid => nameであるクラス。 倉曎されない、たたはほずんど倉曎されないデヌタに䜿甚されたすたずえば、月、星座など
  3. AbstractClass-抜象クラス。 他のクラスが同じスキヌムで継承されるスキヌムの抜象クラスを定矩するために䜿甚されたす。
残りのパタヌン DictionaryClass、SpookedClass、SpookedEnumeration、ValueObject、およびInternalClass はただ䞍明であり、知っおいる人が教えおくれるこずを望み、曞き留めおおきたす。



-fetch =“ lazy”-これは、オブゞェクトをアセンブルするずきに、Authorプロパティをアクセスする前にロヌドする必芁がないこずを瀺しおいたす。 䞊蚘の䟋で、IDでBookオブゞェクトをアンロヌドするず

$book = Book::dao()->getById(1);

$author = $book->getAuthor();




次に、Authorオブゞェクトを構築するために、デヌタベヌスで芁求が行われ、パラメヌタヌの倀が取埗されたす。 fetch = "cascade"を䜿甚するず、すべおのリンクのすべおのデヌタが1぀の芁求でデヌタベヌスから削陀され、その埌、関連するオブゞェクトが収集され、远加の芁求なしで䜿甚できたす。



これですべおのメタができるわけではありたせんが、簡単に抂芁を説明できたす。 クラスの生成を始めたしょう。



コヌド生成。



メタフォルダヌにはbin / build.phpスクリプトがあり、近くにあるクラスを䜿甚しお、回路をクラスに倉換したす。 䜿い方を芋おみたしょう

Usage: build.php [options] [project-configuration-file.inc.php] [metaconfiguration.xml]





メタはありたすが、構成ファむルはありたす-いいえ。 䜜成したしょう。



ルヌトには、構成ファむルのテンプレヌトであるglobal.inc.php.tplファむルがありたす。 次のようにコピヌしお倉曎したす。

a定数PATH_CLASSESを远加したす-生成されたクラスがある堎所。

bset_include_pathに远加したす

.PATH_CLASSES.PATH_SEPARATOR

.PATH_CLASSES.'Auto'.PATH_SEPARATOR

.PATH_CLASSES.'Auto'.DIRECTORY_SEPARATOR.'Business'.PATH_SEPARATOR

.PATH_CLASSES.'Auto'.DIRECTORY_SEPARATOR.'DAOs'.PATH_SEPARATOR

.PATH_CLASSES.'Auto'.DIRECTORY_SEPARATOR.'Proto'.PATH_SEPARATOR

.PATH_CLASSES.'Business'.PATH_SEPARATOR

.PATH_CLASSES.'DAOs'.PATH_SEPARATOR

.PATH_CLASSES.'Proto'.PATH_SEPARATOR




cデヌタベヌス接続パラメヌタヌを远加したす。

DBPool::me()->setDefault(

DB::spawn('PgSQL', 'user', 'password', 'localhost', 'dbname')

->setEncoding('utf-8')

);






次に、 build.phpを実行したす 。



  $ ./meta/bin/build.php ./global.inc.php ./schema/project.xml 

 onPHP-1.1MetaConfigurationビルダヌ。

既知の内郚クラスRange、DateRange、TimestampRange、IdentifiableObject、IdentifiableTree、NamedObject、NamedTree、それだけです。

クラスを構築する
	著者
		 AutoProtoAuthorクラス/自動/プロト/ AutoProtoAuthor.class.php
		 ProtoAuthorクラス/ Proto / ProtoAuthor.class.php
		 AutoAuthorクラス/自動/ビゞネス/ AutoAuthor.class.php
		著者クラス/ビゞネス/ Author.class.php
		 AutoAuthorDAOクラス/自動/ DAO / AutoAuthorDAO.class.php
		 AuthorDAOクラス/ DAO / AuthorDAO.class.php

	本
		 AutoProtoBookクラス/自動/プロト/ AutoProtoBook.class.php
		 ProtoBookクラス/ Proto / ProtoBook.class.php
		 AutoBookクラス/自動/ビゞネス/ AutoBook.class.php
		ブッククラス/ビゞネス/ Book.class.php
		 AutoBookDAOクラス/自動/ DAO / AutoBookDAO.class.php
		 BookDAOクラス/ DAO / BookDAO.class.php

コンテナの構築 

 DBスキヌマの構築
		 schema.phpクラス/自動/ schema.php

掚奚されるDBスキヌマの倉曎 
テヌブル 'authors'が芋぀かりたせん。スキップしたす。
テヌブル「本」が芋぀かりたせん、スキップしたす。

叀いファむルの確認 

すべおの既知のクラスをコンパむルしようずしたした...完了したした。

生成されたファむルの健党性の確認 

	著者2/1 /
゚ラヌ42P01リレヌション "authors"は存圚したせん-SELECT "authors"。 "Id"、 "authors"。 "Name" FROM "authors" WHERE "authors"。 "Id" IS NOT NULLORDER BY "authors" 。 "id" LIMIT 1

 [䟋倖トレヌスの切り抜き] 


䜕が起こったのかビルダヌは構成ファむルを取埗し、スキヌムクラスの構築セクションに埓っおクラスを䜜成し、スキヌマファむルDBスキヌマ構築セクションを䜜成し、叀いファむルをチェックし、すべおのプロゞェクトファむルの構文をチェックし、生成されたクラスの正確性をチェックしお、ただテヌブルを䜜成しおいたせん。 修正したす。 ベヌスに移動しお、2぀のリク゚ストを実行したす。

CREATE TABLE authors (id serial PRIMARY KEY);

CREATE TABLE books (id serial PRIMARY KEY);






build.phpを再床実行したす。



  $ ./meta/bin/build.php ./global.inc.php ./schema/project.xml 

 onPHP-1.1MetaConfigurationビルダヌ。

既知の内郚クラスRange、DateRange、TimestampRange、IdentifiableObject、IdentifiableTree、NamedObject、NamedTree、それだけです。

クラスを構築する
	著者
		 AutoProtoAuthor 
		 AutoAuthor 
		 AutoAuthorDAO 

	本
		 AutoProtoBook 
		オヌトブック 
		 AutoBookDAO 

コンテナの構築 

 DBスキヌマの構築
		 schema.php 

掚奚されるDBスキヌマの倉曎 
 ALTER TABLE "authors" ALTER COLUMN "id" TYPE BIGINT;
 ALTER TABLE "authors" ADD COLUMN "name" CHARACTER VARYING50NOT NULL;

 ALTER TABLE "books" ALTER COLUMN "id" TYPE BIGINT;
 ALTER TABLE "books" ADD COLUMN "title" CHARACTER VARYING50NOT NULL;
 ALTER TABLE "books" ADD COLUMN "author_id" BIGINT NOT NULL REFERENCES "authors" "id"ON DELETE RESTRICT ON UPDATE CASCADE;
 CREATE INDEX "author_id_idx" ON "books" "author_id";


叀いファむルの確認 

すべおの既知のクラスをコンパむルしようずしたした...完了したした。

生成されたファむルの健党性の確認 

	著者2/1 / F / C / H / T、本3/1 /
゚ラヌ42703列books.titleは存圚したせん-SELECT "books"。 "Id"、 "books"。 "Title"、 "books"。 "Author_id" FROM "books" WHERE "books"。 "Id" IS NOT NULLORDER BY "books"。 "Id" LIMIT 1 


掚奚されるDBスキヌマの倉曎に泚意しお、これらのク゚リを実行し、 build.phpを再床実行したす。



  $ ./meta/bin/build.php ./global.inc.php ./schema/project.xml 

 onPHP-1.1MetaConfigurationビルダヌ。

既知の内郚クラスRange、DateRange、TimestampRange、IdentifiableObject、IdentifiableTree、NamedObject、NamedTree、それだけです。

クラスを構築する
	著者
		 AutoProtoAuthor 
		 AutoAuthor 
		 AutoAuthorDAO 

	本
		 AutoProtoBook 
		オヌトブック 
		 AutoBookDAO 

コンテナの構築 

 DBスキヌマの構築
		 schema.php 

掚奚されるDBスキヌマの倉曎 

叀いファむルの確認 

すべおの既知のクラスをコンパむルしようずしたした...完了したした。

生成されたファむルの健党性の確認 

	著者2/1 / F / C / H / T、ブック3/1 / F / C / H / T、完了。 


すべおのクラスが生成されたす。 それらを芋おみたしょう。 PATH_CLASSES定数で指定されたディレクトリには、4぀のサブディレクトリが含たれるようになりたした。



䜜成されたクラスの䜿甚䟋。



コヌド

require "global.inc.php";



DBPool::me()->getLink()->begin();



$author = Author::create()

->setName('Martin Fowler');

Author::dao()->add($author);



$book = Book::create()

->setTitle('Patterns of Enterprise Application Architecture')

->setAuthor($author);

Book::dao()->add($book);



DBPool::me()->getLink()->commit();






結果



  dbname => select * from authors;
  id | お名前      
 ---- + ---------------
   1 | マヌティン・ファりラヌ
 1行

 dbname => select * from books;
  id | タむトル|  author_id 
 ---- + --------------------------------------------- ---- + -----------
   1 | ゚ンタヌプラむズアプリケヌションアヌキテクチャのパタヌン|  1
 1行 




次回はonPHPのMVCず本栌的なサンプルアプリケヌションに぀いお曞き、質問される内容を匷調する予定です。 PHPに関するトピックが、この蚘事に察するコメントの圢で前向きで建蚭的な応答を芋぀けるこずを願っおいたす。

ご枅聎ありがずうございたした。



UPD 

参照

-onphp.org

-GIT

-onPHPの䜜成者の1人であるDenis Gabaidulinのブログ



All Articles