32594
RestAPIを使用したアプリケーションをFuelPHPで開発しようとしています。

Restコントローラを継承するcontroller\base.phpを作成し、  
初期処理はここに書こうとしています。

ここでやりたいことは  
beforeメソッド内で、tokenが一致しているかを確認したいです。

```

    <?php
    namespace Controller;
    
    class Base extends \Controller_Rest {
        protected $format = 'json';
    
        /* HTTPステータスコード */
        protected $Unauthorized = 401;
    
        /**
         * 初期処理
         */
        public function before()
        {
            parent::before();
    
            /* Tokenを確認する */
            $token = '';
            if (\Input::method() === 'GET' || \Input::method() === 'POST') {
                $token = \Input::param('token');
            }
            if (! self::is_token_matched($token)) {
                // 不正なアクセス
                return $this->response(
                    [
                        'message' => 'トークンが不正です',
                    ],
                    $this->Unauthorized
                );
            }
        }
    }
    
```

このソースコードでToken不一致の場合を試すと、  
エラーメッセージと401のステータスコードが返されることを期待しているのですが、  
実際は、それが子クラスのAPIが呼ばれてしまいます。  
下記のような実装も試しましたが、期待していた動作になりませんでした。

```

        if (! self::is_token_matched($token)) {
            // 不正なアクセス
            $this->response(
                [
                    'message' => 'トークンが不正です',
                ],
                $this->Unauthorized
            );
            exit;
        }
    
        if (! self::is_token_matched($token)) {
            // 不正なアクセス
            $this->response(
                [
                    'message' => 'トークンが不正です',
                ],
                $this->Unauthorized
            );
            return;
        }
    
```

beforeメソッドでレスポンスを返却するやりかたをご存知の方がいらっしゃいましたら、  
ご教授いただけると幸いです。
CC BY-SA 3.0
2017-01-31T04:26:27.173
32266
2017-02-11T18:40:00.387
2017-02-11T18:09:25.543
7918
7918
question
php fuelphp rest
FuelPHPのRestコントローラでbeforeメソッドでレスポンスを返却したい。
自己解決しましたので、解決策を記述します。  
RESTコントローラーではrouterメソッドがURLに応じてレスポンスの内容を振り分けているため  
共通のエラー処理をbeforeメソッドに書くことは難しいということが分かりました。  
したがって、RESTコントローラーで共通のエラー処理を書く場合は、  
routerメソッドを使用することになります。

```

    <?php
    namespace Controller;
    
    class Base extends \Controller_Rest {
        protected $format = 'json';
    
        /* HTTPステータスコード */
        protected $Unauthorized = 401;
    
        /**
         * ルーティング処理
         * 
         * @param string $method
         * @param string $params
         */
        public function router($method, $params)
        {
            /* Tokenを確認する */
            $token = '';
            if (\Input::method() === 'GET' || \Input::method() === 'POST') {
                $token = \Input::param('token');
            }
            if (! self::is_token_matched($token)) {
                /* 不正なアクセス */
                $this->response(
                    [
                        'message' => 'トークンが不正です',
                    ],
                    $this->Unauthorized
                );
                return;
            }
            parent::router($method, $params);
        }
    }
    
```
CC BY-SA 3.0
2017-02-11T18:15:47.340
32594
2017-02-11T18:40:00.387
2017-02-11T18:40:00.387
7918
7918
32266
answer