marcogmonteiro / ci-admin-controller

此包已被废弃,不再维护。作者建议使用mpmont/ci-toolkit包。

查看Codeigniter 4框架的自动加载

1.1.7 2020-07-30 15:27 UTC

This package is auto-updated.

Last update: 2020-11-20 16:24:57 UTC


README

GitHub version

codeigniter-base-controller是一个扩展的BaseController类,用于CodeIgniter应用程序。任何继承自BaseControllerAdminController的控制器都将获得智能视图自动加载和布局支持。它强烈遵循约定优于配置的理念,优先考虑简洁和一致性而非配置和复杂性。

扩展到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