Codeigniter PHP arayüzleri kullanarak

5 Cevap php

Benim MVC tasarım PHP arayüzleri kullanılabilir öğrenmek için çalışıyorum. Ben herhangi bir yeni modül takip ediyorum böylece tasarım bir arabirim zorlar emin olmak istiyorum.

Örneğin:

<?php

interface BaseAPI {
     public function postMessage($msg);
}

class ServiceAPI implements BaseAPI {
     public function postMessage($msg) { return $msg; }
}

class Service_Two_API implements BaseAPI {
     public function postMessage($msg) { return "can't do this: ".$msg; }
}

?>

Ben CI bunu yapmak istiyorum. Bu mümkün mü? onu nasıl dizayn etmeliyim?

5 Cevap

Eğer sorduğun buysa bağlıdır. Eğer Kod Ateşleyici çerçeve sizin arabirimleri, acaba takip yapabilir, ama onların çerçevesinde üstlenmeden bir sürü gerektirir ve muhtemelen iş değer olmaz eğer soruyorsanız.

Tabii ki yapabilirsiniz, Kod Igniter kullanırken size özel sınıflar için arabirimler ekleyebilirsiniz eğer soruyorsanız. CI aslında o orada ne var, özel kod oluşturmak için yeteneği sınırı yok. Ben gerçek cevabı "Tam olarak ne istiyorsun?" Sanırım.

Ben CodeIgniter projede arayüzlerini kullanarak ediyorum. Ben sadece bunu:

Bazı sınıflar kişisel Denetleyicisi uzanır gerekiyor, bu yüzden Module_Controller denilen Librarie Kontrol uzanır oluşturduk. Bu kütüphane, özdevinimli edilir.

Aynı dosyada, arayüz ilan edilmiştir. Yani, benim dosya kitaplıkları / Module_Controller.php aşağıdaki kodu vardır:

class Module_Controller extends Controller{
...
}

interface modular{
...
}

Bu dosya yüklenemiyor bu sayede, arayüz herkes için ilan edilecektir.

Sizin Arayüz harika çalışıyor ... Sadece kontrolör içinde bunun yeni bir örneğini bildirmek sonra onu kullanacak denetleyicisi yukarıda da Require_once ...

Controller File:

require_once( "Models/ServiceApi" );

class HomeController extends Controller
{
    private $repository;

    public function __Construct()
    {
        $this->repository = new ServiceApi();
    }

    ...
}

Dürüst olmak gerekirse, muhtemelen bağımlılık enjeksiyon çeşit yapabilmek isterdim, ama ben CodeIgniter'ı kullanmayın düşünüyor, ben derslere arayüzüne bağımlı aramalar için bir Fabrika simüle etmek ne kadar kolay emin değilim.

Bana olsa Size bir örnek vereyim:

Dependancy Injection:

Factory File

// Not sure how this works for code ignite but the idea is like this:

//$repositoryForController = new ServiceAPI();
$repositoryForController = new Service_Two_API();

$controller = new HomeController( $repositoryForController );

Controller File:

require_once( "Models/ServiceApi" );

class HomeController extends Controller
{
    private $repository;

    public function __Construct( BaseAPI $repo )
    {
        $this->repository = $repo;
    }

    ...
}
  • Genel yüzden. Sizin arayüzü ve servis API'LARI ince
  • Senin mimarisi, sıkı birleştiğinde çıkıp bir Controller'daki modelinin yeni bir örneğini ilan rağmen tamamen kötü haber değil.
  • Controller dosyanızda içine dosyayı almak için, sadece denetleyici üzerinde o kadar Require_once.

Oluşturduğunuz MY_Loader class CI_Loader içine uygulama / çekirdek uzanır ve arayüzler yükleyebilirsiniz yapabilirsiniz.

İşte bir örnek vardır: http://heatherevens.me.uk/2013/11/11/interfaces-in-codeigniter/

Here's How to Get CodeIgniter to Load Interfaces Properly

In your application/config/autoload.php:

// Add "interface_autoloader" to your models array
$autoload['model'] = array('interface_autoloader');

Now create a new class in your application/models folder "interface_autoloader.php":

<?php

class Interface_autoloader {

    public function __construct() {
        $this->init_autoloader();
    }

    private function init_autoloader(){
        spl_autoload_register(function($classname){
            if( strpos($classname,'interface') !== false ){
                strtolower($classname);
                require('application/interfaces/'.$classname.'.php');
            }
        });
    }

}

Now create a new folder in your application folder called "interfaces": Example of Interface Usage with CodeIgniter

Then just add your interfaces into the "interfaces" folder and you should be able to use them like normal.