slaxweb/ci-basecontroller

CodeIgniter的基础控制器

0.4.1 2015-05-21 13:03 UTC

README

CodeIgniter的基础控制器,帮助您加载视图、子视图,并用数据填充它们,同时加载语言并将语言注入到视图数据中。

BaseController的想法来自Jamie Rumbelows的基础控制器,并进行了一些添加和更改。在此,我还要感谢Marco MonteiroSami Keinänen的帮助。

如果您遇到问题或有问题/想法,请在此GitHub上提交工单。

这仍然处于开发阶段,但已准备好用于生产。所有现有内容都将保留,如果发生更改,旧方法将以弃用状态保留。

目录

安装

目前最简单的安装方式是使用composer。只需在项目根目录中创建composer.json文件

{
  "require": {
    "slaxweb/ci-basecontroller": "~0.4"
  }
}

然后运行 composer.phar install。完成后,在 application/config/config.php 中启用composer自动加载。

接下来,在 application/config/ 中创建名为 slaxweb 的目录,并将位于 install/slaxweb/basecontroller.php 中的配置文件复制到新创建的目录中。或者可以使用 install 目录中的安装脚本。

恭喜,BaseController已安装。

视图加载和数据

示例

<?php
class Contrlr extends \SlaxWeb\BaseController\BaseController
{
  public function showView()
  {
    // nothing, that's enough
    // base controller will load application/views/contrlr/showview/main.php view file
    // if the controller is located in a sub-dir, sub-dir is also included in view path
  }
  
  public function nonDefaultView()
  {
    $this->view = "path/to/different/view/file";
  }
  
  public function noView()
  {
    $this->view = false;
    // do whatever you want
  }
  
  public function subView()
  {
    $this->subViews = array("varName" => "subview/file");
  }
  
  public function viewWithData()
  {
    $this->viewData = array("name" => "value");
  }
}

基本用法

要开始使用,所有控制器都必须扩展 \SlaxWeb\BaseController\BaseController 而不是 CI_Controller。如果您已经扩展了 MY_Controller,那么在 MY_Controller 中扩展 \SlaxWeb\BaseController\BaseController

这就完成了,在控制器方法执行完毕后,BaseController将自动加载与此控制器方法关联的视图文件。默认加载的视图为: application/views/(controllerdir)/controllername/controllermethod/main

禁用视图加载

某些控制器方法不加载视图。在这种情况下,将BaseController属性 view 设置为false

$this->view = false

更改视图文件

想要加载不同的视图文件而不是默认文件?没问题,只需将所需的视图文件设置为 view 属性。

$this->view = "desired/view";

加载子视图

警告!在版本0.4.0中已更改子视图的加载方式。请参阅 UPDATE0.4.0.md 了解更多信息。

如果您需要将子视图加载到主视图中,可以通过将嵌套数组赋值给BaseController的 subViews 属性来实现。第一级数组持有要注入到视图数据中的子视图参数的名称,作为键。值是一个数组数组。最底层的数组包含视图路径和名称,以及任何具有“view”和“data”键的子视图特定数据。

$this->subViews = array(
    "name"  =>  array(
        array(
            "view"  =>  "subview/file",
            "data"  =>  array(
                "subviewParameter"  =>  "value"
            )
        )
    )
);

数据不是必需的参数,可以省略。

在主视图中显示子视图

<?php echo $subview_name; ?>

视图数据

要将数据加载到视图中,只需将其分配给 viewData 属性数组。

$this->viewData = array("name" => "value");

控制器404页面

如果找不到控制器方法,BaseController 将在路由到的控制器中搜索名为 _404 的方法并调用它,因此您可以针对每个控制器拥有自定义的 404 页面。如果未找到,它将调用 CodeIgniter 的 show_404 方法,并按正常操作显示 CodeIgniter 的 404 页面。

语言

BaseController 还自动加载语言文件,并在加载视图之前将正确命名的语言字符串加载到视图数据中。语言文件名必须与控制器同名,所有要注入到视图数据中的语言字符串,其语言字符串键需要带有 methodname_ 前缀。

示例

<?php
class Contrlr extend \SlaxWeb\BaseController\BaseController
{
  public function injectLanguage()
  {
    // you're done, default view is loaded with default language and its prefixed language strings.
  }
  
  public function noLang()
  {
    $this->langFile = false;
  }
  
  public function diffLangFile()
  {
    $this->langFile = "Diffrent";
  }
  
  public function diffPrefix()
  {
    $this->langPrefix = "custom_prefix_";
  }
  
  public function nonDefaultLanguage()
  {
    $this->language = "german";
  }
}

基本用法

默认情况下,基控制器会自动加载与控制器名称相同名称的语言文件,从默认语言目录中。默认情况下是英文,可以在 CodeIgniter 配置中更改。默认情况下,它会加载所有带有 methodname_ 作为键名前缀的语言字符串。

class Contrlr \SlaxWeb\BaseController\BaseController
{
  public function defaultLang()
  {
  }
}

上述将尝试自动加载 application/language/english/Controller_lang.php 并注入翻译后的字符串。

$lang["defaultLang_var1"] = "string";
$lang["defaultLang_var2"] = "string";
$lang["defaultLang_var3"] = "string";

在视图中,变量 $var1$var2$var3 将可用。

无语言

要禁用语言加载,只需将属性 langFile 设置为 false。警告!用于在 0.1.* 版本中禁用语言文件加载的属性是 includeLang

$this->langFile = false;

语言文件

若要加载不同的语言文件,请设置 langFile 属性。

$this->langFile = "Different";

如果您希望加载多个语言文件,请将包含这些语言文件名的数组设置为 langFile 属性。

$this->langFile = array("Lang1", "Lang2", "Lang3");

语言前缀

要更改默认方法名前缀,请设置 langPrefix 属性。

$this->langPrefix = "langprefix_";

非默认语言

如果您想加载非默认语言,您必须使用 language 属性来设置它。

$this->language = "german";

模板

BaseController 也支持基本的模板。目前只能通过设置标题和页脚视图来实现。

示例

class Contrlr extends \SlaxWeb\BaseController\BaseController
{
  // DEPRECATED
  public function template()
  {
    $this->head = "head/view";
    $this->foot = "foot/view";
  }
  
  // DEPRECATED
  public function noTemplate()
  {
    // if a template is already loaded, you can disable it
    $this->include = false;
  }

  public function layout()
  {
    // to load a layout, set layout property to true
    // base controller will try to load the controllers layout if not found
    // it will load the application default layout
    $this->layout = true;
  }

  public function specificLayout()
  {
    // if you want your method or whole controller to have a specific
layout file you can set it to the layout property
    $this->layout = "layout/view";
  }
}

已弃用 - 设置模板文件

为了设置标题和/或页脚文件,必须设置属性 headfoot。然后标题视图将在控制器视图之前加载,页脚将在之后。

$this->head = "head/view";
$this->foot = "foot/view";

已弃用 - 禁用模板

如果您已设置模板文件,但不想显示标题和页脚视图,则需要将 include 属性设置为 false。

$this->include = false;

布局

BaseController 现在提供了布局,而不是标题/页脚文件。布局是整个模板,您的控制器视图将通过 mainView 变量注入到布局视图中。您有四种选项

  • 无布局(默认),将 BaseController 的 layout 属性设置为 false
  • 控制器特定布局,将属性 layout 设置为 true,BaseController 将尝试从 {views}/layouts/ControllerDir/ControllerName/layout 加载默认控制器布局文件
  • 应用程序特定布局,将属性 layout 设置为 true,并确保控制器特定布局视图文件不存在
  • 自定义布局,将布局视图文件的路径设置为 layout 属性
// use controller or application specific layout
$this->layout = true;
// use custom layout
$this->layout = 'layout/myLayout';

手动视图加载

BasicController 还允许您手动加载您想要的任何视图文件。因为 BaseController 使用 ViewLoader,您可以通过受保护的 _viewLoader 属性访问它。有关使用 ViewLoader 的帮助,请阅读此处的说明。

模型

BaseController 现在尝试自动加载此控制器的默认模型,该模型需要具有与控制器相同的名称,并带有 _model 后缀。您还可以将您可能想要加载的附加模型添加到 models 属性中。然后模型可通过 $this->{Model name} 访问,无需 _model 后缀。

示例

class Cntrlr extends \SlaxWeb\BaseController\BaseController
{
    // Autoload models Model1_model and Model2_model
    public $models = array("Model1", "Model2");

    public function someMethod()
    {
        // now just use the model:
        $this->Model1->modelMethod();
        $this->Model2->modelMethod();
    }
}

CRUD

CRUD 代表创建(Create)、检索(Retrieve)、更新(Update)、删除(Delete)。BaseController 提供基本的 CRUD 方法,用于检索数据,将其注入到视图数据中,以及为数据库数据的创建、更新和删除获取表单数据。只要您的模型提供了此类操作所需的必要方法即可。为了安全起见,请安装 BaseModel,并从它扩展您的模型。

CRUD 有 4 个方法

  • index - 从数据库获取数据,并将BaseModel Result对象注入到视图数据中的 _tableData 变量
  • update_post - 接收帖子数据以及ID作为输入参数,更新数据库表,如果ID是int(0),则更新所有记录
  • create_post - 接收帖子数据并将其插入到表中
  • delete_post - 接收ID作为输入参数并删除记录。如果ID是int(0),则删除表中的所有记录

除了index(创建)之外的所有操作都通过POST HTTP请求方法访问,并且它们都提供了在操作完成后加载特定视图的机制,同时也设置了视图数据中的错误,如果操作不成功。这是通过3个不同的BaseController属性实现的

  • afterUpdate
  • afterCreate
  • afterDelete

这些属性需要包含要加载的视图的字符串位置。如果留空,则按HTTP GET请求对应的方法(更新、创建、删除)加载相应的默认视图。

更新和创建还提供了数据验证的机制,你只需要在你的控制器中设置 createRulesupdateRules 公共属性。这些属性需要包含常规的CodeIgniter验证规则。

在错误情况下,创建、更新和删除将错误字符串注入为 createErrorupdateErrordeleteError 变量。有三种错误类型:验证错误、创建错误、更新错误,以及第四种通用错误用于删除方法。为了获取消息,你的控制器语言文件必须被加载,并且它需要包含以下键

  • error_validation_error - 当发生验证错误时
  • error_update_error - 当发生更新错误时
  • error_create_error - 当发生创建错误时
  • error_delete_generic - 当发生删除错误时

如果设置了这些,你将在视图数据中看到这个错误消息。在验证错误的情况下,通常可以使用CodeIgniter的验证错误输出。

变更日志

0.4.0

WARNING! 此版本破坏了向后兼容性!请参阅 UPDATE0.4.0.md 获取更多信息

  • 在单个subView参数中启用加载多个视图

0.3.1

  • 在执行回调之前对回调数组进行排序

0.3.0

  • 将回调定义更改为数组以支持同一位置的多重回调
  • 添加类名大小写敏感性的配置文件
  • 基于大小写敏感性转换类名

0.2.3

  • 由于合并错误,缺少 layout 属性

0.2.2

  • 由于合并错误,语言未设置

0.2.1

  • 修复合并错误

0.2.0

  • 添加布局支持
  • 添加基本的CRUD
  • 自动加载模型
  • 在执行控制器方法之前自动加载语言
  • 回调
  • 代码抽象
  • 弃用旧的模板页眉/页脚
  • 使用属性 langFile 禁用语言文件加载,以前是 includeLang

0.1.2

  • 修复在执行控制器方法之前包含语言文件加载时的合并冲突

0.1.1

  • 版本更改
  • 在执行控制器方法之前加载语言文件

0.1.1.0

  • 第一个beta版本

0.1.0.3

  • 多语言文件

0.1.0.2

  • 在尝试加载猜测的视图文件之前将视图路径转换为小写
  • 将控制器子目录包含在猜测的视图文件中

0.1.0.1

  • 不要检查视图文件是否存在,让CodeIgniter处理这个问题。

0.1.0.0

  • 初始版本