最新消息:觉得本站不错的话 记得收藏哦 博客内某些功能仅供测试 讨论群:135931704 快养不起小站了 各位有闲钱就打赏下把 My Email weicots#gmail.com Please replace # with @

yii 2 学习笔记 基础

PHP ajiang-tuzi 5849浏览

timg

控制器

<?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 学习笔记 基础

蜀ICP备15020253号-1