4.yiic shell
此功能是最常用的功能。他可以帮助我们创建大部分的程序结构。具体实现的内容需要我们自己来实现。
如何使用yiic shell太和其他的命令有点不同。因为他是依赖与一个web应用的。
通过如下命令进入指定web应用的shell模式
/www/yii_dev/yii/framework# php yiic shell ../../testwebap/index.php
例如上述,进入 testwebap的命令模式,注意指定入口文件,一般是index.php
/www/yii_dev/yii/framework# php yiic shell ../../testwebap/index.php
Yii Interactive Tool v1.1 (based on Yii v1.1.8)
Please type 'help' for help. Type 'exit' to quit.
>>
exit退出
help列出帮助信息
/*
>> help
At the prompt, you may enter a PHP statement or one of the following commands:
- controller
- crud
- form
- help
- model
- module
Type 'help <command-name>' for details about a command.
To expand the above command list, place your command class files
under 'protected/commands/shell', or a directory specified
by the 'YIIC_SHELL_COMMAND_PATH' environment variable. The command class
must extend from CConsoleCommand.
*/
shell模式提供了controller,crud,form,help,model,module几个命令。
了解mvc的,应该不用说了。
如果我们要查看具体命令的使用方法可以
help 命令
来进行查看。
上面说要确保'protected/commands/shell'有必要的内容,一般用yiic webapp创建的应用都有。这个是是哟给你yiic shel模式必备的。你也可以对命令进行扩展。
help module
>> help module
USAGE
module <module-ID>
DESCRIPTION
This command generates an application module.
PARAMETERS
* module-ID: required, module ID. It is case-sensitive.
创建一个模块
例如
>> module testmod
mkdir /www/yii_dev/testwebap/protected/modules
mkdir /www/yii_dev/testwebap/protected/modules/testmod
mkdir /www/yii_dev/testwebap/protected/modules/testmod/models
mkdir /www/yii_dev/testwebap/protected/modules/testmod/components
mkdir /www/yii_dev/testwebap/protected/modules/testmod/controllers
generate controllers/DefaultController.php
mkdir /www/yii_dev/testwebap/protected/modules/testmod/views
mkdir /www/yii_dev/testwebap/protected/modules/testmod/views/default
generate views/default/index.php
mkdir /www/yii_dev/testwebap/protected/modules/testmod/views/layouts
mkdir /www/yii_dev/testwebap/protected/modules/testmod/messages
generate TestmodModule.php
Module 'testmod' has been created under the following folder:
/www/yii_dev/testwebap/protected/modules/testmod
You may access it in the browser using the following URL:
http://hostname/path/to/index.php?r=testmod
Note, the module needs to be installed first by adding 'testmod'
to the 'modules' property in the application configuration.
>>
生成如下代码
├── models
│ ├── ContactForm.php
│ └── LoginForm.php
├── modules
│ └── testmod
│ ├── components
│ ├── controllers
│ ├── messages
│ ├── models
│ ├── TestmodModule.php
│ └── views
├── runtime
├── tests
我们生成的testwebap项目默认不是modules,controller模式的。这里需要修改配置文件才可以使用
在配置文件中修改如下
'modules'=>array('testmod',),
通过
http://www.localyii.com/testwebap/index.php?r=testmod
就可以访问了
help controller
>> help controller
USAGE
controller <controller-ID> [action-ID] ...
DESCRIPTION
This command generates a controller and views associated with
the specified actions.
PARAMETERS
* controller-ID: required, controller ID, e.g., 'post'.
If the controller should be located under a subdirectory,
please specify the controller ID as 'path/to/ControllerID',
e.g., 'admin/user'.
If the controller belongs to a module, please specify
the controller ID as 'ModuleID/ControllerID' or
'ModuleID/path/to/Controller' (assuming the controller is
under a subdirectory of that module).
* action-ID: optional, action ID. You may supply one or several
action IDs. A default 'index' action will always be generated.
EXAMPLES
* Generates the 'post' controller:
controller post
* Generates the 'post' controller with additional actions 'contact'
and 'about':
controller post contact about
* Generates the 'post' controller which should be located under
the 'admin' subdirectory of the base controller path:
controller admin/post
* Generates the 'post' controller which should belong to
the 'admin' module:
controller admin/post
NOTE: in the last two examples, the commands are the same, but
the generated controller file is located under different directories.
Yii is able to detect whether 'admin' refers to a module or a subdirectory.
controller 控制器名称 action名称列表
控制器名称是必须的,action名称是可以选的,也可以是多个。没有则默认有一个index
如果要为指定的应用模块创建一个控制器需要指定模块名称路径。例如
controller admin/post
位置admin模块创建post控制器类
创建test控制器,action有action1,action2,action3
>> controller test action1 action2 action3
generate TestController.php
mkdir /www/yii_dev/testwebap/protected/views/test
generate action1.php
generate action2.php
generate action3.php
generate index.php
Controller 'test' has been created in the following file:
/www/yii_dev/testwebap/protected/controllers/TestController.php
You may access it in the browser using the following URL:
http://hostname/path/to/index.php?r=test
>>
├── controllers
│ ├── SiteController.php
│ └── TestController.php
在项目testwebap中多了一个
TestController.php的文件
文件内容
<?php
class TestController extends Controller
{
public function actionAction1()
{
$this->render('action1');
}
public function actionAction2()
{
$this->render('action2');
}
public function actionAction3()
{
$this->render('action3');
}
public function actionIndex()
{
$this->render('index');
}
// -----------------------------------------------------------
// Uncomment the following methods and override them if needed
/*
public function filters()
{
// return the filter configuration for this controller, e.g.:
return array(
'inlineFilterName',
array(
'class'=>'path.to.FilterClass',
'propertyName'=>'propertyValue',
),
);
}
public function actions()
{
// return external action classes, e.g.:
return array(
'action1'=>'path.to.ActionClass',
'action2'=>array(
'class'=>'path.to.AnotherActionClass',
'propertyName'=>'propertyValue',
),
);
}
*/
}
view下也自动为我们创建了相关页面
│ ├── layouts
│ │ ├── column1.php
│ │ ├── column2.php
│ │ ├── main.php
│ │ └── main.php~
│ ├── site
│ │ ├── contact.php
│ │ ├── error.php
│ │ ├── index.php
│ │ ├── login.php
│ │ └── pages
│ └── test
│ ├── action1.php
│ ├── action2.php
│ ├── action3.php
│ └── index.php
<?php
$this->breadcrumbs=array(
'Test'=>array('test/index'),
'Action1',
);?>
<h1><?php echo $this->id . '/' . $this->action->id; ?></h1>
<p>You may change the content of this page by modifying the file <tt><?php echo __FILE__; ?></tt>.</p>
具体内容就需要自己来修改了。
/*
'db'=>array(
'connectionString' => 'sqlite:'.dirname(__FILE__).'/../data/testdrive.db',
),
*/
// uncomment the following to use a MySQL database
'db'=>array(
'connectionString' => 'mysql:host=localhost;dbname=testdrive',
'emulatePrepare' => true,
'username' => 'root',
'password' => '',
'charset' => 'utf8',
),
然后创建在mysql中创建
CREATE TABLE `tbl_user` ( `id` int(11) NOT NULL AUTO_INCREMENT, `username` varchar(128) NOT NULL, `password` varchar(128) NOT NULL, `email` varchar(128) DEFAULT NULL, PRIMARY KEY (`id`) )tbl_user数据表
>> help model
USAGE
model <class-name> [table-name]
DESCRIPTION
This command generates a model class with the specified class name.
PARAMETERS
* class-name: required, model class name. By default, the generated
model class file will be placed under the directory aliased as
'application.models'. To override this default, specify the class
name in terms of a path alias, e.g., 'application.somewhere.ClassName'.
If the model class belongs to a module, it should be specified
as 'ModuleID.models.ClassName'.
If the class name ends with '*', then a model class will be generated
for EVERY table in the database.
If the class name contains a regular expression deliminated by slashes,
then a model class will be generated for those tables whose name
matches the regular expression. If the regular expression contains
sub-patterns, the first sub-pattern will be used to generate the model
class name.
* table-name: optional, the associated database table name. If not given,
it is assumed to be the model class name.
Note, when the class name ends with '*', this parameter will be
ignored.
EXAMPLES
* Generates the Post model:
model Post
* Generates the Post model which is associated with table 'posts':
model Post posts
* Generates the Post model which should belong to module 'admin':
model admin.models.Post
* Generates a model class for every table in the current database:
model *
* Same as above, but the model class files should be generated
under 'protected/models2':
model application.models2.*
* Generates a model class for every table whose name is prefixed
with 'tbl_' in the current database. The model class will not
contain the table prefix.
model /^tbl_(.*)$/
* Same as above, but the model class files should be generated
under 'protected/models2':
model application.models2./^tbl_(.*)$/
>>
>> model User tbl_user
generate models/User.php
generate fixtures/tbl_user.php
generate unit/UserTest.php
The following model classes are successfully generated:
User
If you have a 'db' database connection, you can test these models now with:
$model=User::model()->find();
print_r($model);
├── models
│ ├── ContactForm.php
│ ├── LoginForm.php
│ └── User.php
├── modules
│ └── testmod
│ ├── components
<?php
/**
* This is the model class for table "tbl_user".
*
* The followings are the available columns in table 'tbl_user':
* @property integer $id
* @property string $username
* @property string $password
* @property string $email
*/
class User extends CActiveRecord
{
/**
* Returns the static model of the specified AR class.
* @return User the static model class
*/
public static function model($className=__CLASS__)
{
return parent::model($className);
}
/**
* @return string the associated database table name
*/
public function tableName()
{
return 'tbl_user';
}
/**
* @return array validation rules for model attributes.
*/
public function rules()
{
// NOTE: you should only define rules for those attributes that
// will receive user inputs.
return array(
array('username, password', 'required'),
array('username, password, email', 'length', 'max'=>128),
// The following rule is used by search().
// Please remove those attributes that should not be searched.
array('id, username, password, email', 'safe', 'on'=>'search'),
);
}
/**
* @return array relational rules.
*/
public function relations()
{
// NOTE: you may need to adjust the relation name and the related
// class name for the relations automatically generated below.
return array(
);
}
/**
* @return array customized attribute labels (name=>label)
*/
public function attributeLabels()
{
return array(
'id' => 'Id',
'username' => 'Username',
'password' => 'Password',
'email' => 'Email',
);
}
/**
* Retrieves a list of models based on the current search/filter conditions.
* @return CActiveDataProvider the data provider that can return the models based on the search/filter conditions.
*/
public function search()
{
// Warning: Please modify the following code to remove attributes that
// should not be searched.
$criteria=new CDbCriteria;
$criteria->compare('id',$this->id);
$criteria->compare('username',$this->username,true);
$criteria->compare('password',$this->password,true);
$criteria->compare('email',$this->email,true);
return new CActiveDataProvider('User', array(
'criteria'=>$criteria,
));
}
}
│ ├── bootstrap.php
│ ├── fixtures
│ │ └── tbl_user.php
│ ├── functional
│ │ └── SiteTest.php
│ ├── phpunit.xml
│ ├── report
│ ├── unit
│ │ └── UserTest.php
│ └── WebTestCase.php
>> help crud
USAGE
crud <model-class> [controller-ID] ...
DESCRIPTION
This command generates a controller and views that accomplish
CRUD operations for the specified data model.
PARAMETERS
* model-class: required, the name of the data model class. This can
also be specified as a path alias (e.g. application.models.Post).
If the model class belongs to a module, it should be specified
as 'ModuleID.models.ClassName'.
* controller-ID: optional, the controller ID (e.g. 'post').
If this is not specified, the model class name will be used
as the controller ID. In this case, if the model belongs to
a module, the controller will also be created under the same
module.
If the controller should be located under a subdirectory,
please specify the controller ID as 'path/to/ControllerID'
(e.g. 'admin/user').
If the controller belongs to a module (different from the module
that the model belongs to), please specify the controller ID
as 'ModuleID/ControllerID' or 'ModuleID/path/to/Controller'.
EXAMPLES
* Generates CRUD for the Post model:
crud Post
* Generates CRUD for the Post model which belongs to module 'admin':
crud admin.models.Post
* Generates CRUD for the Post model. The generated controller should
belong to module 'admin', but not the model class:
crud Post admin/post
>>
generate UserController.php
generate UserTest.php
mkdir /www/yii_dev/testwebap/protected/views/user
generate create.php
generate update.php
generate index.php
generate view.php
generate admin.php
generate _form.php
generate _view.php
generate _search.php
Crud 'user' has been successfully created. You may access it via:
http://hostname/path/to/index.php?r=user
>>
>> help form
USAGE
form <model-class> <view-name> [scenario]
DESCRIPTION
This command generates a form view that can be used to collect inputs
for the specified model.
PARAMETERS
* model-class: required, model class. This can be either the name of
the model class (e.g. 'ContactForm') or the path alias of the model
class file (e.g. 'application.models.ContactForm'). The former can
be used only if the class can be autoloaded.
* view-name: required, the name of the view to be generated. This should
be the path alias of the view script (e.g. 'application.views.site.contact').
* scenario: optional, the name of the scenario in which the model is used
(e.g. 'update', 'login'). This determines which model attributes the
generated form view will be used to collect user inputs for. If this
is not provided, the scenario will be assumed to be '' (empty string).
EXAMPLES
* Generates the view script for the 'ContactForm' model:
form ContactForm application.views.site.contact
>>
为User创建form
userformtest
>> form User application.views.user.userformtest
generate userformtest.php
The following form view has been successfully created:
/www/yii_dev/testwebap/protected/views/user/userformtest.php
You may use the following code in your controller action:
public function actionUser()
{
$model=new User;
// uncomment the following code to enable ajax-based validation
/*
if(isset($_POST['ajax']) && $_POST['ajax']==='user-form')
{
echo CActiveForm::validate($model);
Yii::app()->end();
}
*/
if(isset($_POST['User']))
{
$model->attributes=$_POST['User'];
if($model->validate())
{
// form inputs are valid, do something here
return;
}
}
$this->render('userformtest',array('model'=>$model));
}
>>
├── data
│ ├── schema.mysql.sql
│ ├── schema.sqlite.sql
│ └── testdrive.db
├── extensions
├── messages
│ ├── config.php
│ └── zh_cn
│ ├── login_message.php
│ └── login_message.php~
├── migrations
├── models
│ ├── ContactForm.php
│ ├── LoginForm.php
│ └── User.php
├── modules
│ └── testmod
│ ├── components
│ ├── controllers
│ ├── messages
│ ├── models
│ ├── TestmodModule.php
│ └── views
├── runtime
│ └── application.log
├── tests
│ ├── bootstrap.php
│ ├── fixtures
│ │ └── tbl_user.php
│ ├── functional
│ │ ├── SiteTest.php
│ │ └── UserTest.php
│ ├── phpunit.xml
│ ├── report
│ ├── unit
│ │ └── UserTest.php
│ └── WebTestCase.php
├── views
│ ├── layouts
│ │ ├── column1.php
│ │ ├── column2.php
│ │ ├── main.php
│ │ └── main.php~
│ ├── site
│ │ ├── contact.php
│ │ ├── error.php
│ │ ├── index.php
│ │ ├── login.php
│ │ └── pages
│ ├── test
│ │ ├── action1.php
│ │ ├── action2.php
│ │ ├── action3.php
│ │ └── index.php
│ └── user
│ ├── admin.php
│ ├── create.php
│ ├── _form.php
│ ├── index.php
│ ├── _search.php
│ ├── update.php
│ ├── userformtest.php
│ ├── _view.php
│ └── view.php
<div class="form">
<?php $form=$this->beginWidget('CActiveForm', array(
'id'=>'user-form',
'enableAjaxValidation'=>false,
)); ?>
<p class="note">Fields with <span class="required">*</span> are required.</p>
<?php echo $form->errorSummary($model); ?>
<div class="row">
<?php echo $form->labelEx($model,'username'); ?>
<?php echo $form->textField($model,'username'); ?>
<?php echo $form->error($model,'username'); ?>
</div>
<div class="row">
<?php echo $form->labelEx($model,'password'); ?>
<?php echo $form->textField($model,'password'); ?>
<?php echo $form->error($model,'password'); ?>
</div>
<div class="row">
<?php echo $form->labelEx($model,'email'); ?>
<?php echo $form->textField($model,'email'); ?>
<?php echo $form->error($model,'email'); ?>
</div>
<div class="row buttons">
<?php echo CHtml::submitButton('Submit'); ?>
</div>
<?php $this->endWidget(); ?>
</div><!-- form -->
大概用法就是这样。 接下来就是详细的了解yii生成项目的结构和设计思路。