Доступ к методам контроллера внутри модели с помощью Kohana / MVC Framework - PullRequest
1 голос
/ 09 июня 2010

I необходимо , чтобы иметь возможность доступа к методам контроллера из модели с использованием инфраструктуры Kohana V2.3.В данный момент я передаю объект контроллера (по ссылке) модели при создании, которая прекрасно работает, но я не могу не думать, что есть более «чистый» способ - у кого-нибудь есть какие-либо предложения?Может ли Kohana V3 решить эту проблему с помощью шаблона HMVC?

Это может помочь: http://www.ifc0nfig.com/accessing-the-calling-controller-in-a-model-within-kohana/

Ответы [ 2 ]

7 голосов
/ 09 июня 2010

Зачем вам нужен контроллер внутри модели? Это нарушает концепцию MVC, поскольку теперь модель (уровень данных) зависит от уровня контроллера.

Функции, необходимые вашей модели в вашем контроллере, должны быть выгружены в общую библиотеку. Затем доступны как из контроллера, так и из модели.

1 голос
/ 20 июня 2010

Вы создаете экземпляр коннектора Facebook в контроллере и не хотите делать это дважды, поэтому имеет смысл, что вы хотите, чтобы модель имела к нему доступ. Все идет нормально. Есть два способа сделать это.

1) Создайте библиотеку, в которой есть экземпляр-одиночка, обертывающий экземпляр Facebook. Это будет выглядеть так:

// 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')  
    );  
  }
}

и ваш контроллер, и ваша модель получат к нему доступ так:

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

Пример кода из Kohana 2.x: http://dev.kohanaframework.org/projects/kohana2/repository/entry/trunk/system/libraries/Database.php

2) Поскольку вы, вероятно, не собираетесь ничего делать с реальной библиотекой, кроме как просто получить доступ к классу Facebook, просто создайте простой помощник, который обертывает одиночный код:

// 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;
  }
}

и ваш контроллер, и ваша модель получат к нему доступ следующим образом:

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