如何在 Codeigniter 4 中扩展控制器?

Posted

技术标签:

【中文标题】如何在 Codeigniter 4 中扩展控制器?【英文标题】:How to extend controller in Codeigniter 4? 【发布时间】:2018-05-28 13:42:30 【问题描述】:

如何在 codeigniter 4 中创建自己的核心控制器,例如 codeigniter 3

【问题讨论】:

【参考方案1】:

当您说“核心”控制器时,我理解您是指“基本”控制器,在 CI v3 中通常被命名为 MY_Controller。如果这就是您所要求的,那么由于命名空间和自动加载器,在 v4 中实际上要容易得多。此外,不需要使用像MY_ 这样的前缀。

这就是它是多么容易。 “基础”控制器...

文件:/application/Controllers/Base.php

<?php namespace App\Controllers;

class Base extends \CodeIgniter\Controller

    //your code here

然后扩展上述内容以创建任何其他控制器

文件:/application/Controllers/Home.php

<?php namespace App\Controllers;

class Home extends \App\Controllers\Base

   // Your code here

Home 控制器将继承您在Base 中定义的所有属性和方法。

【讨论】:

好的,非常感谢@DFriend。我会努力的!!【参考方案2】:

你不需要创建另一个核心控制器,已经提供了一个核心控制器,即BaseController。 您只需将其扩展到您的选择

【讨论】:

【参考方案3】:

试试这个

<?php namespace App\Core;

use CodeIgniter\Controller;

class Home extends Controller



【讨论】:

【参考方案4】:

查看我的代码

<?php

namespace Modules\Shared\Controllers;

/**
 * Class BaseController
 *
 * BaseController provides a convenient place for loading components
 * and performing functions that are needed by all your controllers.
 * Extend this class in any new controllers:
 *     class Home extends BaseController
 *
 * For security be sure to declare any new methods as protected or private.
 *
 * @package CodeIgniter
 */


use CodeIgniter\HTTP\RequestInterface;
use CodeIgniter\HTTP\ResponseInterface;
use CodeIgniter\RESTful\ResourceController;
use Modules\Auth\Config\Services;
use Myth\Auth\AuthTrait;
use Psr\Log\LoggerInterface;
use  Modules\Shared\Interfaces\UrlQueryParamInterface;
use  Modules\Shared\Libraries\UrlQueryParam;

class ApiController extends ResourceController

    use AuthTrait;

    protected $format = "";
    public object $userObject;
    public UrlQueryParamInterface $urlQueryParam;

    /**
     * An array of helpers to be loaded automatically upon
     * class instantiation. These helpers will be available
     * to all other controllers that extend BaseController.
     *
     * @var array
     */
    protected $helpers = [
        'cookie',
        'url',
        'from',
        'filesystem',
        'text',
        'shared'
    ];

    /**
     * Constructor.
     *
     * @param RequestInterface $request
     * @param ResponseInterface $response
     * @param LoggerInterface $logger
     */


    /**
     * @var string
     * Holds the session instance
     */
    protected $session;

    public function __construct()
    

        $this->userObject = (object)[];
    

    public function initController(RequestInterface $request, ResponseInterface $response, LoggerInterface $logger)
    
        // Do Not Edit This Line
        parent::initController($request, $response, $logger);


        $this->urlQueryParam = new UrlQueryParam($request);

        $requestWithUser = Services::requestWithUser();
        $this->userObject = $requestWithUser->getUser();

    




<?php

namespace Modules\Common\Controllers;


use Modules\Common\Config\Services;
use Modules\Common\Entities\AdvertisementEntity;
use CodeIgniter\HTTP\ResponseInterface;
use Modules\Shared\Controllers\ApiController;

class Advertisement extends ApiController



    /**
     * index function
     * @method : GET
     */
    public function index()
    
        $advertisementEntity = new AdvertisementEntity();
        $this->urlQueryParam->dataMap($advertisementEntity->getDataMap());

        $advertisementService = Services::advertisementService();
        $findAllData = $advertisementService->index($this->urlQueryParam);


        return $this->respond([
            'data' => $findAllData['data'],
            'pager' => $findAllData['pager']
        ], ResponseInterface::HTTP_OK, lang('Shared.api.receive'));


    

    /**
     * show function
     * @method : GET with params ID
     */
    public function show($id = null)
    


        $advertisementService = Services::advertisementService();
        $findOneData = $advertisementService->show($id);

        return $this->respond([
            'data' => $findOneData['data'],
            'pager' => $findOneData['pager']
        ], ResponseInterface::HTTP_OK, lang('Shared.api.receive'));

    

    /**
     * create function
     * @method : POST
     */
    public function create()
    


        $rules = [
            'name' => 'required|min_length[3]|max_length[255]',
            'link' => 'required',


        ];

        if (!$this->validate($rules)) 

            return $this->respond([
                'error' => $this->validator->getErrors(),

            ], ResponseInterface::HTTP_NOT_ACCEPTABLE, lang('Shared.api.validation'));

        ;


        $advertisementEntity = new AdvertisementEntity((array)$this->request->getVar());
        $advertisementEntity->enableStatus()->createdAt();
        $advertisementService = Services::advertisementService();
        $advertisementService->create($advertisementEntity);


        return $this->respond([
            'insertId' => $advertisementService->getInsertID()
        ], ResponseInterface::HTTP_CREATED, lang('Shared.api.save'));


    

    /**
     * update function
     * @method : PUT or PATCH
     */
    public function update($id = null)
    


        if ($this->request) 
            //get request from Vue Js
            $json = $this->request->getJSON();
            if (!isset($id)) 
                $id = $json->id;
            


            $rules = [
                'name' => 'required|min_length[3]|max_length[255]',
                'link' => 'required',


            ];

            if (!$this->validate($rules)) 
                return $this->respond([
                    'error' => $this->validator->getErrors(),

                ], ResponseInterface::HTTP_NOT_ACCEPTABLE, lang('Shared.api.validation'));

            


            $advertisementEntity = new AdvertisementEntity((array)$this->request->getVar());
            $advertisementEntity->updatedAt();

            $advertisementService = Services::advertisementService();
            $advertisementService->update($id, $advertisementEntity);


        
        return $this->respond([
        ], ResponseInterface::HTTP_OK, lang('Shared.api.update'));


    

    /**
     * edit function
     * @method : DELETE with params ID
     */
    public function delete($id = null)
    

        $advertisementService = Services::advertisementService();
        $advertisementService->delete($id);

        return $this->respond([
        ], ResponseInterface::HTTP_OK, lang('Shared.api.remove'));


    



【讨论】:

以上是关于如何在 Codeigniter 4 中扩展控制器?的主要内容,如果未能解决你的问题,请参考以下文章

在 codeigniter 中扩展多个核心控制器

如何在 CodeIgniter 4 中使用子目录控制器?

Codeigniter 4 如何在视图中调用控制器方法?

Codeigniter 扩展控制器,找不到控制器

如何解决此 Codeigniter-4 登录控制器问题?

在 Codeigniter 中扩展表单验证