views:

230

answers:

2

Hi all, I need to able to access controller methods from a model using the Kohana V2.3 framework. At the moment I'm passing the controller object (by ref.) to the model on creation which works perfectly fine but I can't help think there is a more "cleaner" way - does anybody have any suggestions? Would Kohana V3 resolve this with its HMVC pattern?

This may help: http://www.ifc0nfig.com/accessing-the-calling-controller-in-a-model-within-kohana/

+5  A: 

Why do you need the controller inside the model? This violates the concept of MVC because now the model (data layer) is dependent on the Controller layer.

The functions your model needs in your controller should be offloaded to a generic library. Then accessible from both the controller and model.

Aren
A: 

You're instantiating the Facebook connector in the controller, and you don't want to do that twice so it makes sense that you'd want the model to have access to it. So far so good. There are two ways to do this.

1) Create a library which has a singleton instance that wraps the Facebook instance. That would look like this:

// libraries/FacebookApi.php
class FacebookApi {
  // this stores the singleton FacebookApi
  protected static $instance = null;

  // this is the singleton's Facebook instance
  protected $facebook = null;

  // Return the single FacebookApi wrapper
  public static function instance() {
    if (!isset(FacebookApi::$instance)) {
      self::$instance = new FacebookApi();
    }
    return $instance;
  }

  // Construct a single FacebookApi containing a single Facebook
  protected function __construct() {
    $this->facebook = new Facebook(  
      Kohana::config('mysubs.facebook_apikey'),  
      Kohana::config('mysubs.facebook_secret')  
    );  
  }
}

both your controller and your model would access it like this:

$facebook = FacebookApi::instance()->facebook;
$facebook->require_login(); // etc

Example code from Kohana 2.x: http://dev.kohanaframework.org/projects/kohana2/repository/entry/trunk/system/libraries/Database.php

2) Since you're probably not going to do anything with an actual library other than just access the Facebook class, just create a simple helper that wraps a singleton:

// helpers/facebook_api.php
class facebook_api {
  static $facebook = null;

  static function instance() {
    if (!self::$facebook) {
      self::$facebook = new Facebook(  
        Kohana::config('mysubs.facebook_apikey'),  
        Kohana::config('mysubs.facebook_secret')  
      );
    }
    return self::$facebook;
  }
}

both your controller and your model would access it like this:

$facebook = facebook_api::instance();
$facebook->require_login(); // etc
bharat