0

自分のモジュールを最新の Kohana (3.3) で動作するようにアップグレードしているときに、シナリオに誤動作が見つかりました。アプリでテンプレート駆動型スキーマを使用しています (私のコントローラーは Controller_Theme を拡張します)。しかし、AJAX 呼び出しの場合、バージョン 3.2 で使用した別の Controller は、単に Controller を拡張します。Rquest オブジェクトで POST または GET を介して渡された変数にアクセスするには、このコントローラーで Request オブジェクトをインスタンス化する必要がありました。私は __construct() メソッドでそれを行いました:

class Controller_Ajax extends Controller {

    public function __construct()
    {       
        $this->request = Request::current();    
    }

    public function action_myaction()
    {
        if($this->is_ajax())
        {
            $url = $this->request->post('url');
            $text = $this->request->post('text');
        }   
    }
}

myaction() メソッドでは、このように投稿された変数にアクセスできます。しかし、これは Kohana 3.3 では機能しなくなりました。私はいつもこのエラーを受け取ります:

ErrorException [ Fatal Error ]: Call to a member function action() on a non-object
SYSPATH/classes/Kohana/Controller.php [ 73 ]
68  {
69      // Execute the "before action" method
70      $this->before();
71      
72      // Determine the action to use
73      $action = 'action_'.$this->request->action();
74 
75      // If the action doesn't exist, it's a 404
76      if ( ! method_exists($this, $action))
77      {
78          throw HTTP_Exception::factory(404,

ルートが正しく設定されていると確信しています。Request オブジェクトに関して、3.2 から 3.3 への移行ドキュメントに変更はありませんでした。それとも私は何かを逃しましたか?

4

1 に答える 1

0

要求と応答の両方がデフォルトでControllerクラスで初期化されるため(以下のコードを参照)、そのコンストラクターをオーバーライドする必要はありません。コンストラクターを削除してみてください。それでも問題が解決しない場合は、ルーティングが混乱しています。

abstract class Kohana_Controller {

    /**
     * @var  Request  Request that created the controller
     */
    public $request;

    /**
     * @var  Response The response that will be returned from controller
     */
    public $response;

    /**
     * Creates a new controller instance. Each controller must be constructed
     * with the request object that created it.
     *
     * @param   Request   $request  Request that created the controller
     * @param   Response  $response The request's response
     * @return  void
     */
    public function __construct(Request $request, Response $response)
    {
        // Assign the request to the controller
        $this->request = $request;

        // Assign a response to the controller
        $this->response = $response;
    }
于 2012-12-11T09:00:02.670 に答える