CakePhp: أفضل طريقة لاستدعاء عمل وحدة تحكم أخرى مع صفيف كمعلمة؟

StackOverflow https://stackoverflow.com/questions/1507552

سؤال

في وحدة تحكم، ما هي الطريقة الأكثر ملاءمة للاتصال بعمل وحدة تحكم أخرى وتمرير صفيف كمعلمة؟

أعلم أنه يمكنك استخدام طلب إجراءات استدعاء الإجراءات داخل وحدات تحكم أخرى. ولكن هل من الممكن تمرير المصفوفات كمعلمات باستخدام إجراءات طلب؟

ولا، لا أريد وضع الإجراء في وحدة تحكم التطبيق. لذلك ليس حلا بالنسبة لي.

الطريقة الأخرى الوحيدة التي أعرفها هي تحميل وحدة التحكم الأخرى كما هو موضح في:http://book.cakephp.org/1.3/EN/The-manual/Developing-With-cakephp/configuration.html#importing-Controllers-Models-Components-Behaviors-Aviews-and-Helpers.

ولكن هل هناك طريقة أسهل فقط لاستدعاء إجراءات التحكم الأخرى أثناء تمرير مجموعة كمعلمة؟

أنا جديد في cakephp لذلك أي اقتراح موضع تقدير. شكرا.

هل كانت مفيدة؟

المحلول

هل سيكون من المناسب لك نقل المنطق من وحدة التحكم الثانية إلى طرازه، ثم افعل شيئا كهذا في عمل وحدة تحكم الأولى؟

$var = ClassRegistry::init('SecondModel')->myMethod($array);
$this->set(compact('var'));

ثم، في طريقة العرض لعمل المراقب الأول، يمكنك استخدام هذه البيانات.

أحاول دائما الاحتفاظ بطرق التحكم في الإجراءات التي يمكنك الضغط عليها من خلال المتصفح، ووضع الكثير من المنطق في النماذج الخاصة بي، فاتصل بطرق النماذج الأجنبية من إجراءات تحكم تحكم تحتاج إلى بيانات من النماذج التي لا يكون النموذج لهذه وحدة التحكم هذه، ثم استخدم هذه البيانات في آرائي، وإذا كانت البيانات التي ينظر إليها بشكل متكرر، أقوم بإنشاء عنصر لذلك.

نصائح أخرى

لن أستخدمها لاستخدام طلب الأسلوب ولكن بدلا من ذلك استيراد وتحديد المراقب المطلوب.

يقول Doc CakePhP عن الطلب:

"نادرا ما يكون من المناسب استخدامه في وحدة تحكم أو نموذج"

http://book.cakephp.org/view/434/Requestaction.

بمجرد استيرادك وتحميل وحدة التحكم، يمكنك استدعاء أي طريقة لوحدة التحكم هذه مع معلماتها.

<?php
  //Import controller
  App::import('Controller', 'Posts');

  class CommentsController extends AppController {
    //Instantiation
    $Posts = new PostsController;
    //Load model, components...
    $Posts->constructClasses();

    function index($passArray = array(1,2,3)) {
      //Call a method from PostsController with parameter
      $Posts->doSomething($passArray);
    }
  }
?>

اعتبارا من CakePhP 1.2.5، يجب أن تكون قادرا على اجتياز أنواع المعلمات المختلفة من خلال المعلمة الثانية في التخصير (). على سبيل المثال:

$this->requestAction('/users/view', array('pass' => array('123')));

ثم في userscontroller:

function view($id) {
    echo $id; // should echo 123 I believe, otherwise try $this->params['pass'].
}

بدلا من استخدام "تمرير" أعلاه، يمكنك بدلا من ذلك محاولة "النموذج" و "اسمه" لتمرير المعلمات النموذج / المسمى على التوالي.

CakePhp 2.x:

<?php
App::uses('AppController', 'Controller');
App::uses('PostsController', 'Controller');

class CommentsController extends AppController {

    public function index($parameter = null){
        //Instantiate
        $Posts = new PostsController();
        //Load model, components...
        $Posts->constructClasses();

        //Call a method of Posts passing a parameter
        $Posts->aMethod($parameter);
    }
}

أنا وضعت في فئة AppController الخاصة بي والطريقة التالية والمتغير لذلك هو مخزن التخزين المؤقت في حالة مكالمات متعددة

var $controllersArray = array();

function _getController( $pControllerName ){
    if ( ! isset($this->controllersArray[$pControllerName]) ){
        $importRes = App::import('Controller', $pControllerName);// The same as require('controllers/users_controller.php');
        $strToEval = "\$controller = new ".$pControllerName."Controller;";
        $evalRes = eval($strToEval);
        if ( $evalRes === false ){
            throw new AppException("Error during eval of given getController '$pControllerName'");
        }
        $controller->constructClasses();// If we want the model associations, components, etc to be loaded
        $this->controllersArray[$pControllerName] = $controller;
    }
    $result = $this->controllersArray[$pControllerName];

    return $result;
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top