CAKEPHP,如何调用一个控制器方法到一个控制器中?

fzsnzjdm  于 2022-11-24  发布在  PHP
关注(0)|答案(1)|浏览(248)

我正在设计一个应用程序,其中所有实体(物品、供应商、客户、联系人等)有一个特殊的对象叫做,井......对象(每个表的每一行都有一个object_id列)。(例如,审计跟踪,对象标识=32665,用户标识=312,详细信息=更新字段,bla bla)。
因此,我想创建一个具有方法(可能是create_new_object)的组件,该方法将从对象控制器中调用add方法(我修改了该方法,以便在没有人工交互的情况下创建一个新实体,我的代码如下)。
如何从一个组件调用一个控制器方法?

版本

我忘了输入密码,抱歉。
这是我的对象控制器

<?php
namespace App\Controller;

use App\Controller\AppController;

class ObjectsController extends AppController
{
   public function add($type = null)
    {       
        if($type)
        {
            $object = $this->Objects->newEntity();
            
            $object = $this->Objects->patchEntity($object, $this->request->getData());
            
            $object->type = $type;
            
            if ($this->Objects->save($object)) {
                $this->Flash->success(__('The object has been saved.'));

                $resultJ = json_encode(array('result' => 'success',
                                             'object_id' => $object->id));
            }
            else
            {
                $resultJ = json_encode(array('result' => 'error',
                                             'message' => 'The object could not be save. Please, try again.'));
            }
        }
        else
        {
            $resultJ = json_encode(array('result' => 'error',
                                         'message' => 'An object type is necessary. Please, try again.o'));
        }
            
        $this->response->type('json');
                
        $this->response->body($resultJ);
                
        return $this->response;
    }
}

我有三个重要的实体...
1.文章。
1.顾客。
1.供应商。
然后,我有另一种实体(我称之为他们,二级秩序),现场联系人,地址,电话,电子邮件,城市,国家,等等。
每个实体的每个对象(主要和次要)都必须有一个object_id属性引用一个Object对象(),这对于审计跟踪很有用,例如。因此,我计划创建一个组件,名为IdentificationComponent,其内容如下...

public function create_and_object()
{
    bla bla bla... Object->add($type_of_object);
    
    return $generated_object_id;
}

最后,我希望在AppController中实现我的组件(ObjectController有一个特殊的例外)。我希望每个实体在创建时都创建一个新的Object对象。

yzuktlbb

yzuktlbb1#

最后,我创建了一个组件(CookBook指出这是为控制器编写可重用代码的正确方法)。
一方面,这是我的组件代码...

<?php
    namespace App\Controller\Component;

    use Cake\Controller\Component;

    use App\Controller\ObjectsController;

    class ObjectToolsComponent extends Component
    {
        public function getNewObjectId($object_type)
        {   
            return (new ObjectsController())->add($object_type);
        }
    }
?>

另一方面,这是对控制器方法的调用...

public function add()
{
    $article = $this->Articles->newEntity();
    if ($this->request->is('post')) {
        $article = $this->Articles->patchEntity($article, $this->request->getData());

        /* The call */
        $article->object_id = $this->ObjectTools->getNewObjectId(Inflector::underscore($this->name));

        if ($this->Articles->save($article)) {
            $this->Flash->success(__('The article has been saved.'));

            return $this->redirect(['action' => 'index']);
        }
        $this->Flash->error(__('The article could not be saved. Please, try again.'));
    }
    $objects = $this->Articles->Objects->find('list', ['limit' => 200]);
    $articleStatuses = $this->Articles->ArticleStatuses->find('list', ['limit' => 200]);
    $suppliers = $this->Articles->Suppliers->find('list', ['limit' => 200]);
    $this->set(compact('article', 'objects', 'articleStatuses', 'suppliers'));
}

正如您所看到的,我使用类似于控制器名称的参数调用了getNewObjectId方法。
我希望这对将来的某个人有帮助。
感谢@GregSchmidt和@ndm的意见和帮助。
祝你愉快

相关问题