【问题标题】:Accessing controller methods inside a model with Kohana/MVC Framework使用 Kohana/MVC 框架访问模型内​​的控制器方法
【发布时间】:2010-06-08 22:01:34
【问题描述】:

需要能够从使用 Kohana V2.3 框架的模型访问控制器方法。目前我将控制器对象(通过参考)传递给创建模型,它工作得非常好,但我不禁想到有一种更“更干净”的方式——有人有什么建议吗? Kohana V3 会通过其 HMVC 模式解决这个问题吗?

这可能会有所帮助:http://www.ifc0nfig.com/accessing-the-calling-controller-in-a-model-within-kohana/

【问题讨论】:

    标签: php model-view-controller frameworks kohana


    【解决方案1】:

    为什么需要模型内部的控制器?这违反了 MVC 的概念,因为现在模型(数据层)依赖于 Controller 层。

    你的模型在你的控制器中需要的函数应该被卸载到一个通用库中。然后可从控制器和模型访问。

    【讨论】:

      【解决方案2】:

      您正在控制器中实例化 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
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-10-22
        • 1970-01-01
        • 2013-02-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-03-29
        • 2011-11-17
        相关资源
        最近更新 更多