控制器
<?php /** *Yii Framework * User: ajiang * WebSite: WWW.WEICOT.COM * Date: 2017/4/17 0017 * Time: 15:40 * backend\controllers\WeicotController.php 本文件目录 */ namespace backend\controllers; //注意这里使用的后台app use Yii; use app\models\WeicotEntryFrom; use yii\web\Controller; /************* 第三点数据库 *************************/ use yii\data\Pagination; use app\models\Country; /************* 第三点数据库 end*************************/ class WeicotController extends Controller{ /************************第一点 控制器与视图**************************************/ // Yii 使用 action 前缀区分普通方法和动作。 action 前缀后面的名称被映射为动作的 ID。 public function actionSay($msg='hello') { //yii\web\Controller::render() 被用来渲染一个名为 say 的视图文件。 message 参数也被传入视图 //这个视图文件在 backend\views\weicot\say.php return $this->render('say',['message'=>$msg]); //yii\web\Controller::render() , 它将会寻找名为 views/控制器 ID/视图名.php 的PHP文件。。 } // 本例访问地址 http://127.0.0.1/START/yii2/backend/web/index.php?r=weicot/say&msg=Hello+Weicot //其中 r=weicot[模块]/say[action]&msg[参数]=Hello+Weicot[值] //上面 URL 中的参数 r 。 它代表路由,是整个应用级的, 指向特定动作的独立 ID。路由格式是 控制器 ID/操作 ID /************************第二点 数据验证 与模型**************************************/ public function actionEntry(){ //backend\models\WeicotEntryFrom.php //访问地址 http://127.0.0.1/START/yii2/backend/web/index.php?r=weicot/entry $Model=new WeicotEntryFrom(); //该动作首先创建了一个 EntryForm 对象。然后尝试从 $_POST 搜集用户提交的数据, // 由 Yii 的 yii\web\Request::post() 方法负责搜集。如果模型被成功填充数据(比如:如果用户已经提交了 HTML 表单), // 动作将调用 validate() 去确保用户提交的是有效数据。 if($Model->load( Yii::$app->request->post()) && $Model->validate() ){ //验证 $Model 收到的数据 // 补充: 表达式 Yii::$app 代表应用实例, 它是一个全局可访问的单例。同时它也是一个服务定位器, // 能提供 request,response,db 等等特定功能的组件。 在上面的代码里就是使用 // request 组件来访问应用实例收到的 $_POST 数据。 //你的的逻辑 return $this->render('entry-confirm',['model'=>$Model]); //如果一切都准备好了,用户提交表单后,动作将会渲染一个名为 entry-confirm 的视图去确认用户输入的数据。 }else{ // 初始化显示 数据验证错误 // 如果没填表单就提交,或数据包含错误 如 email 格式不对, //entry 视图将会渲染输出, 连同表单一起输出的还有验证错误的详细信息。 return $this->render('entry',['model'=>$Model]); } } /************************第二点 数据验证 与模型 end**************************************/ /************* 第三点数据库 *************************/ public function actionCountry(){ /*** * 访问地址 http://127.0.0.1/START/yii2/backend/web/index.php?r=weicot%2Fcountry&page=2 */ $Query=Country::find(); //翻页函数 $pagination=new Pagination([ 'defaultPageSize'=>5, 'totalCount'=>$Query->count(), ]); $countries = $Query->orderBy('name') ->offset($pagination->offset) ->limit($pagination->limit) ->all(); return $this->render('index', [ 'countries' => $countries, 'pagination' => $pagination, ]); } /* * 在这个场景里,Pagination 提供了为数据结果集分页的所有功能: * 首先 Pagination 把 SELECT 的子查询 LIMIT 5 OFFSET 0 数据表示成第一页。 因此开头的五条数据会被取出并显示。 * 然后小部件 LinkPager 使用 Pagination::createUrl() 方法生成的 URL 去渲染翻页按钮。 URL 中包含必要的参数 page 才能查询不同的页面编号。 * 如果你点击按钮 “2”,将会发起一个路由为 country/index 的新请求。 Pagination 接收到 URL 中的 page 参数把当前的页码设为 2。 新的数据库请求将会以 LIMIT 5 OFFSET 5 查询并显示。 */ /************* 第三点数据库 end *************************/ }
Unknown Class – yii\base\UnknownClassException Unable to find 'backend\controllers\WeicotController' in file: D:\xmpp\htdocs\START\yii2/backend/controllers/WeicotController.php. Namespace missing?如果出现这个错误请 注意你的命名空间
namespace app\controllers; 应为 namespace backend\controllers;
模块 普通验证与表单
<?php /** * WeiCot Framework * User: ajiang * WebSite: WWW.WEICOT.COM * Date: 2017/4/17 0017 * Time: 15:36 */ namespace app\models; use Yii; use yii\base\Model; //模型类 WeicotEntryFrom 代表从用户那请求的数据 class WeicotEntryFrom extends Model{ public $name; public $email; //测试属性 public $text="weicot.com"; //默认值 public $number; //本属性 $form->field($model, 'name') //WeicotEntryFrom 类包含 name 和 email 两个公共成员, 用来储存用户输入的数据。它还包含一个名为 rules() 的方法, 用来返回数据验证规 public function rules() { return [ [['name','email'],'required'], //name 和 email 值都是必须的 ['email','email'], //email 的值必须满足email规则验证 ]; } } /* yii\base\Model 被用于普通模型类的父类并与数据表无关。 yii\db\ActiveRecord 通常是普通模型类的父类但与数据表有关联 yii\db\ActiveRecord 类其实也是继承自 yii\base\Model,增加了数据库处理 */
配置 数据库文件
// 路径 backend\config\main-local.php <?php $config = [ 'components' => [ 'request' => [ // !!! insert a secret key in the following (if it is empty) - this is required by cookie validation 'cookieValidationKey' => 'ce5Xa_UnmdAEbunrlPWVkshLVE7zlq-v', ], ], ]; $config['components']['db'] =[ //数据库配置 'class' => 'yii\db\Connection', 'dsn' => 'mysql:host=localhost;dbname=amz', 'username' => 'root', 'password' => 'root', 'charset' => 'utf8', ]; if (!YII_ENV_TEST) { // configuration adjustments for 'dev' environment $config['bootstrap'][] = 'debug'; $config['modules']['debug'] = [ 'class' => 'yii\debug\Module', ]; $config['bootstrap'][] = 'gii'; $config['modules']['gii'] = [ 'class' => 'yii\gii\Module', ]; } return $config;
模块 数据库调用示例模块
<?php namespace app\models; use yii\db\ActiveRecord; //创建一个继承自活动记录类的类 Country, 把它放在 models/Country.php 文件,去代表和读取 country 表的数据。 class Country extends ActiveRecord { /* * 这个 Country 类继承自 yii\db\ActiveRecord。你不用在里面写任何代码。 只需要像现在这样,Yii 就能根据类名去猜测对应的数据表名。 * 注意: 如果类名和数据表名不能直接对应,可以覆写 tableName() 方法去显式指定相关表名。 * 使用 Country 类可以很容易地操作 country 表数据, */ }
视图 示例一 say hellow
<?php // backend\views\weicot\say.php 本文件目录 //hello use yii\helpers\Html; ?> <?= Html::encode($message) ?> <?PHP /* 注意: 新页面和其它页面使用同样的头部和尾部是因为 yii\web\Controller::render() 方法会 自动把 say 视图执行的结果嵌入称为布局的文件中, 位于 views/layouts/main.php。
视图 示例二 表单验证与测试文件 表单
<?php //\backend\views\weicot\entry.php use yii\helpers\Html; use yii\widgets\ActiveForm; /************************第三点 数据库测试代码**************************************/ use app\models\Country; // 获取 country 表的所有行并以 name 排序 //$countries = Country::find()->orderBy('name')->all(); // 获取主键为 “US” 的行 //$country = Country::findOne('US'); // 输出 “United States” //echo $country->name; // 修改 name 为 “U.S.A.” 并在数据库中保存更改 //$country->name = 'U.S.A.'; //$country->save(); //var_dump($countries ); ?> <?php $form = ActiveForm::begin(); ?> <?= $form->field($model, 'name') ?> <?= $form->field($model, 'email') ?> <!---自定义 文本--> <?= $form->field($model, 'text')->label('自定义 text') ?> <?= $form->field($model, 'number') ?> <div class="form-group"> <?= Html::submitButton('Submit', ['class' => 'btn btn-primary']) ?> </div> <?php ActiveForm::end(); ?> <!--- 数据首先由客户端 JavaScript 脚本验证,然后才会提交给服务器通过 PHP 验证。 yii\widgets\ActiveForm 足够智能到把你在 EntryForm 模型中声明的验证规则转化成客户端 JavaScript 脚本去执行验证。 如果用户浏览器禁用了 JavaScript, 服务器端仍然会像 actionEntry() 方法里这样验证一遍数据。 这保证了任何情况下用户提交的数据都是有效的。 --->
视图 示例二 表单验证与测试文件 返回数据
<?php //\backend\views\weicot\entry-confirm.php //entry-confirm 视图简单地显示提交的 name 和 email 数据。视图文件应该保存在 views/site/entry-confirm.php。 use yii\helpers\Html; ?> <p>You have entered the following information:</p> <ul> <li><label>Name</label>: <?= Html::encode($model->name) ?></li> <li><label>Email</label>: <?= Html::encode($model->email) ?></li> </ul>
视图 示例三 数据库读取 与翻页测试文件
<?php use yii\helpers\Html; use yii\widgets\LinkPager; ?> <h1>Countries</h1> <ul> <?php foreach ($countries as $country): ?> <li> <?= Html::encode("{$country->name} ({$country->code})") ?>: <?= $country->population ?> </li> <?php endforeach; ?> </ul> <?= LinkPager::widget(['pagination' => $pagination]) ?>
附属的SQL
REATE TABLE `country` ( `code` CHAR(2) NOT NULL PRIMARY KEY, `name` CHAR(52) NOT NULL, `population` INT(11) NOT NULL DEFAULT '0' ) ENGINE=InnoDB DEFAULT CHARSET=utf8; INSERT INTO `country` VALUES ('AU','Australia',18886000); INSERT INTO `country` VALUES ('BR','Brazil',170115000); INSERT INTO `country` VALUES ('CA','Canada',1147000); INSERT INTO `country` VALUES ('CN','China',1277558000); INSERT INTO `country` VALUES ('DE','Germany',82164700); INSERT INTO `country` VALUES ('FR','France',59225700); INSERT INTO `country` VALUES ('GB','United Kingdom',59623400); INSERT INTO `country` VALUES ('IN','India',1013662000); INSERT INTO `country` VALUES ('RU','Russia',146934000); INSERT INTO `country` VALUES ('US','United States',278357000);
SELECT * FROM `movie_info` WHERE id >= ( SELECT floor( RAND() * (( SELECT MAX(id) FROM `movie_info` )-( SELECT MIN(id) FROM `movie_info` ) ) + ( SELECT MIN(id) FROM `movie_info`) ) )ORDER BY id LIMIT 1;
http://localhost/yii2test/backend/web/index.php?r=gii 代码快速生成工具
参考与引用
安装 yii2 (Yii Framework 2)框架
yiichina
转载请注明:(●--●) Hello.My Weicot » yii 2 学习笔记 基础