


Yii Framework Official Guide Series 41 - Special Topic: Automatic Code Generation
Since version 1.1.2, Yii is equipped with a code generation tool based on the web interfaceGii. It replaces the previous command line code generation tool yiic shell
. In this part, we will explain how to use Gii and how to extend Gii to increase our development results.
1. Using Gii
Gii is implemented as a module, and it must be used in an existing Yii application. To use Gii, we first change the configuration of the application as follows:
return array( ...... 'modules'=>array( 'gii'=>array( 'class'=>'system.gii.GiiModule', 'password'=>'在这里填写密码', // 'ipFilters'=>array(...IP 列表...), // 'newFileMode'=>0666, // 'newDirMode'=>0777, ), ), );
In the above, we declared a file called The module of gii
, its class is GiiModule. We have also set a password for this module. When we access Gii, there will be an input box asking to fill in the password.
For security reasons, only local access to Gii is allowed by default. To allow other trusted machines to access it, we need to configure the GiiModule::ipFilters property as shown above.
Because Gii will generate and save new files to the application, we need to ensure that the web server process has permission to do so. The GiiModule::newFileMode and GiiModule::newDirMode properties above control how new files and directories are generated.
Note: Gii is mainly used as a development tool. Therefore, it should be installed only on development machines. Because it can generate new PHP files in the application, we should pay enough attention to security issues (such as setting passwords, IP filtering).
Gii can now be accessed through the URL http://www.php.cn/
. Here we assume that http://www.php.cn/
is the URL to access the Yii application.
If the Yii application uses a URL in the path
format (see URL management), we can access Gii through the URL http://www.php.cn/
. We may need to add the following URL rules in front of the existing URL rules:
'components'=>array( ...... 'urlManager'=>array( 'urlFormat'=>'path', 'rules'=>array( 'gii'=>'gii', 'gii/<controller:>'=>'gii/<controller>', 'gii/<controller:>/<action:>'=>'gii/<controller>/<action>', ...已有的规则... ), ), )</action></controller></action:></controller:></controller></controller:>
Gii has some default code generators. Each code generator is responsible for generating a specific type of code. For example, the controller generator generates a controller class and some action view scripts; the model generator generates an ActiveRecord class for the specified data table.
The basic process of using a generator is as follows:
Enter the generator page;
Fill in the specified code generation parameters Input box. For example, to use Module Generator to create a new module, you need to specify the module ID;
Click the
Preview
button to preview the code that will be generated. You will see a table listing the files that will be generated. You can click on any of the files to preview the code;Click the
Generate
button to generate these code files;View Code generation log.
2. Extending Gii
Although the default Gii code generators can generate very powerful code, we often want to customize them or create a new one to suit our needs tastes and needs. For example, we want the generated code to be in the style we like, or we want the code to support multiple languages. All of this is very easy to implement in Gii.
Gii can be extended in 2 ways: customizing code templates for existing code generators, and writing new code generators.
Code Generator Architecture
A code generator is stored in a directory, and the name of this directory is considered the name of the generator. The directory usually consists of the following:
model/ the model generator root folder ModelCode.php the code model used to generate code ModelGenerator.php the code generation controller views/ containing view scripts for the generator index.php the default view script templates/ containing code template sets default/ the 'default' code template set model.php the code template for generating model class code
Generator search path
Gii searches for available generators in the directory specified by the GiiModule::generatorPaths property. When customization is required, we can make the following configuration in the application's configuration file,
return array( 'modules'=>array( 'gii'=>array( 'class'=>'system.gii.GiiModule', 'generatorPaths'=>array( 'application.gii', // a path alias ), ), ), );
The above configuration tells Gii to use the alias Generators are found in the directory of application.gii
, and the default location is system.gii.generators
.
It is also possible to have generators with the same name in different search paths. In this case, the generator that appears first in the directory specified by GiiModule::generatorPaths has priority.
Customized code template
This is the easiest and most common way to extend Gii. We use an example to introduce how to customize the code template. Suppose we want to customize the code generated by the model generator.
We first create a directory named protected/gii/model/templates/compact
. The model
here means we are going to override the default model generator. templates/compact
means we will add a new code template set named compact
.
Then we add application.gii
to GiiModule::generatorPaths in the application configuration. As shown above.
现在打开 model 代码生成器页面。点击 Code Template
输入框。我们应当看到一个下拉列表,这个列表包含了我们新建的模板目录 compact
。可是,若我们选择此模板生成代码,我们将看到错误。这是因为我们还没有在新的 compact
模板集中放入任何实际的代码模板文件。
复制文件 framework/gii/generators/model/templates/default/model.php
到protected/gii/model/templates/compact
。若我们再次尝试以 compact
模板生成,我们会成功。但是,生成的代码和以 default
模板集生成的代码没什么不同。
现在是时候做点真正的工作了。打开文件 protected/gii/model/templates/compact/model.php
以编辑它。记得这个文件将作为类似一个视图文件被使用,意味着它可以包含 PHP 表达式和语句。让我们更改模板以便生成的代码里 attributeLabels()
方法使用 Yii::t()
来翻译属性标签:
public function attributeLabels() { return array( <?php foreach($labels as $name=>$label): ?> <?php echo "'$name' => Yii::t('application', '$label'),\n"; ?> <?php endforeach; ?> ); }
在每个代码模板中,我们可以访问一些预定义的变量,例如上面例子中的 $labels
。这些变量由对应的代码生成器提供。不同的代码生成器可能在他们的代码模板中提供不同的变量。请认真阅读默认代码模板中的描述。
创建新的生成器
In this sub-section, we show how to create a new generator that can generate a new widget class.
We first create a directory named protected/gii/widget
. Under this directory, we will create the following files:
WidgetGenerator.php
: contains theWidgetGenerator
controller class. This is the entry point of the widget generator.WidgetCode.php
: contains theWidgetCode
model class. This class has the main logic for code generation.views/index.php
: the view script showing the code generator input form.templates/default/widget.php
: the default code template for generating a widget class file.
Creating WidgetGenerator.php
The WidgetGenerator.php
file is extremely simple. It only contains the following code:
class WidgetGenerator extends CCodeGenerator { public $codeModel='application.gii.widget.WidgetCode'; }
In the above code, we specify that the generator will use the model class whose path alias isapplication.gii.widget.WidgetCode
. The WidgetGenerator
class extends from CCodeGenerator which implements a lot of functionalities, including the controller actions needed to coordinate the code generation process.
Creating WidgetCode.php
The WidgetCode.php
file contains the WidgetCode
model class that has the main logic for generating a widget class based on the user input. In this example, we assume that the only input we want from the user is the widget class name. Our WidgetCode
looks like the following:
class WidgetCode extends CCodeModel { public $className; public function rules() { return array_merge(parent::rules(), array( array('className', 'required'), array('className', 'match', 'pattern'=>'/^\w+$/'), )); } public function attributeLabels() { return array_merge(parent::attributeLabels(), array( 'className'=>'Widget Class Name', )); } public function prepare() { $path=Yii::getPathOfAlias('application.components.' . $this->className) . '.php'; $code=$this->render($this->templatepath.'/widget.php'); $this->files[]=new CCodeFile($path, $code); } }
The WidgetCode
class extends from CCodeModel. Like a normal model class, in this class we can declarerules()
and attributeLabels()
to validate user inputs and provide attribute labels, respectively. Note that because the base class CCodeModel already defines some rules and attribute labels, we should merge them with our new rules and labels here.
The prepare()
method prepares the code to be generated. Its main task is to prepare a list of CCodeFileobjects, each of which represent a code file being generated. In our example, we only need to create oneCCodeFile object that represents the widget class file being generated. The new widget class will be generated under the protected/components
directory. We call CCodeFile::render method to generate the actual code. This method includes the code template as a PHP script and returns the echoed content as the generated code.
Creating views/index.php
Having the controller (WidgetGenerator
) and the model (WidgetCode
), it is time for us to create the viewviews/index.php
.
<h1 id="Widget-Generator">Widget Generator</h1> <?php $form=$this->beginWidget('CCodeForm', array('model'=>$model)); ?> <p> <?php echo $form->labelEx($model,'className'); ?> <?php echo $form->textField($model,'className',array('size'=>65)); ?> </p><p> Widget class name must only contain word characters. </p> <?php echo $form->error($model,'className'); ?> <?php $this->endWidget(); ?>
In the above, we mainly display a form using the CCodeForm widget. In this form, we display the field to collect the input for the className
attribute in WidgetCode
.
When creating the form, we can exploit two nice features provided by the CCodeForm widget. One is about input tooltips. The other is about sticky inputs.
If you have tried any default code generator, you will notice that when setting focus in one input field, a nice tooltip will show up next to the field. This can easily achieved here by writing next to the input field a p
whose CSS class is tooltip
.
For some input fields, we may want to remember their last valid values so that the user can save the trouble of re-entering them each time they use the generator to generate code. An example is the input field collecting the controller base class name default controller generator. These sticky fields are initially displayed as highlighted static text. If we click on them, they will turn into input fields to take user inputs.
In order to declare an input field to be sticky, we need to do two things.
First, we need to declare a sticky
validation rule for the corresponding model attribute. For example, the default controller generator has the following rule to declare that baseClass
and actions
attributes are sticky:
public function rules() { return array_merge(parent::rules(), array( ...... array('baseClass, actions', 'sticky'), )); }
Second, we need to add a CSS class named sticky
to the container p
of the input field in the view, like the following:
<p> ...input field here... </p>
Creating templates/default/widget.php
Finally, we create the code template templates/default/widget.php
. As we described earlier, this is used like a view script that can contain PHP expressions and statements. In a code template, we can always access the $this
variable which refers to the code model object. In our example, $this
refers to the WidgetModel
object. We can thus get the user-entered widget class name via $this->className
.
<?php echo '<?php'; ?> class <?php echo $this->className; ?> extends CWidget { public function run() { } }
This concludes the creation of a new code generator. We can access this code generator immediately via the URL http://www.php.cn
以上就是Yii框架官方指南系列41——专题:自动代码生成的内容,更多相关内容请关注PHP中文网(www.php.cn)!

Thedifferencebetweenunset()andsession_destroy()isthatunset()clearsspecificsessionvariableswhilekeepingthesessionactive,whereassession_destroy()terminatestheentiresession.1)Useunset()toremovespecificsessionvariableswithoutaffectingthesession'soveralls

Stickysessionsensureuserrequestsareroutedtothesameserverforsessiondataconsistency.1)SessionIdentificationassignsuserstoserversusingcookiesorURLmodifications.2)ConsistentRoutingdirectssubsequentrequeststothesameserver.3)LoadBalancingdistributesnewuser

PHPoffersvarioussessionsavehandlers:1)Files:Default,simplebutmaybottleneckonhigh-trafficsites.2)Memcached:High-performance,idealforspeed-criticalapplications.3)Redis:SimilartoMemcached,withaddedpersistence.4)Databases:Offerscontrol,usefulforintegrati

Session in PHP is a mechanism for saving user data on the server side to maintain state between multiple requests. Specifically, 1) the session is started by the session_start() function, and data is stored and read through the $_SESSION super global array; 2) the session data is stored in the server's temporary files by default, but can be optimized through database or memory storage; 3) the session can be used to realize user login status tracking and shopping cart management functions; 4) Pay attention to the secure transmission and performance optimization of the session to ensure the security and efficiency of the application.

PHPsessionsstartwithsession_start(),whichgeneratesauniqueIDandcreatesaserverfile;theypersistacrossrequestsandcanbemanuallyendedwithsession_destroy().1)Sessionsbeginwhensession_start()iscalled,creatingauniqueIDandserverfile.2)Theycontinueasdataisloade

Absolute session timeout starts at the time of session creation, while an idle session timeout starts at the time of user's no operation. Absolute session timeout is suitable for scenarios where strict control of the session life cycle is required, such as financial applications; idle session timeout is suitable for applications that want users to keep their session active for a long time, such as social media.

The server session failure can be solved through the following steps: 1. Check the server configuration to ensure that the session is set correctly. 2. Verify client cookies, confirm that the browser supports it and send it correctly. 3. Check session storage services, such as Redis, to ensure that they are running normally. 4. Review the application code to ensure the correct session logic. Through these steps, conversation problems can be effectively diagnosed and repaired and user experience can be improved.

session_start()iscrucialinPHPformanagingusersessions.1)Itinitiatesanewsessionifnoneexists,2)resumesanexistingsession,and3)setsasessioncookieforcontinuityacrossrequests,enablingapplicationslikeuserauthenticationandpersonalizedcontent.


Hot AI Tools

Undresser.AI Undress
AI-powered app for creating realistic nude photos

AI Clothes Remover
Online AI tool for removing clothes from photos.

Undress AI Tool
Undress images for free

Clothoff.io
AI clothes remover

Video Face Swap
Swap faces in any video effortlessly with our completely free AI face swap tool!

Hot Article

Hot Tools

Notepad++7.3.1
Easy-to-use and free code editor

VSCode Windows 64-bit Download
A free and powerful IDE editor launched by Microsoft

Zend Studio 13.0.1
Powerful PHP integrated development environment

SecLists
SecLists is the ultimate security tester's companion. It is a collection of various types of lists that are frequently used during security assessments, all in one place. SecLists helps make security testing more efficient and productive by conveniently providing all the lists a security tester might need. List types include usernames, passwords, URLs, fuzzing payloads, sensitive data patterns, web shells, and more. The tester can simply pull this repository onto a new test machine and he will have access to every type of list he needs.

ZendStudio 13.5.1 Mac
Powerful PHP integrated development environment
