slaxweb / ci-basecontroller
CodeIgniter的基础控制器
Requires
- php: >=5.3.0
- slaxweb/ci-viewloader: 1.0.3.0
This package is not auto-updated.
Last update: 2024-09-25 13:51:55 UTC
README
CodeIgniter的基础控制器,帮助您加载视图、子视图,并用数据填充它们,同时加载语言并将语言注入到视图数据中。
BaseController的想法来自Jamie Rumbelows的基础控制器,并进行了一些添加和更改。在此,我还要感谢Marco Monteiro和Sami 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"; } }
已弃用 - 设置模板文件
为了设置标题和/或页脚文件,必须设置属性 head 和 foot。然后标题视图将在控制器视图之前加载,页脚将在之后。
$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请求对应的方法(更新、创建、删除)加载相应的默认视图。
更新和创建还提供了数据验证的机制,你只需要在你的控制器中设置 createRules 或 updateRules 公共属性。这些属性需要包含常规的CodeIgniter验证规则。
在错误情况下,创建、更新和删除将错误字符串注入为 createError、updateError 或 deleteError 变量。有三种错误类型:验证错误、创建错误、更新错误,以及第四种通用错误用于删除方法。为了获取消息,你的控制器语言文件必须被加载,并且它需要包含以下键
- 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
- 初始版本