フレームワークを書く

PHP Frameworks

初心者のために、「サイクリスト」または単に好奇心...







この記事は行動を促すものではなく、「どうすればよいか」というトピックに関する小さなスケッチにすぎません。 現時点では、私は自分の部署でZend Frameworkを積極的に使用しています。精通しているので、類似点を恐れないでください。これは広告ではありません。



ルール



私はルールを設定することから始めます:



これらのルールを開発しないと、フレームワークをガベージダンプに変える危険があります。 また、単体テストを作成することを強くお勧めします。時間を大幅に節約できます。



建築



ほとんどの読者が既にMVC( Model-View-Controller )パターンに精通していることを願っています-それで、私たちのフレームワークを他の何かを使ってベースにしましょう。



モデル



典型的なプロジェクトでは、モデルはデータベースの1つのテーブルに関連付けられていますが、十分な例外があるため、このステートメントを公理と見なすべきではありません。 このモデルは、データベース、ファイル、メモリなど、さまざまなデータストレージで簡単に動作するはずです。



モデルがどのように見えるか想像してみましょう:



//ユーザーモデルはストレージとしてDBを使用します

Model_User クラス Framework_Model_Databaseを拡張します

{

$ _table = "users" ;

$ _pkey = "id" ;



関数 getByLogin $ login { /*...*/ }

関数 getByEmail $ email { /*...*/ }

}



// MainConfigモデルはiniファイルをストレージとして使用します

クラス Model_MainConfig Framework_Model_Iniを拡張します

{

protected $ _file = "application.ini" ;



関数 setOption $キー { /*...*/ }

function getOption $ key { /*...*/ }

}



//レジストリモデルはメモリをストレージとして使用します-グローバル変数の代替

クラス Model_Registry Framework_Model_Memoryを拡張します

{

関数 setOption $キー { /*...*/ }

function getOption $ key { /*...*/ }

}



//セッションモデルはセッションファイルをストレージとして使用します

Model_Session クラス Framework_Model_Sessionを拡張します

{

protected $ _namespace = "global" ;



関数 setOption $キー { /*...*/ }

function getOption $ key { /*...*/ }

}




実際、そのような例では、MVCの概念を強く歪めています。これは、モデルが特定のビジネスモデルを意味することが多く、セッションや構成ファイルを意味しないためです。




表示する



現在のテンプレートエンジンの要件は何ですか? 個人的には、ネイティブPHP構文、さまざまな種類のヘルパーとフィルターのサポート。 「2ステップビューパターン」も実装する必要があります。ZFにはZend_ViewZend_Layoutの 2つのコンポーネントがあります



そのような表現の例を挙げます。

<?php if $ this- > books ?>

<!-いくつかの本の表。 ->

<表>

<tr>

<th>著者</ th>

<th>タイトル</ th>

</ tr>

<?php foreach $ this- > $ as = key => $ val ?>

<tr>

<td> <?php echo $ this- > escape $ val [ 'author' ] ?> </ td>

<td> <?php echo $ this- > escape $ val [ 'title' ] ?> </ td>

</ tr>

<?php endforeach ; ?>

</ table>

<?php else ?>

<p>表示する書籍はありません。</ p>

<?php endif ; ?>


レイアウトの使用例(Zend_Layoutのドキュメントから引用):



Layout Example



そうです、Zend Frameworkはプレゼンテーションの実装に成功しています。もちろん、軽微な苦情がないわけではなく、一般的には5つです。




コントローラー



— , — .



: example.com/?controller=users&action=profile&id=16







, — id=16. users profile, id:

//      -    

class Controller_Users extends Framework_Controller_Action

{

    public function actionProfile()

    {

        //    

        $id = $this->request->get('id');

 

        //  

        $user = new Model_User();

        $user -> getById($id);

 

        //    

        $this->view->user = $user;

    }

}




, , .. JSON , ( MVC, ).



Request'a — . — .




Routers



. :



example.com/?controller=users&action=profile&id=16

example.com/users/profile/id/16 // URL'a ZF

example.com/users/profile/16 // CodeIgniter

example.com/profile/16 // ,









/ ZF — — URL', — .



— URL , :

example.com/users/list/page/2/limit/20/filter/active







example.com/users/list/2/20/active







Request, , URL View — Request — , , Request View




Request & Response



Request — :



Response — , :



Response ZF —




Modules



, .. - (, , ..) . MVC , - .



Core



— , , :



  1. Router', Request
  2. Request , //
  3. ( )
  4. Response


, .





«», :





Zend Framewrok' — , , .. Zend'a ( : ZYM)






( ):







, CMS — , .



«» — ...






, , ( document_root public):

project
|-- application
|    |-- configs
|    |-- layouts
|    |-- controllers
|    |-- models
|    |-- views
|    `-- modules
|         `-- <module_name>
|              |-- layouts
|              |-- controllers
|              |-- models
|              `-- views
|-- data
|    |-- cache
|    |-- logs
|    `-- sessions
|-- library
|    `-- Framework
|-- public
|    |-- styles
|    |-- scripts
|    |-- images
|    |-- uploads
|    |-- .htaccess
|    `-- index.php
`-- tests




, — …





To Be Or Not To Be — , — - , . , , — .



RSS http://anton.shevchuk.name/feed/, http://twitter.com/AntonShevchuk



All Articles