フレームワークを書く

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

Source: https://habr.com/ru/post/J68093/


All Articles