2013-09-26 4 views
0

J'essaie de comprendre s'il existe un moyen de partager des contrôleurs, des modèles et des vues pour plusieurs applications CakePHP, mais d'y substituer des méthodes spécifiques si nécessaire. Ainsi, par exemple, si j'avais la structure suivante ...CakePHP Architecture

/my_cool_app 
    /core 
    /app 
     /Model 
     Person.php 
     ->findPerson(); 
     ->mapPerson(); 
    /orgs 
    /org_1 
    /app 
     /Model 
     Person.php 
     ->mapPerson(); 

Ce que je voudrais faire est d'avoir l'application CakePHP dans ORG_1/app utiliser tous les contrôleurs, les modèles, vues, etc. de/core/app, mais permet de remplacer toute méthode spécifique si le fichier existe dans cette structure (par exemple, org_1/app/Model/Person.php).

Est-ce faisable?

Répondre

2

Certainement possible. Votre répertoire en tant que tel:

/your_cool_app 
    /base 
     /app 
      /Model 
       AppModel.php 
       BasePerson.php 
    /inherited 
     /app 
      /Model 
       InherietdPerson.php 

alors à l'intérieur du bootstrap.php du répertoire hérité vous pouvez utiliser App::build() pour indiquer à l'application où chercher les modèles de base:

App::build(array(
    'Model' => array(
     //Path to the base models 
     $_SERVER['DOCUMENT_ROOT'] . DS 
      ."your_cool_app" . DS 
       . "base" . DS 
        . "app" . DS 
         . "model" 
    ) 
)); 

Le BasePerson prolongera AppModel:

<?php 

    App::uses('AppModel', 'Model'); 

    class BasePerson extends AppModel { 

    } 

?> 

Et le InheritedPerson étend la BasePerson:

<?php 

    App::uses('AppModel', 'Model'); 

    class InheritedPerson extends BasePerson { 

    } 

?> 

Maintenant, pour tester si elle fonctionne à créer un contrôleur dans l'application héritée et vérifiez quels modèles votre application a chargé:

$this->set('models', App::objects('Model')); 

Et la vue:

<?php 
    debug($models); 
?> 

Il devrait imprimer quelque chose comme ce qui suit:

array(
    (int) 0 => 'AppModel', //Is in the base app 
    (int) 1 => 'BasePerson', //Is in the base app 
    (int) 2 => 'InheritedPerson' //Is in the inherited app 
) 

Découvrez CakePhp de App class pour plus d'informations.