11
votes

Utilisation des interfaces PHP dans CodeChIsiter

J'essaie de savoir comment puis-je utiliser des interfaces PHP dans ma conception MVC. Je veux m'assurer que la conception applique une interface de sorte que tout nouveau module suivrait cela.

Par exemple: P>

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

?>


0 commentaires

5 Réponses :


2
votes

dépend de ce que vous demandez. Si vous demandez si vous pouvez rendre le Code Igniter Framework, suivez vos interfaces, vous pourriez, mais cela nécessiterait une totalité de refactorisation dans leur cadre et ne vaudrait probablement pas la peine de travailler.

Si vous demandez si vous pouvez ajouter des interfaces pour vos classes personnalisées tout en utilisant le code allumeur, vous pouvez bien sûr. CI ne limite pas votre capacité à créer un code personnalisé, c'est ce que c'est là pour. Je suppose que la vraie réponse est "Qu'est-ce que vous demandez exactement?".


1 commentaires

Comment ajouter des interfaces pour vos classes personnalisées tout en utilisant le code allumeur?



4
votes

J'utilise des interfaces dans mon projet CEDERCIATED. Je viens de le faire:

Certaines classes doivent étendre un contrôleur personnel, donc j'ai créé la librairie appelée Module_Controller étend le contrôleur. Cette bibliothèque est automated. P>

Dans le même fichier, j'ai été déclaré l'interface. Donc, mes bibliothèques de fichiers / module_controller.php possèdent le code suivant: p>

class Module_Controller extends Controller{
...
}

interface modular{
...
}


2 commentaires

ce n'est pas une très bonne façon de faire des choses


En fait, ce n'est pas un mauvais moyen d'organiser des choses. Si l'interface modulaire est un comportement Module_Controller s'attend à ce que des objets qui soient transmis, il est logique. De cette façon, vous n'imposez aucune sorte de hiérarchie d'objet sur des classes qui doivent fonctionner avec module_controller.



0
votes

Votre interface fonctionne bien ... il suffit de répondre au-dessus du contrôleur qui l'utilisera, puis de le déclarer une nouvelle instance de celui-ci à partir du contrôleur ...

fichier de contrôleur: xxx

Pour être honnête, vous voudrez probablement pouvoir faire une sorte d'injection de dépendance, mais que je n'utilise pas de codeigniter, je ne suis pas sûr de la facilité Pour simuler une usine pour les appels à charge à l'interface avec les classes.

Permettez-moi de vous donner un exemple si:

Dépendance Injection: < P> fichier usine xxx

fichier de contrôleur: xxx

  • alors aperçu. Votre interface et vos API de service sont bien
  • Bien que votre architecture sortait étroitement couplée, déclarant qu'une nouvelle instance de votre modèle dans un contrôleur n'est pas complètement une mauvaise nouvelle.
  • Pour obtenir le fichier dans votre fichier de contrôleur, il suffit de répondre au contrôleur.

1 commentaires

Ce n'est pas vraiment ce que OP a demandé



14
votes

Voici comment obtenir les interfaces de Consulateur à charger correctement

dans votre application / config / autoload.php: xxx

Maintenant, créez une nouvelle classe dans votre dossier d'application / modèles "interface_autoloader.php": xxx

crée maintenant un nouveau dossier dans votre dossier d'application " interfaces ": Exemple d'utilisation de l'interface avec codeigniter

Ajoutez simplement vos interfaces dans le " interfaces "dossier et vous devriez pouvoir les utiliser comme la normale.


4 commentaires

J'aimerais juste noter, en raison d'être voté, ce n'est pas une façon standard de faire des interfaces dans PHP. Cependant, aucun contrôle dans un dossier séparé de vos modèles (standard de CI) (Standard de CI).


Ceci est correct et sous la structure de CI, c'est la solution la plus logique. Pourquoi cela a été évité, je ne saurai jamais.


Il y a un problème mineur avec ceci: Si l'interface est utilisée par quelque chose d'autre qu'un modèle (comme une aide), les modèles sont chargés après l'aide ... Donc, cela ne verra pas encore les interfaces. +1 De toute façon, cela m'a fait comprendre comment les choses fonctionnent un peu mieux.


Comment l'interface peut-elle être utilisée dans une fonction de bibliothèque (ou assistant)?



3
votes

Vous pouvez créer my_loader classe étend ci_loader dans application / noyau et chargez vos interfaces.

Voici un exemple: http://heatheevens.me. Royaume-Uni / 2013/11/11 / Interfaces-in -dicaiter /


1 commentaires

C'est la façon de le faire.