phalcon あれやこれや3

2016.01.24 Sunday 15:14
0
    相関チェック
    where書く

    phalconエラー
    error_log($exception->getMessage() . PHP_EOL . $exception->getTraceAsString()); ・



    invoログインページの流れ
    http://localhost/invo/session/star ★これが軸
    public/index SecurityPlugin SessionController ControlerBase
    .php .php .php .php
    [19:57:20][public¥index.php][16][][][] ■try直後 │ │ │
    [19:57:20][public¥index.php][16][][][] ■try直後 │ │ │
    [19:57:20][public¥index.php][39][][][] ■set('session' │ │ │
    [19:57:20][public¥index.php][16][][][] ■try直後 │ │ │
    [19:57:20][public¥index.php][39][][][] ■set('session' │ │ │
    [19:57:20][public¥index.php][112][][][] ■$application │ │ │
    [19:57:20][app¥plugins¥SecurityPlugin.php][109] [SecurityPlugin] [SecurityPlugin::beforeDispatch] [beforeDispatch] │->handle() ■ │ │
    [19:57:20][app¥plugins¥SecurityPlugin.php][29] [SecurityPlugin] [SecurityPlugin::getAcl] [getAcl] │->getContent()■beforeDispatch│ │
    [19:57:20][app¥controllers¥SessionController.php][15] [SessionController] [SessionController::initialize] [initialize] │ │から呼ばれる ■ │
    [19:57:20][app¥controllers¥ControllerBase.php][13] [ControllerBase] [ControllerBase::initialize] [initialize] │ │ │ ■
    [06:34:51][app¥controllers¥SessionController.php][] [SessionController] [SessionController::startAction] [startAction] │ │ ■forward │
    [19:57:20][app¥controllers¥ControllerBase.php][27] [ControllerBase] [ControllerBase::forward] [forward] │ │ │ ('session/index') ■$uriParts = explode('/', $uri);
    [19:57:20][app¥plugins¥SecurityPlugin.php][109] [SecurityPlugin] [SecurityPlugin::beforeDispatch] [beforeDispatch] │ ■ │ │controller/action/paraをセットして
    [19:57:20][app¥plugins¥SecurityPlugin.php][29] [SecurityPlugin] [SecurityPlugin::getAcl] [getAcl] │ ■ │ │forward
    [19:57:20][app¥controllers¥SessionController.php][15] [SessionController] [SessionController::initialize] [initialize] │ │  ■ │
    [19:57:21][app¥controllers¥ControllerBase.php][13] [ControllerBase] [ControllerBase::initialize] [initialize] │ │ │ ■
    [19:57:21][app¥controllers¥SessionController.php][28] [SessionController] [SessionController::indexAction] [indexAction] │ │ ■ │  
    └───────────────┴──────────┴
    *class SessionController extends ControllerBase

    invo ログイン後の Invoicesのページ
    http://localhost/invo/session/start
    [public¥index.php][16][][][] public/index SecurityPlugin SessionController ControllerBase InvoicesController
    [public¥index.php][16][][][] .php .php .php .php .php
    [public¥index.php][39][][][] ■ │ │ │ │
    [public¥index.php][16][][][] ■ │ │ │ │
    [public¥index.php][39][][][] ■ │ │ │ │
    [public¥index.php][105][][][] ■ │ │ │ │
    [public¥index.php][16][][][] ■ │ │ │ │
    [public¥index.php][39][][][] ■ │ │ │ │
    [public¥index.php][105][][][] │ │ │ │ │
    [public¥index.php][118][][][] │ │ │ │ │
    [app¥plugins¥SecurityPlugin.php][110] [SecurityPlugin::beforeDispatch] [beforeDispatch] │ ■ │ │ │
    [app¥plugins¥SecurityPlugin.php][30] [SecurityPlugin::getAcl] [getAcl] │ ■ │ │ │
    [app¥controllers¥SessionController.php][15] [SessionController::initialize] [initialize] │ │ ■ │ │
    [app¥controllers¥ControllerBase.php][13] [ControllerBase::initialize] [initialize] │ │ │ ■ │
    [app¥controllers¥SessionController.php][72] [SessionController::startAction] [startAction] │ │ ■ │ │
    [app¥controllers¥SessionController.php][46] [SessionController::_registerSession] [_registerSession]│ │ ■ │ │
    [app¥controllers¥SessionController.php][52] [SessionController::_registerSession] [_registerSession]│ │  ■ │ │
    [app¥controllers¥SessionController.php][72] [SessionController::startAction] [startAction] │ │ ■ │ │
    [app¥controllers¥SessionController.php][87] [SessionController::startAction] [startAction] │ │ ■ │ │
    [app¥controllers¥ControllerBase.php][27] [ControllerBase::forward] [forward] │ │ │ ■ │
    [app¥plugins¥SecurityPlugin.php][110] [SecurityPlugin::beforeDispatch] [beforeDispatch] │ ■ │ │ │
    [app¥plugins¥SecurityPlugin.php][30] [SecurityPlugin::getAcl] [getAcl] │ ■  │ │ │
    [app¥controllers¥ControllerBase.php][13] [ControllerBase::initialize] [initialize] │ │ │ ■ │
    [app¥controllers¥InvoicesController.php][28][InvoicesController::indexAction] [indexAction] │ │ │ │ ■
    └───────────────┴──────────┴──────┴

    ・毎回 trim作業をやるか
     baseにいれるか ★これが軸
    $fp = fopen('¥a.log', 'a+');
    $log_data .= "¥n[" . date("H:i:s") . "][" . __FILE__ ."][" . __LINE__ . "][" . __CLASS__ . "][" . __METHOD__ . "][" . __FUNCTION__ . "]¥n" ;
    fwrite($fp, $log_data); fclose($fp);

    category:phalcon | by:ittoocomments(0)trackbacks(0) | -

    phalcon あれやこれや2

    2016.01.18 Monday 00:00
    0
      コントローラから もでるつかって sql実行
      TestController.php
      public function test()
      {
      $region = Regions::findFirst(1);
      $prefectures = $region->prefectures;
      }


      PhalconでJOINを使いたい時にはModelのinitialize()内で、hasOne,hasMany,belongsToなどを使います。
      model/Prefectures.php
      public function initialize()
      {
      // 地方を親に持つのでbelongsTo
      $this->belongsTo('region_id', 'Regions', 'id');
      // 子に市区町村を持つのでhasMany
      $this->hasMany('id', 'Towns', 'prefecture_id');
      // 都道府県の詳細は1対1なのでhasOne
      $this->hasOne('id', 'PrefectureDetails', 'prefecture_id');
      }



      Phalconでは、リレーションはモデルのinitialize()メソッドの中で定義する必要があります。
      リレーションを定義するメソッドには4種類あり、
      ★★いずれも「自分自身のフィールド名(≒カラム名)」「参照するモデル名」「参照するフィールド名」の3つのパラメータをとります。
      ------------------------------------
      メソッド 状態
      hasMany 1対多
      hasOne 1対1
      belongsTo 多対1
      hasManyToNany 多対多
      ------------------------------------
      以下のようなテーブルの関係を考えてみます。
      CREATE TABLE `robots` (
      `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
      `name` varchar(70) NOT NULL,
      `type` varchar(32) NOT NULL,
      `year` int(11) NOT NULL,
      PRIMARY KEY (`id`)
      );
      CREATE TABLE `robots_parts` (
      `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
      `robots_id` int(10) NOT NULL,
      `parts_id` int(10) NOT NULL,
      `created_at` DATE NOT NULL,
      PRIMARY KEY (`id`),
      KEY `robots_id` (`robots_id`),
      KEY `parts_id` (`parts_id`)
      );
      CREATE TABLE `parts` (
      `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
      `name` varchar(70) NOT NULL,
      PRIMARY KEY (`id`)
      );
      1つのRobotsは、1つ以上のRobotsPartsをもつ
      1つのPartsは、1つ以上のRobotsPartsをもつ
      1つ以上のRobotsPartsが、Robotsに属する
      1つ以上のRobotsPartsが、Partsに属する
      RobotsとPartsは、RobotsPartsを介して、多対多の関係になっている(RobotsPartsは中間テーブル)
      ER:robots-robots_parts-parts
      それぞれのモデルは以下のように実装できます(Phalcon DevToolsはv1.3.1現在、リレーションの自動生成には対応していません。リレーションの記述は手動で行う必要があります)。
      class Robots extends ¥Phalcon¥Mvc¥Model
      {
      public $id;
      public $name;
      public function initialize()
      {
      $this->hasMany("id", "RobotsParts", "robots_id");
      }
      }
      class Parts extends ¥Phalcon¥Mvc¥Model
      {
      public $id;
      public $name;
      public function initialize()
      {
      $this->hasMany("id", "RobotsParts", "parts_id");
      }
      }
      class RobotsParts extends ¥Phalcon¥Mvc¥Model
      {
      public $id;
      public $robots_id;
      public $parts_id;
      public function initialize()
      {
      $this->belongsTo("robots_id", "Robots", "id");
      $this->belongsTo("parts_id", "Parts", "id");
      }
      }
      リレーション定義メソッドの第1引数には、
      ★★自分自身のフィールド名、第2引数には参照するモデル名、第3引数には参照するモデルのフィールド名を渡します。
      複数のフィールドのリレーションを指定したい場合、配列を使うこともできます。
      3つのモデルからなる多対多の関係を単一のメソッドで記述すると、以下のようになります。
      class Robots extends ¥Phalcon¥Mvc¥Model
      {
      public $id;
      public $name;
      public function initialize()
      {
      $this->hasManyToMany(
      "id",
      "RobotsParts",
      "robots_id", "parts_id",
      "Parts",
      "id"
      );
      }
      }
      リレーションを活用する
      モデルの関係が明示的に定義されると、関連するレコードを簡単に一括取得できます。
      $robot = Robots::findFirst(2);
      foreach ($robot->robotsParts as $robotPart) {
      echo $robotPart->parts->name, "¥n";
      }
      Phalconは、関連するモデルへのデータの保存・取得にマジックメソッド(__set/__get/__call)を用います。
      リレーションと同じ名前のプロパティにアクセスすると、関連するレコードが自動で取得されます。
      $robot = Robots::findFirst();
      $robotsParts = $robot->robotsParts; // RobotsPartsの関連レコード
      getterもマジックメソッドで実装されています(明示的な定義が不要なgetter:マジックゲッター)。
      $robot = Robots::findFirst();
      $robotsParts = $robot->getRobotsParts(); // RobotsPartsの関連レコード
      $robotsParts = $robot->getRobotsParts(array('limit' => 5)); // パラメータを渡す

      ★★Phalcon¥Mvc¥Modelは、「get」が頭についているメソッドの呼び出しがされると、
      findFirst()又はfind()の結果を返します。以下の例では、マジックゲッターを使った場合と使わない場合とを比較しています。
      category:phalcon | by:ittoocomments(0)trackbacks(0) | -

      phalcon あれこれ

      2016.01.12 Tuesday 00:34
      0
        phalcon めも

        Phalcon の DI は 生成されたり Singleton になったり
        その説明の前に一旦 Phalcon の DI の特性について書いておきます.
        Phalcon の DI は shared にしてるかどうかで返ってくるインスタンスが新規か使い回しか変わります.
        つまり
        $di->get('hoge') としてる場合は 毎回異なるインスタンスが返ってきて,
        $di->getShared('hoge') とすると毎回同じインスタンスが返ってきます. ($di->set() 時に shared としてるかどうかにもよるけど)
        そのインスタンスが生成されたか既存のインスタンスを返しているかどうかについては
        $di->getShared() を呼び出した直後に $di->wasFreshInstance() を呼び出すことでわかります.


        ・Singleton
        Singleton パターンを用いると、そのクラスのインスタンスが1つしか生成されないことを保証することができる。 ロケールやLook&Feelなど、絶対にアプリケーション全体で統一しなければならない仕組みの実装に使用される。


        ・phalcon ログ出力方法
        $logger = new ¥Phalcon¥Logger¥Adapter¥File('D:¥xampp¥phalcon-devtools-master¥log¥p.log');
        $logger->log('zzzzzz1');

        $logger = new ¥Phalcon¥Logger¥Adapter¥File('D:¥xampp¥phalcon-devtools-master¥log¥p.log');
        $logger->log("[" . __FILE__ ."][" . __LINE__ . "]");

        ・use で以下を指定すると Logger::ERRORなどつかえる
        use Phalcon¥Logger;
        use Phalcon¥Logger¥Adapter¥File as FileAdapter;
        $logger = new ¥Phalcon¥Logger¥Adapter¥File('¥log¥p.log');
        $logger->log("zzz1", Logger::ERROR);
        $logger->log("zzz2", Logger::DEBUG);
        $logger->log("zzz3", Logger::INFO);
        $logger->log("zzz4", Logger::NOTICE);
        $logger->log("zzz5", Logger::ALERT);
        $logger->log("zzz6", Logger::CRITICAL);


        // These are the different log levels available:
        $logger->critical("This is a critical message");
        $logger->emergency("This is an emergency message");
        $logger->debug("This is a debug message");
        $logger->error("This is an error message");
        $logger->info("This is an info message");
        $logger->notice("This is a notice message");
        $logger->warning("This is a warning message");
        $logger->alert("This is an alert message");

        // You can also use the log() method with a Logger constant:
        $logger->log("This is another error message", Logger::ERROR);

        // If no constant is given, DEBUG is assumed.
        $logger->log("This is a message");
        The log generated is below:


        ・controller内でview指定
        // D:¥xampp¥htdocs¥tutorial¥app¥views¥signup¥index.phtml
        $this->view->setMainView( 'signup/index.phtml' ); // viewを指定する。これがないと ¥views¥index.phtml が存在するとこれを呼ぶ(¥views¥signup¥index.phtmlではなく)



        ・mysql
        database作成
        create database test_db
        use test_db
        mysql -u root -p test_db


        CREATE TABLE `users` (
        `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
        `name` varchar(70) NOT NULL,
        `email` varchar(70) NOT NULL,
        PRIMARY KEY (`id`)
        );


        validate コントローラーでやるんだね いや modelだわ
        d:¥xampp¥htdocs¥invo¥app¥models¥users.php
        https://docs.phalconphp.com/ja/latest/reference/tutorial-invo-2.html

        viewで以下(tag)を指定すると
        tag->form("signup/register"); ?>
        htmlでは以下となる



        エラーメッセージなどをビューで表示する際には Phalcon では flash を使うときがある

        今日は、Phalconのフラッシュメッセージについて調べてみます。

        フラッシュメッセージは、単にユーザに情報を表示するアクションの状態をユーザに通知するために使用されます。メッセージのこれらの種類は、このコンポーネントを使用して生成することができます


        Dispatcher
        アプリケーションがこの動きをどのように実現しているか見ていきましょう。
        最初に知るべきは、Dispatcher コンポーネントです。
        これは、 Routing コンポーネントによって発見されたルートの情報を受け取ります。
        次に、適切なコントローラーを読み込んで、対応するアクションのメソッドを実行します。
        通常、フレームワークはディスパッチャを自動的に作成します。
        今回は、要求されたアクションを実行する前に、認証を行い、ユーザーがアクセスできるか否かチェックする必要があります。
        これを実現するため、ブートストラップの中に関数を用意して、ディスパッチャを置き換えています:


        フレーワークの多くのコンポーネントはイベントを発火するので、
        内部の処理の流れを変更することができます。DIコンポーネントが接着剤として機能し、
        EventsManager がコンポーネントが生み出すイベントをインターセプトし、イベントをリスナーに通知します。


        アクセス制御リスト (ACL)

        PHPフレームワークのPhalconで、RedirectとForwardの違い
        --------------------------------------------------
        // 内部的な処理で、コントローラーだけがフォワードされる。URLは変わらない。
        $this->dispatcher->forward(array('controller' => 'news', 'action' => 'index'));
        // HTTPリダイレクトが行われて、URLも変わる
        $this->response->redirect("news/index");
        --------------------------------------------------

        画面のパラを受ける
        $year = $this->dispatcher->getParam ( 'year' );
        $postTitle = $this->dispatcher->getParam ( 'postTitle' );
        だったり
        $email = $this->request->getPost('email');
        $password = $this->request->getPost('password');


        dispatch はこうやってつかわれたりもする
        public function showAction($year, $postTitle)
        {
        $this->flash->error("You don't have permission to access this area");
        // 別のアクションへ転送する
        $this->dispatcher->forward(array(
        "controller" => "users",
        "action" => "signin"
        ));
        }


        コントローラの初期化
        何らかのアクションがコントローラ上で実行される前に、Phalcon¥Mvc¥Viewコンポーネントは、最初に実行されるinitialize()メソッドを提供しています。__construct “メソッドの使用は推奨されません。
        class PostsController extends ¥Phalcon¥Mvc¥Controller
        {
        public $settings;
        public function initialize()
        {
        $this->settings = array(
        "mySetting" => "value"
        );
        }
        public function saveAction()
        {
        if ($this->settings["mySetting"] == "value") {
        //...
        }
        }
        }



        ・サービスの注入
        $di = new Phalcon¥DI();
        $di->set('storage', function() {
        return new Storage('/some/directory');
        }, true);
        それから、下記のようにいくつかの方法でそのサービスにアクセスすることができます。

        ソースを表示印刷?
        class FilesController extends ¥Phalcon¥Mvc¥Controller
        {
        public function saveAction()
        {
        //Injecting the service by just accessing the property with the same name
        $this->storage->save('/some/file');
        //Accessing the service from the DI
        $this->di->get('storage')->save('/some/file');
        //Another way to access the service using the magic getter
        $this->di->getStorage()->save('/some/file');
        //Another way to access the service using the magic getter
        $this->getDi()->getStorage()->save('/some/file');
        //Using the array-syntax
        $this->di['storage']->save('/some/file'); ★これがわかりやすいかな
        }
        }


        // リクエストがPOSTで作られているかどうかをチェック
        if ($this->request->isPost() == true) {
        // POSTデータにアクセス
        $customerName = $this->request->getPost("name");
        $customerBorn = $this->request->getPost("born");
        }



        セッションデータ
        セッションは、リクエスト間の永続データを維持するのに役立ちます。永続的に必要なデータをカプセル化しますので、あなたはどんなコントローラからでもPhalcon¥Session¥Bagにアクセスすることができます。
        class UserController extends Phalcon¥Mvc¥Controller
        {
        public function indexAction()
        {
        $this->persistent->name = "Michael";
        }
        public function welcomeAction()
        {
        echo "Welcome, ", $this->persistent->name;
        }
        }


        ・phalcon
        flashSession’属性はフラッシュが以前に依存性注入コンテナにセットした方法です。あなたは、セッションを成功裏にflashSessionメッセンジャーを使用するために最初に起動する必要があります。
        フラッシャーには、DirectとSessionの2つのアダプタがある
        Directは直接渡されたメッセージを出力する
        Sessionは、一時的にセッション内にメッセージを保存する


        // 別のアクションへ転送する
        $this->dispatcher->forward(array(
        "controller" => "users",
        "action" => "signin"
        ));



        サービスの注入
        コントローラがPhalcon¥Mvc¥Controller拡張する場合、それはアプリケーション内のサービスコンテナへの容易なアクセスを持っています。例として、下記のようなサービスを登録している場合があります。
        $di = new Phalcon¥DI();
        $di->set('storage', function() {
        return new Storage('/some/directory');
        }, true);

        それから、下記のようにいくつかの方法でそのサービスにアクセスすることができます。
        class FilesController extends ¥Phalcon¥Mvc¥Controller
        {
        public function saveAction()
        {
        $this->storage->save('/some/file'); //Injecting the service by just accessing the property with the same name
        $this->di->get('storage')->save('/some/file'); //Accessing the service from the DI
        $this->di->getStorage()->save('/some/file'); //Another way to access the service using the magic getter
        $this->getDi()->getStorage()->save('/some/file'); //Another way to access the service using the magic getter
        $this->di['storage']->save('/some/file'); //Using the array-syntax ★これがわかりやすいかな
        }
        }
        フルスタックフレームワークとしてPhalconを使用している場合は、あなたはフレームワークのデフォルトで
        提供されるサービスを読み込むことができます。



        リクエストとレスポンス
        フレームワークは、予め登録されたサービスのセットを提供するものと見なします。
        私たちは、HTTP環境と対話する方法について説明します。「リクエスト」サービスには、
        Phalcon¥Http¥Requestコンポーネントのインスタンスが含まれいて、「response」には、
        クライアントに返信するために何が起こっているかを表すPhalcon¥Http¥Responseコンポーネントが含まれています。
        class PostsController extends Phalcon¥Mvc¥Controller
        {
        public function saveAction()
        {
        // リクエストがPOSTで作られているかどうかをチェック
        if ($this->request->isPost() == true) {
        // POSTデータにアクセス
        $customerName = $this->request->getPost("name");
        $customerBorn = $this->request->getPost("born");
        }
        }
        }



        セッションデータ
        セッションは、リクエスト間の永続データを維持するのに役立ちます。
        永続的に必要なデータをカプセル化しますので、あなたはどんなコントローラからでも
        Phalcon¥Session¥Bagにアクセスすることができます。
        class UserController extends Phalcon¥Mvc¥Controller
        {
        public function indexAction()
        {
        $this->persistent->name = "Michael";
        }
        public function welcomeAction()
        {
        echo "Welcome, ", $this->persistent->name;
        }
        }



        http://localhost/blog/posts/show/2012/the-post-title/
        ※GETクエリには、パラメータの値だけで、変数名は不要。
        以下のようにActionメソッド関数に引数を設定することで、取得できる。
        URLに設定されているパラメータ値と、メソッドの引数は順序的1対1の関係にある。
        class PostsController extends ¥Phalcon¥Mvc¥Controller
        {
        public function showAction($year, $postTitle)
        {
        /*
        $year に 2012
        $postTitle に the-post-title
        がアサインされる


        もし、URL形式を以下のようにしたい場合は、
        http://localhost/blog/posts/show/?year=2012&title=the-post-title
        以下のようにパラメータ値を取得できる。
        public function showAction()
        {
        $year = $this->request->getQuery('year');
        $title = $this->request->getQuery('title');
        }


        GET以外のPOSTなども上記と同じような理屈で対応できる。
        リクエストに関するクラスは、 Phalcon¥Http¥Request



        レスポンス
        レスポンスに関するクラスは、 Phalcon¥Http¥Response

        フォワード
        $this->dispatcher->forward(array(
        "controller" => "users",
        "action" => "signin"
        ));



        登録サービスへのアクセス
        Phalcon¥Mvc¥Controllerを継承したコントローラーであれば、以下のようにしてDIにアクセスできます。
        $this->di;
        or
        $this->getDI();



        セッションデータ
        セッションに関するクラスは、 Phalcon¥Session¥Bag
        以下のようにして、値のセット、取得ができます。
        class UserController extends Phalcon¥Mvc¥Controller
        {
        public function indexAction()
        {
        $this->persistent->name = "Michael";
        }
        public function welcomeAction()
        {
        echo "Welcome, ", $this->persistent->name;
        }


        ・validation
        controllers/UserController.php
        require __DIR__ . '/../interfaces/request/validation/UserValidation.php';
        require __DIR__ . '/../interfaces/response/UserResponse.php';
        class UserController extends ControllerBase {
        public function getUser() {
        $req = $this->input();

        //バリデーション処理
        $uv = new UserValidation();
        $valid = $uv->getUserValidation($req);

        if ($valid->count()) {
        //Error
        $msg = $valid[0]->getMessage();
        $this->output(400, UserResponse::errorResponse(400, $msg));
        return;
        }



        コントローラーでは、基本的に全て共通して、

        リクエストを取得

        バリデーションチェック

        エラーの場合は、エラーレスポンスを返す

        エラーがない場合は、DB操作を何かする

        レスポンスデータを作成し、JSONを返す
        といった感じですかね。

        バリデーションチェックでは、
        nullチェックや、型チェック、値チェック、長さチェックなど
        基本的なことをやります。

        また、リクエストフィールドに対するバリデーションチェックは、
        APIの種類に関係なく、基本は同じはずだと思います。
        (nullがOKの有無はAPIの種類によって異なる場合はあるかと思います。)

        なので、APIで扱う全てのリクエストフィールド情報は、
        interfaces/request/fields/CommonFields.php
        に記述するようにしました。

        内容としては、
        フィールド名、フィールドに対して使用するバリデーションインスタンス
        となります。

        サンプルソース
        interfaces/request/fields/CommonFields.php


        use Phalcon¥Validation¥Validator¥PresenceOf,
        Phalcon¥Validation¥Validator¥InclusionIn,
        Phalcon¥Validation¥Validator¥Email,
        Phalcon¥Validation¥Validator¥Between,
        Phalcon¥Validation¥Validator¥StringLength;

        class CommonFields {

        //Request Fields
        protected $_fields;

        public function __construct() {
        $this->_fields = array(
        'sex' => array(
        'default' => array(
        new PresenceOf(array(
        'cancelOnFail' => TRUE,
        )),
        new InclusionIn(array(
        'domain' => array('male', 'female'),
        'cancelOnFail' => TRUE
        )),
        ),
        'custom' => array(
        new Type(array(
        'type' => 'string'
        )),
        ),
        ),
        'birthday' => array(
        'default' => array(
        new PresenceOf(array(
        'cancelOnFail' => TRUE,
        )),
        ),
        'custom' => array(
        new Type(array(
        'type' => 'integer'
        )),
        new Date(array(
        'format' => 'Ymd'
        )),
        ),
        ),
        〜省略〜
        );
        }

        public function getFields() {
        return $this->_fields;
        }

        }
        バリデーションの部分が
        defaultとcustomに分かれているのは、
        Phalconで用意されているバリデーションクラスと、
        自前で用意したバリデーションクラスを区別するためです。

        上記のクラスでは、APIの全てで扱うフィールドを設定したので、
        interfaces/request/fields/UserFields.php
        では、各APIで扱うフィールドを記述するようにしました。

        サンプルソース
        interfaces/request/fields/UserFields.php

        namespace Interfaces¥Request¥Fields {

        class UserFields {
        static public function getUserFields() {
        return array(
        array('sex', TRUE),
        array('birthday', TRUE),
        〜省略〜
        );
        }
        }
        }
        TRUEの部分は、NOT NULLのフラグとしています。
        ここをFALSEにすると、バリデーションチェックで、
        nullチェックは行わないようにします。

        バリデーションチェックして、OKだったら、
        何かDB操作して、レスポンスを返さなければいけません。

        リクエストと同様にして、
        各APIごとにレスポンスのフィールドも設定するようにします。

        サンプルソース
        interfaces/response/fields/UserFields.php


        namespace Interfaces¥Response¥Fields {

        class UserFields {
        static public function getUserFields() {
        return array(
        'sex',
        'birthday',
        );
        }
        }
        }
        DBから得られた結果から、上記で設定したフィールドをもとに
        必要なものだけを取得して、レスポンスを作成し、クライアントに返します。

        ここまで、ソースを抜粋しながら、簡単な説明を記載してきました。
        DB操作以外の部分は、
        API実装前に存在している仕様書から全て設定できる範囲なので、
        実装の半分くらい?は簡単にできるのではないかなと感じてます。





        __NAMESPACE__


        ・validation
        https://docs.phalconphp.com/ja/latest/reference/validation.html

        phalcon validate email
        use Phalcon¥Validation¥Validator¥Email as Email

        use Phalcon¥Mvc¥Model¥Validator¥Email as EmailValidator;

        class Subscriptors extends ¥Phalcon¥Mvc¥Model
        {
        public function validation()
        {
        $this->validate(new EmailValidator(array(
        'field' => 'electronic_mail'
        )));
        if ($this->validationHasFailed() == true) {
        return false;
        }
        }




        イベントマネージャ
        イベントマネージャのカスタマイズ

        モデルのイベントコンポーネントは、Phalcon¥Events¥Managerと統合されています。そのため、イベントが実行される際のリスナーを作ることもできます。


        use Phalcon¥Mvc¥Model,
        Phalcon¥Events¥Manager as EventsManager;

        class Robots extends Model
        {

        public function initialize()
        {

        $eventsManager = new EventsManager();

        // "model"イベントに無名関数を登録する
        $eventsManager->attach('model', function($event, $robot) {
        if ($event->getType() === 'beforeSave') {
        if ($robot->name === 'Scooby Doo') {
        echo "Scooby Dooはロボットではありません!";
        return false;
        }
        }
        return true;
        });

        // イベントマネージャをイベントに登録
        $this->setEventsManager($eventsManager);
        }

        }
        上記サンプルコードでは、イベントマネージャはオブジェクトとリスナーの橋渡しを行います。イベントは、Robotsモデルのsave時に発火します。


        $robot = new Robots();
        $robot->name = 'Scooby Doo';
        $robot->year = 1969;
        $robot->save();
        全てのオブジェクトに共通のEventsManagerを実装したい場合、EventsManagerをModelsManagerに登録します。


        // modelsManagerサービスをDIコンテナに登録
        $di->setShared('modelsManager', function() {

        $eventsManager = new ¥Phalcon¥Events¥Manager();

        // "model"イベントのリスナーとして無名関数を登録する
        $eventsManager->attach('model', function($event, $model){

        // Robotsモデルに寄って生成されるイベントをキャッチする
        if (get_class($model) == 'Robots') {

        if ($event->getType() == 'beforeSave') {
        if ($model->name == 'Scooby Doo') {
        echo "Scooby Dooはロボットではありません!";
        return false;
        }
        }

        }
        return true;
        });

        // EventsManagerを登録する
        $modelsManager = new ModelsManager();
        $modelsManager->setEventsManager($eventsManager);
        return $modelsManager;
        });
        リスナーがfalseを返すと、その処理の実行は中断されます。







        データの完全性バリデーション

        Phalcon¥Mvc¥Modelは、データをバリデーションし、ビジネスルールを実装するためのイベントを提供しています。「validation」イベントによって、組み込みのバリデーターを呼び出すことができます。Phalconは、いくつかの組み込みバリデーターを提供しています。
        use Phalcon¥Mvc¥Model¥Validator¥InclusionIn,
        Phalcon¥Mvc¥Model¥Validator¥Uniqueness;

        class Robots extends ¥Phalcon¥Mvc¥Model
        {

        public function validation()
        {

        $this->validate(new InclusionIn(
        array(
        "field" => "type",
        "domain" => array("Mechanical", "Virtual")
        )
        ));

        $this->validate(new Uniqueness(
        array(
        "field" => "name",
        "message" => "ロボットの名前が重複してはいけません"
        )
        ));

        return $this->validationHasFailed() != true;
        }

        }
        上記コード例では、組み込みの「InclusionIn」バリデーターを使用しています。このバリデーターは、「type」フィールドの値がdomainのリストに含まれているかチェックしています。値が含まれていなかった場合は、バリデーションに失敗し、バリデーターはfalseを返します。

        組み込みのバリデーターの一覧は以下です。

        名前 説明 実装例
        PresenceOf フィールドの値がnullではなく、空文字列でもないことをバリデーションする。NOT NULL制約が設定されているフィールドに対しては、このバリデーターが自動的に追加される。 例
        Email フィールドの値が有効なEメールアドレスであるかバリデーションする 例
        ExclusionIn フィールドの値が禁止リストに含まれないことをバリデーションする 例
        InclusionIn フィールドの値が許可リストに含まれることをバリデーションする 例
        Numericality フィールドの値が数値形式かバリデーションする 例
        Regex フィールドの値が正規表現にマッチするかバリデーションする 例
        Uniqueness フィールドの値が既存のレコードと重複しないかバリデーションする 例
        StringLength 文字列の長さをバリデーションする 例
        Url フィールドの値が有効なURLの形式化バリデーションする 例
        組み込みのバリデーターに加えて、独自のバリデーターを作成することもできます。


        use Phalcon¥Mvc¥Model¥Validator,
        Phalcon¥Mvc¥Model¥ValidatorInterface;

        class MaxMinValidator extends Validator implements ValidatorInterface
        {

        public function validate($model)
        {
        $field = $this->getOption('field');

        $min = $this->getOption('min');
        $max = $this->getOption('max');

        $value = $model->$field;

        if ($min <= $value && $value <= $max) {
        $this->appendMessage(
        "フィールドの値が有効範囲外です",
        $field,
        "MaxMinValidator"
        );
        return false;
        }
        return true;
        }

        }
        バリデーターをモデルに追加するには、以下のようにします。
        class Customers extends ¥Phalcon¥Mvc¥Model
        {

        public function validation()
        {
        $this->validate(new MaxMinValidator(
        array(
        "field" => "price",
        "min" => 10,
        "max" => 100
        )
        ));
        if ($this->validationHasFailed() == true) {
        return false;
        }
        }

        }
        バリデーターを作成することで、バリデーションのロジックを複数のモデルで使い回すことができます。1箇所でしか使わないバリデーションであれば、以下のようにシンプルに実装することもできます。

        use Phalcon¥Mvc¥Model,
        Phalcon¥Mvc¥Model¥Message;

        class Robots extends Model
        {

        public function validation()
        {
        if ($this->type === "Old") {
        $message = new Message(
        "Sorry, old robots are not allowed anymore",
        "type",
        "MyType"
        );
        $this->appendMessage($message);
        return false;
        }
        return true;
        }

        }





        SQLインジェクションを避ける

        モデルのプロパティに代入された値は全て、そのデータ型に応じたエスケープが施されます。開発者が、DBに入れる値のエスケープを実装する必要はありません。Phalconは内部でPDOのバインド機構を使用して、自動エスケープを行っています。

        mysql> desc products;
        +------------------+------------------+------+-----+---------+----------------+
        | Field | Type | Null | Key | Default | Extra |
        +------------------+------------------+------+-----+---------+----------------+
        | id | int(10) unsigned | NO | PRI | NULL | auto_increment |
        | product_types_id | int(10) unsigned | NO | MUL | NULL | |
        | name | varchar(70) | NO | | NULL | |
        | price | decimal(16,2) | NO | | NULL | |
        | active | char(1) | YES | | NULL | |
        +------------------+------------------+------+-----+---------+----------------+
        上記テーブルへのINSERTをする際、PDOを使用すると、以下のようなコードになります。


        $productTypesId = 1;
        $name = 'Artichoke';
        $price = 10.5;
        $active = 'Y';

        $sql = 'INSERT INTO products VALUES (null, :productTypesId, :name, :price, :active)';
        $sth = $dbh->prepare($sql);

        $sth->bindParam(':productTypesId', $productTypesId, PDO::PARAM_INT);
        $sth->bindParam(':name', $name, PDO::PARAM_STR, 70);
        $sth->bindParam(':price', doubleval($price));
        $sth->bindParam(':active', $active, PDO::PARAM_STR, 1);

        $sth->execute();
        Phalconのモデルを使用すると、以下のように書けます(エスケープは全て自動で行われます)。


        $product = new Products();
        $product->product_types_id = 1;
        $product->name = 'Artichoke';
        $product->price = 10.5;
        $product->active = 'Y';
        $product->create();
        カラムをスキップする


        category:phalcon | by:ittoocomments(0)trackbacks(0) | -

        phalcon ログ出力方法

        2016.01.09 Saturday 21:07
        0
          php phalcon

          ・phalcon ログ出力方法
          $logger = new ¥Phalcon¥Logger¥Adapter¥File('¥log¥p.log');
          $logger->log('zzzzzz1');

          ・use で以下を指定すると Logger::ERRORなどつかえる
          use Phalcon¥Logger;
          use Phalcon¥Logger¥Adapter¥File as FileAdapter;
          $logger = new ¥Phalcon¥Logger¥Adapter¥File('¥log¥p.log');
          $logger->log("zzz1", Logger::ERROR);
          $logger->log("zzz2", Logger::DEBUG);
          $logger->log("zzz3", Logger::INFO);
          $logger->log("zzz4", Logger::NOTICE);
          $logger->log("zzz5", Logger::ALERT);
          $logger->log("zzz6", Logger::CRITICAL);

          category:phalcon | by:ittoocomments(0)trackbacks(0) | -

          php phalcon あれやこれや

          2016.01.03 Sunday 23:25
          0
            □2 php phalcon 13:58 〜
            https://vimeo.com/63022489

            PhalconDevToolはアプリケーションのひな形などを作成するための開発補助ツールです
            http://www.monodonproject.info/?p=1112
            http://www.monodonproject.info/?p=1170
            http://wp.tech-style.info/archives/627
            https://docs.phalconphp.com/en/latest/reference/nginx.html
            https://github.com/phalcon/phalcon-devtools
            https://thinkit.co.jp/story/2014/07/09/5084?page=0%2C1 Phalcon Devtoolsを使ったMVCプロジェクト作成からHelloWorldまで
            https://thinkit.co.jp/story/2014/05/30/4906?page=0%2C1 Phalconを使う前に知っておきたい、各機能とインストール方法
            64cef4a849a19a479174abf05d3d833e3dd1884d

            D:¥xampp¥phalcon-devtools-master
            Phalcon Devtoolsはプロジェクトの雛形や
            コントローラー・データーベースのテーブルからのモデル生成
            スカッフォールド
            DB構造のマイグレーション
            などを行ってくれる便利なコマンドラインツールです


            ------------------------------
            scaffold
            CakePHPにおけるscaffoldとは何ぞやというと、
            コントローラーとモデルさえ作っとけば勝手にデータの生成や編集、
            削除のフォームを良い感じに作ってくれるということらしいです。

            スキャフォールド(scaffold)とは、MVCフレームワーク上で基本的なCRUD(Create, Read, Update, Delete)操作を行う枠組み(足場)を自動で一括生成する機能です。
            FuelPHPでは、「oil g scaffold」のコマンドを実行することで、モデル、ビュー、コントローラ、マイグレーションの各ファイルが一括で作成されます。
            例として、以下のようなURLで、投稿、編集、削除ができるページを、スキャフォールドで作成します
            ------------------------------

            ------------------------------
            https://getcomposer.org/
            composer.json
            Dependency Manager for PHP
            PHPでライブラリの依存管理をするツール「Composer」
            http://9ensan.com/blog/programming/php/php-composer-dependency-management/

            ------------------------------


            ------------------------------
            C:¥Users¥kazumi¥Documents¥NetBeansProjects
            >phalcon create-project HelloWorld --enable-webtools

            Phalcon DevTools (1.3.2 ALPHA 1)
            Success: Controller "index" was successfully created.
            Success: Project 'HelloWorld' was successfully created.

            ------------------------------
            https://thinkit.co.jp/story/2014/07/09/5084?page=0%2C1

            D:¥xampp¥phalcon-devtools-master>phalcon create-project HelloWorld --enable-webtools
            Phalcon DevTools (2.0.9)
            Success: Controller "index" was successfully created.
            D:¥xampp¥phalcon-devtools-master¥HelloWorld¥app¥controllers¥IndexController.php
            Success: Project "HelloWorld" was successfully created.
            D:¥xampp¥phalcon-devtools-master>

            ・htrouter.php 作成と修正

            ・php -S localhost:8000 -t public .htrouter.php
            ・ブラウザで確認
            http://localhost:8000/
            http://localhost:8000/webtools.php
            ------------------------------
            category:phalcon | by:ittoocomments(0)trackbacks(0) | -

            ad
            Calender
             123456
            78910111213
            14151617181920
            21222324252627
            28293031   
            << May 2017 >>
            Selected entry
            PR
            Category
            Archives
            Recent comment
            • Ready Boost測定usb2個使用して測定した
              TwoFactor Authentication
            • マクドナルドでYahoo BBモバイルポイント 公衆無線LANサービスがつながらない
              66hills
            • マクドナルドでYahoo BBモバイルポイント 公衆無線LANサービスがつながらない
              ssd
            • マクドナルドでYahoo BBモバイルポイント 公衆無線LANサービスがつながらない
              max
            • マクドナルドでYahoo BBモバイルポイント 公衆無線LANサービスがつながらない
              DOM
            • マクドナルドでYahoo BBモバイルポイント 公衆無線LANサービスがつながらない
              DOM
            • コンピュータ業界の根本的な変化
              cloud
            • コンピュータ業界の根本的な変化
              Dellの仮想化
            • マクドナルドでYahoo BBモバイルポイント 公衆無線LANサービスがつながらない
              えちごや
            • マクドナルドでYahoo BBモバイルポイント 公衆無線LANサービスがつながらない
              touch
            Recent trackback
            • スマートフォンの法人活用例
              無線LANネットのブログ
            • Yahoo!オークションからのアフィリエイト収入が一気に70%減になってしまい涙目になってる話
              特選情報
            Recommend
            Link
            Profile
            Search
            Others
            Mobile
            qrcode
            Powered
            無料ブログ作成サービス JUGEM