YII 通用CURD外部Action 适合单表

本文介绍如何使用Yii框架实现常见的CRUD(创建、读取、更新、删除)操作,并通过创建通用Action(如DeleteAction、UpdateAction等)来提高代码复用性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

用YII创建表的时候出现没主键的表,你可以在AR primaryKey()函数里手工声明主键

主键:CActiveRecord::model($modelClass)->tableSchema->primaryKey;
库名:CActiveRecord::model($modelClass)->tableSchema->schemaName;
表名:CActiveRecord::model($modelClass)->tableSchema->name;

保存后得到主键值

Yii::app()->db->getLastInsertID();
$model->save();
$model->id; 

为什么用外部Action,可以提高业务的重用性 。如DeleteAction可以同时处理post,user,...删除。

制器通常有一个默认的动作。当用户的请求未指定要执行的动作时,默认动作将被执行。默认情况下,默认的动作名为index, 它可以通过设置 CController::defaultAction 修改。

public $defaultAction='index';

删除action

1.创建DeleteAction.php在protected/actions目录下,用于删除一条记录

<?php

class DeleteAction extends CAction
{
    public $pk = 'id';
    public $redirectTo = array('index');
    public $modelClass;
    public $deleteAttribute = array();  //$deleteAttribute = array('is_actived'=>0);

    function run()
    {
        $pk = Yii::app()->request->getParam($this->pk);
        if (empty($pk))
            throw new CHttpException(404, '参数错误');
        $model = CActiveRecord::model($this->modelClass)->findByPk($pk);
        if (!$model)
            throw new CHttpException(404, '系统查无数据');

        $redirect = Yii::app()->request->urlReferrer;
        if (empty($redirect)) {
            $redirect = $this->redirectTo;
        }
        if (empty($this->deleteAttribute)) {//物理删除
            if ($model->delete()) {
                $this->getController()->redirect($redirect);
            }
        } else {
            $attr = key($this->deleteAttribute);
            $model->{$attr} = $this->deleteAttribute[$attr];
            if ($model->save()) {
                $this->getController()->redirect($redirect);
            }
        }
        throw new CHttpException(500);
    }
}

详情action

创建ViewAction.php在protected/actions目录下, 用于显示一条明细

<?php
class ViewAction extends CAction{
	public $param = 'id';
	public $renderTo = 'view';
	public $modelClass;
	function run(){
		$pk = Yii::app()->request->getParam($this->param);
        if(empty($pk))  
            throw new CHttpException(404);  
            
        $model = CActiveRecord::model($this->modelClass)->findByPk($pk);  
        if(!$model)  
            throw new CHttpException(404); 
             
		$this->getController()->render($this->renderTo, array('model'=>$model));
	}
}

修改action

创建UpdateAction.php在protected/actions目录下, 用于修改一条明细

<?php

class UpdateAction extends CAction
{
    public $pk = 'id';
    public $renderTo = 'update';
    public $successRedirect = array('index');
    public $modelClass;

    function run()
    {
        $pk = Yii::app()->request->getParam($this->pk);
        $refer = Yii::app()->request->getParam('refer');
        if (empty($pk))
            throw new CHttpException(404);

        $model = CActiveRecord::model($this->modelClass)->findByPk($pk);
        if (!$model)
            throw new CHttpException(404);
        $model->scenario = 'update';

        if (isset($_POST[$this->modelClass])) {
            $model->attributes = $_POST[$this->modelClass];
            if ($model->save()) {
                $model->unsetAttributes(); // clear any default values
                $this->getController()->redirect($refer ? $refer : $this->successRedirect);
            }
        }

        $this->getController()->render($this->renderTo, compact('model'));
    }
}

新增action

创建CreateAction.php在protected/actions目录下, 用于新增一条记录

<?php

class CreateAction extends CAction
{
    public $pk = 'id';
    public $renderTo = 'create';
    public $successRedirect = array('index');
    public $modelClass;

    function run()
    {
        $refer = Yii::app()->request->getParam('refer');
        $model = new $this->modelClass;
        //$model->scenario = 'save';
        if (isset($_POST[$this->modelClass])) {
            $model->attributes = $_POST[$this->modelClass];
            if ($model->save()) {
                $model->unsetAttributes(); // clear any default values
                $this->getController()->redirect($refer ? $refer : $this->successRedirect);
            }
        }

        $this->getController()->render($this->renderTo, array('model' => $model));
    }
}

列表action

创建ListAction.php在protected/actions目录下,用于查询列表管理

<?php

class ListAction extends CAction
{
    public $renderTo = 'list';
    public $modelClass;
    public $renderArr = array();
    public $searchArr = array();

    function run() {
        $model = new $this->modelClass('search');
        $model->unsetAttributes(); // clear any default values
        #查询初始化条件
        if (!empty($this->searchArr)) {
            $model->attributes = $this->searchArr;
        }
        if (isset($_REQUEST[$this->modelClass])) { //点击搜索按钮后的查询条件
            $model->attributes = $_REQUEST[$this->modelClass];
            array_map("trim", $model->attributes);
        }
        $params = array_merge(['model' => $model], $this->paramsArr);
        $this->getController()->render($this->renderTo, $params);
    }
}

使用例子

2.PostController.php

<?php
class PostController extends Controller
{
	function actions(){
		return array(
			'create' => array(
				'class'		 => 'application.actions.CreateAction',
				'modelClass' => 'Post',
			),
			'view' => array(
				'class'		 => 'application.actions.ViewAction',
				'param'		 => 'Postid', //getParam('param');
				'modelClass' => 'Post',
			),
			'update' => array(
				'class'		 => 'application.actions.UpdateAction',
				'modelClass' => 'Post',
			),
			'delete' => array(
				'class'		 => 'application.actions.DeleteAction',
				'modelClass' => 'Post',
			),
			'index' => array(
				'class'		 => 'application.actions.ListAction',
				'modelClass' => 'Post',
			),
		);
	}
}

其中class是DeleteAction的路径,pk主键(默认id,可以不写),只需要修改actions,其他的model就可以共用DeleteAction.php,访问时

index.php?r=post/remove?Post_id=1

修改系统gii的Crud Generator模板,可以快速的构建项目 http://hudeyong926.iteye.com/blog/1273561

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值