簡體   English   中英

OOP PHP Codeigniter控制器層次結構

[英]OOP PHP Codeigniter Controller Hierarchy

我的OOP概念有些問題。 我會盡力解釋。

我有這個課

class Application_controller extends CI_Controller{
     public function addItem(){
        "some code to add the item to the database (working)";
     }
}

我還有另一個類,兩個控制器:

require_once 'application_controller.php';
class Contact extends Application_controller{
     public function __construct(){
         parent::__construct("variables needed");
     }
}

在聯系人的視圖添加中,我添加了以下操作contact / addItem

好的,這就是我對OOP的一般了解。

因為addItem方法擴展了Application_controller,所以它不是應該屬於Contact類的一部分嗎?

我之所以問是因為,當我提交表單時,我什么也沒做,並且當我在Contact類中添加方法addItem覆蓋父類時,它起作用了。

您沒有采取任何措施的原因是codeigniter在Contact類中找不到方法addItem(更新:這可能是由於CodeIgniter路由的工作方式)。 解決方案是使addItem成為Model中的通用方法,該方法將數據存儲在表中,將其移動到Model並將模型加載到控制器中。

創建application / models / writeModel.php

class writeModel extends CI_Model{
  function addItem(){
    // code here
  }
}

在您的控制器中:

    class Contact extends Controller{
       function __controller(){
          parent::Controller();
          $this->load->model('writeModel');
       }

       function somefunction(){
          $this->writeModel->addItem(); // call the method here
       }
    }

參考: CodeIgniter模型

這里的問題(除了OP中的幾個語法錯誤之外)可能是“聯系”無法擴展“ Application_controller”的原因,因為它不知道它的存在。 如果我們設置這樣的測試:

/controllers/Test.php

class Test extends CI_Controller
{
    function __construct()
    {
        parent::__construct();
    }

    function index()
    {
        echo 'test';
    }
}

/controllers/TestTwo.php

require_once("Test.php");

class TestTwo extends Test    
{
    function __construct()
    {
        parent::__construct();
    }
    function index()
    {
        parent::index();
        echo ' and test two';
    }
}

通過導航到appurl / TestTwo /,我們將獲得所需的“ test and test two”輸出。 這是因為TestTwo知道Test。 刪除require(); TestTwo.php中的行將破壞該關系。

從TestTwo中刪除index()函數將導致通過導航到appurl / TestTwo /來僅輸出“ test”。

我在Codeigniter論壇上找到了類似問題的答案。 這樣說

您的ShopDownloads將從Shop控制器繼承(方法,屬性等)。 如視頻教程中所述,您必須從controller類繼承您的類,以便它可以繼承codeigniter為您提供的所有屬性和方法。

Sohaib,

該文章的鏈接為http://codeigniter.com/forums/viewthread/102718/#518120

我不知道怎么回事,但是今天這行得通。 可能是服務器。 只需重新啟動即可。

解決了,只需立即啟動服務器並開始開發LOL。 謝謝你們的時間。

問候,

Elkas

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM