marcogmonteiro / ci-admin-controller
This package is auto-updated.
Last update: 2020-11-20 16:24:57 UTC
README
codeigniter-base-controller是一个扩展的BaseController
类,用于CodeIgniter应用程序。任何继承自BaseController
或AdminController
的控制器都将获得智能视图自动加载和布局支持。它强烈遵循约定优于配置的理念,优先考虑简洁和一致性而非配置和复杂性。
扩展到adminController的控制器概述
<?php namespace App\Controllers\Admin;
use App\Models\ArticleModel;
class Articles extends AdminController
{
public function __construct()
{
$this->article = model('App\Models\ArticleModel');
$this->model_class = 'article';
}
/**
* List Articles
*/
public function index()
{
$this->data['articles'] = $this->article->findAll();
}
/**
* Create Article
*/
public function create()
{
return $this->adminCreate($this->request->getPost());
}
/**
* Update a Article
* @param int $id The article id
*/
public function update($id)
{
return $this->adminUpdate($id, $this->request->getPost());
}
/**
* Delete Article
* @param int $id The article id
*/
public function delete($id = null)
{
return $this->adminDelete($id);
}
}
用法
手动安装
将AdminController.php
文件拖入您的app/Controllers/Admin/文件夹。这样,您就可以在您的后端和前端之间保持明显的区别。这个文件夹内的所有控制器都应该扩展到adminController,而您文件夹外的控制器应该扩展到baseController。这样,只有您的后端控制器才能访问您的CRUD功能。
Composer安装
您应该在终端运行以下命令。
composer require marcogmonteiro/ci-admin-controller
或者在您的composer.json文件中添加以下内容。
{
"require": {
"marcogmonteiro/ci-admin-controller": "dev-master"
}
}
如果您通过composer安装包,则控制器应使用不同的命名空间。在这种情况下,继承自base Controller的控制器应扩展到\MyController\Controllers\MyController,而将使用adminController的控制器应使用\MyController\Controllers\Admin\AdminController,如下所示
<?php namespace App\Controllers;
class Home extends \MyController\Controllers\MyController
{
/**
* No view loading here!
*/
public function index()
{
}
}
视图和布局
视图将根据当前控制器和操作名称自动加载。在$this->data
中设置的任何变量都将传递到视图和布局。默认情况下,该类将在app/views/controller/action.php中查找视图。
为了防止自动渲染视图,将$this->view
设置为false
。
$this->view = false;
或者,为了加载与自动猜测的视图不同的视图
$this->view = 'some_path/some_view.php';
视图将加载到布局中。该类将查找app/views/layouts/backend.php布局文件或app/views/layouts/application.php,具体取决于是baseController还是adminController。
如果您想在控制器中覆盖此行为,只需将布局设置为所需的内容。
$this->layout = 'layouts/yourlayout.php'
为了指定在布局中输出视图的位置,渲染后的视图将存储在$yield
变量中
<h1>Header</h1>
<div id="page">
<?php echo $this->renderSection('yield') ?>
</div>
<p>Footer</p>
如果您希望完全禁用布局并仅显示视图(这对于AJAX请求特别有用),可以将$this->layout
设置为FALSE
。
$this->layout = FALSE;
与$this->view
一样,$this->layout
也可以用于指定非传统布局文件
$this->layout = 'layouts/mobile.php';
在$this->data
中设置的任何变量都将传递到视图和布局文件中。
查看结构
您的视图应该被创建来支持CodeIgniter 4自带布局的内置功能。
<?php echo $this->extend($layout); ?>
<?php echo $this->section('yield') ?>
<h1>Hello World from the home/index view!</h1>
<?php echo $this->endSection() ?>
至于您的布局,它们应该包含一个名为yield的渲染部分。
<!doctype html>
<html>
<head>
<title>My Layout</title>
</head>
<body>
This is my layout content
<?php echo $this->renderSection('yield') ?>
</body>
</html>
要能够直接渲染视图而不使用布局,我们需要一个只做视图渲染的空布局。为此,在您的Views/layouts文件夹中包含了一个nolayout.php文件。
<?php echo $this->renderSection('yield') ?>
项目中的完整文件夹结构现在已包含在内。
在您的控制器中加载辅助函数
如果您想在全局范围内加载辅助函数,而不是在函数内部,只需将helpers属性声明为数组,包含所有辅助函数,如下所示
<?php namespace App\Controllers;
class Home extends AdminController
{
protected $helpers = ['url'];
public function index()
{
}
}
AdminController CRUD
您可以在adminController中使用一些函数,这些函数在baseController中不可用。为此,必须遵循一些规则。首先,您需要加载控制器将要工作的主模型。例如,如果您有一个Articles控制器和一个ArticleModel,首先加载您的模型。
$this->article = model('App\Models\ArticleModel');
如您所见,我将模型加载到名为article的类属性中。在这种情况下,我的$Model_class属性也应该被称为article。
$this->model_class = 'article';
这样,如果您的Article控制器需要访问更新功能,只需创建一个更新函数,如下所示
public function update($id)
{
return $this->adminUpdate($id, $this->request->getPost());
}
此更新函数应始终返回在您的adminController函数上设置的更新结果。
如果您想将admin_update方法发送除post数据之外的其他内容,可以这样做
public function update($id)
{
$data = $this->request->getPost();
$data['my_new_field'] = 'foobar';
return $this->adminUpdate($id, $this->request->getPost());
}
这在您想添加一些post未提供的数据时特别有用。
默认情况下,此函数的成功操作将始终将控制器中的index函数重定向。使用此结构时,始终假设您有一个index函数。
此重定向还将自动设置一个确认flashdata,可用于视图。
如果您需要覆盖此行为,可以通过返回不同的结果来实现。
public function update($id)
{
$this->adminUpdate($id, $this->request->getPost());
return [
'url' => '/admin/list_articles',
'success' => 'Your article was updated.'
];
}
这样,您将用户重定向到/admin/list_articles,并带有“您的文章已更新”的flashdata。
在根目录中使用AdminController
如果您想在根目录或其他目录中使用AdminController,请更改$directory属性。
protected $directory = ''; // Set default directory
添加您自己的语言变量
CRUD方法现在支持使用语言变量。这些应该放在您的app/languages文件夹中,具体取决于您的地区设置。目前支持以下语言
- 英语
- 葡萄牙语
Error Helper
在您的adminController.php中,有一个名为error helper的自定义辅助函数被加载。这个函数应该放在您的helpers文件夹中,它的唯一目的是作为一个404异常的快捷方式。
// This is just the same thing
show_404();
// as
throw \CodeIgniter\Exceptions\PageNotFoundException::forPageNotFound();
现在您也可以在控制器中使用这个功能,每次需要显示404错误时。因为它在adminController中被自动加载。
路线图
- 添加基于类名的更好的错误消息,因此我们可以说出“您的文章已更新”而不是“项”;
Codeigniter 3 版本,没有 CRUD 控制器,仅自动加载视图
如果您仍在使用 Codeigniter 3,并希望找到类似以下内容:jamierumbelow/codeigniter-base-controller