3

core_crudコントローラーで次のようなモジュールを呼び出したとします。

if (!defined('BASEPATH'))
    exit('No direct script access allowed');

class Core_crud extends MX_Controller
{

    function __construct()
    {
        parent::__construct();
        $this->load->model('mdl_core_crud');
    }

    public function index()
    {
        // code goes here
    }

}

そして今、このモジュールを という別のモジュールで拡張したいと思いますshop_crud。このshop_crudモジュールの基本的なコントローラーはどのようになりますか? core_crudつまり、すべてのコントローラーメソッドとすべてのモデルのものも継承したいということです。

4

4 に答える 4

8

モジュールの構造

/modules
    /core_crud
        /controllers
            /core_crud.php
        /models
        /views
    /shop_curd
        /controllers
            /shop_crud.php
        /models
        /views

コードインcore_crud.php

<?php

if (!defined('BASEPATH'))
    exit('No direct script access allowed');

class Core_crud extends MX_Controller
{

    function __construct()
    {
        parent::__construct();
        $this->load->model('mdl_core_crud');
    }

    public function index()
    {
        // code goes here
    }

    public function mymethod($param1 = '', $param2 = '')
    {
        return 'Hello, I am called with paramaters' . $param1 . ' and ' . $param2;
    }

}

コードインshop_crud.php

<?php

if (!defined('BASEPATH'))
    exit('No direct script access allowed');

class Shop_crud extends MX_Controller
{

    public function __construct()
    {
        parent::__construct();
        //$this->load->model('mdl_shop_curd');
    }

    public function testmethod()
    {
        // output directly
        $this->load->controller('core_crud/mymethod', array('hello', 'world'));

        // capture the output in variables
        $myvar = $this->load->controller('core_crud/mymethod', array('hello', 'world'), TRUE);
    }

}

したがって、モジュール/コントローラー全体を拡張する代わりに、必要なメソッドを呼び出すことを好みます。それもシンプルで簡単です。

モジュール名とコントローラー名が異なる場合は、パスを渡す必要があります

module_name/controller_name/mymethod

EXTENDS をサポートするための編集

ファイル構造

ファイル構造

のコードcore_crud.php

if (!defined('BASEPATH'))
    exit('No direct script access allowed');

class Core_crud extends MX_Controller
{

    public function __construct()
    {
        parent::__construct();
        $this->load->model('core_crud/mdl_core_crud');
    }

    public function index()
    {
        return 'index';
    }

    public function check_method($param1 = '')
    {
        return 'I am from controller core_crud. ' . $this->mdl_core_crud->hello_model() . ' Param is ' . $param1;
    }

}

のコードmdl_core_crud.php

if (!defined('BASEPATH'))
    exit('No direct script access allowed');

class mdl_core_crud extends CI_Model
{

    public function hello_model()
    {
        return 'I am from model mdl_core_crud.';
    }

}

のコードshop_crud.php

if (!defined('BASEPATH'))
    exit('No direct script access allowed');

include_once APPPATH . '/modules/core_crud/controllers/core_crud.php';

class Shop_crud extends Core_crud
{

    public function __construct()
    {
        parent::__construct();
    }

    public function index()
    {
        echo parent::check_method('Working.');
    }

}

出力:- 私はコントローラ core_crud から来ました。私はモデル mdl_core_crud から来ました。パラメータは機能しています。

お役に立てれば。ありがとう!!

于 2013-02-28T05:00:26.550 に答える
1

親クラスまたはコンストラクトにモデルをロードする場合は、shop_crud で継承する必要があります。やりたくないclass Shop_crud extends Core_crud {ですか?parent::__construct() はあなたのために構造を保持していませんか?

これは、コントローラーを拡張するのではなく、同じコントローラーへのルーティングで処理できるものですか (コントローラーとモデルの両方を継承したいのは私には奇妙に思えますか、ロジックを処理するクラスのルートとプライベート関数で処理できるものです) )?

于 2013-02-27T19:30:13.483 に答える
1

「コントローラー」この名前は、その機能を定義します。コントローラは、特定のセクションを制御するために使用されます。したがって、MVC フレームワークでは、個々のモジュールに対して個別のコントローラーを作成する方がよいと思います。ただし、モデルを再利用できます。つまり、あるモデルの関数を別のモデルで呼び出すことができます。このため

First load your model like $this->load->model("modelName"); in your controller

Then call the function like $this->modelname->functionName();
于 2013-03-02T12:25:24.707 に答える
0

私が収集できることから、拡張している親コントローラーを要求する必要があります。これは正確には理想的ではありませんが、後でこれを行うためのより良い方法を検討します。今のところ、包含を行うための単純な関数を作成しました。

function extend_module($module) {

$path = realpath(APPPATH) . '/modules/'. $module.'/controllers/'.ucfirst($module).'.php';

require_once($path);

}

使用法:

extend_module('some_module');

class othe_ module extends some_module {

注: 関数は CI オブジェクトの外部で使用できる必要があるため、メインの index.php ファイルのような場所に配置してください。

また、これらの変数はローカル ファイル システムを参照するために使用されるため、ユーザーが生成した入力から直接動的に割り当てないでください。これを行うと、複数のファイル システムの脆弱性が発生します。

プラットフォーム: CI3 + たき火 8 HMVC

于 2015-12-03T16:26:09.967 に答える