如何在 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 中扩展控制器?的主要内容,如果未能解决你的问题,请参考以下文章