gii.md 8.45 KB
Newer Older
1 2 3
The Gii code generation tool
============================

4
Yii includes a handy tool, named Gii, that provides rapid prototyping by generating commonly used code snippets
5 6
as well as complete CRUD controllers.

Carsten Brandt committed
7

8 9 10
Installing and configuring
--------------------------

11
Gii is an official Yii extension. The preferred way to install this extension is through
12
[composer](http://getcomposer.org/download/).
Carsten Brandt committed
13

14
You can either run this command:
Carsten Brandt committed
15 16

```
17
php composer.phar require --prefer-dist yiisoft/yii2-gii "*"
Carsten Brandt committed
18 19
```

20
Or you can add this code to the require section of your `composer.json` file:
Carsten Brandt committed
21 22 23 24 25

```
"yiisoft/yii2-gii": "*"
```

26
Once the Gii extension has been installed, you enable it by adding these lines to your application configuration file:
27 28

```php
29 30 31 32 33
return [
    'bootstrap' => ['gii'],
    'modules' => [
        'gii' => 'yii\gii\Module',
        // ...
34
    ],
35 36
    // ...
];
37 38
```

Carsten Brandt committed
39 40 41 42 43 44
You can then access Gii through the following URL:

```
http://localhost/path/to/index.php?r=gii
```

45 46 47 48 49 50 51 52 53
If you have enabled pretty URLs, you may use the following URL:

```
http://localhost/path/to/index.php/gii
```


> Note: if you are accessing gii from an IP address other than localhost, access will be denied by default.
> To circumvent that default, add the allowed IP addresses to the configuration:
Alexander Makarov committed
54
>
55 56
```php
'gii' => [
57 58
    'class' => 'yii\gii\Module',
    'allowedIPs' => ['127.0.0.1', '::1', '192.168.0.*', '192.168.178.20'] // adjust this to your needs
59 60 61 62 63 64 65 66 67 68
],
```

### Basic application

In basic application template configuration structure is a bit different so Gii should be configured in
`config/web.php`:

```php
// ...
69
if (YII_ENV_DEV) {
70
    // configuration adjustments for 'dev' environment
71
    $config['bootstrap'][] = 'debug';
72
    $config['modules']['debug'] = 'yii\debug\Module';
73 74

    $config['bootstrap'][] = 'gii';
75
    $config['modules']['gii'] = 'yii\gii\Module'; // <--- here
76 77 78 79 80 81
}
```

So in order to adjust IP address you need to do it like the following:

```php
82
if (YII_ENV_DEV) {
83
    // configuration adjustments for 'dev' environment
84
    $config['bootstrap'][] = 'debug';
85
    $config['modules']['debug'] = 'yii\debug\Module';
86 87

    $config['bootstrap'][] = 'gii';
88 89 90 91
    $config['modules']['gii'] = [
        'class' => 'yii\gii\Module',
        'allowedIPs' => ['127.0.0.1', '::1', '192.168.0.*', '192.168.178.20'],
    ];
92 93
}
```
Carsten Brandt committed
94

95 96 97
How to use it
-------------

Carsten Brandt committed
98 99 100 101 102 103
When you open Gii you first see the entry page that lets you choose a generator.

![Gii entry page](images/gii-entry.png)

By default there are the following generators available:

Carsten Brandt committed
104 105
- **Model Generator** - This generator generates an ActiveRecord class for the specified database table.
- **CRUD Generator** - This generator generates a controller and views that implement CRUD (Create, Read, Update, Delete)
Carsten Brandt committed
106
  operations for the specified data model.
Carsten Brandt committed
107
- **Controller Generator** - This generator helps you to quickly generate a new controller class, one or several
Carsten Brandt committed
108
  controller actions and their corresponding views.
Carsten Brandt committed
109
- **Form Generator** - This generator generates a view script file that displays a form to collect input for the
Carsten Brandt committed
110
  specified model class.
Carsten Brandt committed
111
- **Module Generator** - This generator helps you to generate the skeleton code needed by a Yii module.
Evgeniy Tkachenko committed
112
- **Extension Generator** - This generator helps you to generate the files needed by a Yii extension.
Carsten Brandt committed
113 114 115

After choosing a generator by clicking on the "Start" button you will see a form that allows you to configure the
parameters of the generator. Fill out the form according to your needs and press the "Preview" button to get a
116 117
preview of the code that gii is about to generated. Depending on the generator you chose and whether the files
already existed or not, you will get an output similar to what you see in the following picture:
Carsten Brandt committed
118 119 120 121 122 123 124

![Gii preview](images/gii-preview.png)

Clicking on the file name you can view a preview of the code that will be generated for that file.
When the file already exists, gii also provides a diff view that shows what is different between the code that exists
and the one that will be generated. In this case you can also choose which files should be overridden and which not.

Carsten Brandt committed
125 126 127 128 129
> Tip: When using the Model Generator to update models after database change, you can copy the code from gii preview
  and merge the changes with your own code. You can use IDE features like PHPStorms
  [compare with clipboard](http://www.jetbrains.com/phpstorm/webhelp/comparing-files.html) for this,
  which allows you to merge in relevant changes and leave out others that may revert your own code.

Carsten Brandt committed
130 131 132
After you have reviewed the code and selected the files to be generated you can click the "Generate" button to create
the files. If all went fine you are done. When you see errors that gii is not able to generate the files you have to
adjust directory permissions so that your webserver is able to write to the directories and create the files.
133 134 135 136

> Note: The code generated by gii is only a template that has to be adjusted to your needs. It is there
  to help you create new things quickly but it is not something that creates ready to use code.
  We often see people using the models generated by gii without change and just extend them to adjust
137
  some parts of it. This is not how it is meant to be used. Code generated by gii may be incomplete or incorrect
138 139
  and has to be changed to fit your needs before you can use it.

Carsten Brandt committed
140

141 142 143
Creating your own templates
---------------------------

Evgeniy Tkachenko committed
144 145
Every generator has a form field `Code Template` that lets you choose a template to use for code generation.
By default gii only provides one template `default` but you can create your own templates that are adjusted to your needs.
Carsten Brandt committed
146

Evgeniy Tkachenko committed
147 148 149 150 151 152 153 154 155 156 157
If you open a folder `@app\vendor\yiisoft\yii2-gii\generators`, you'll see six folders of generators.
```
+ controller
- crud
    + default
+ extension
+ form
+ model
+ module
```
This is name generator. If you open any of these folders, you can see the folder `default`. This folder is name of the template.
Carsten Brandt committed
158

159 160 161
Copy folder `@app\vendor\yiisoft\yii2-gii\generators\crud\default` to another location, for example `@app\myTemplates\crud\`.
Now open this folder and modify any template to fit your desires, for example, add `errorSummary` in `views\_form.php`:

Evgeniy Tkachenko committed
162 163 164 165 166 167 168 169 170 171 172 173
```php
<?php
//...
<div class="<?= Inflector::camel2id(StringHelper::basename($generator->modelClass)) ?>-form">

    <?= "<?php " ?>$form = ActiveForm::begin(); ?>
    <?= "<?=" ?> $form->errorSummary($model) ?> <!-- ADDED HERE -->
    <?php foreach ($safeAttributes as $attribute) {
        echo "    <?= " . $generator->generateActiveField($attribute) . " ?>\n\n";
    } ?>
//...
```
174 175 176

Now you need to tell GII about our template.The setting is made in the config file:

Evgeniy Tkachenko committed
177
```php
178 179
// config/web.php for basic app
// ...
Evgeniy Tkachenko committed
180 181 182 183
if (YII_ENV_DEV) {    
    $config['modules']['gii'] = [
        'class' => 'yii\gii\Module',      
        'allowedIPs' => ['127.0.0.1', '::1', '192.168.0.*', '192.168.178.20'],  
184 185 186 187 188
        'generators' => [ //here
            'crud' => [ //name generator
                'class' => 'yii\gii\generators\crud\Generator', //class generator
                'templates' => [ //setting for out templates
                    'myCrud' => '@app\myTemplates\crud\default', //name template => path to template
Evgeniy Tkachenko committed
189 190 191 192 193 194 195
                ]
            ]
        ],
    ];
}
```
Open the CRUD generator and you will see that in the field `Code Template` of form appeared own template .
Carsten Brandt committed
196

Carsten Brandt committed
197 198 199
Creating your own generators
----------------------------

200 201 202 203
Open the folder of any generator and you will see two files `form.php` and `Generator.php`.
One is the form, the second is the class generator. For create your own generator, you need to create or
override these classes in any folder. Again as in the previous paragraph customize configuration:

Evgeniy Tkachenko committed
204 205 206 207 208 209 210
```php
//config/web.php for basic app
//..
if (YII_ENV_DEV) {    
    $config['modules']['gii'] = [
        'class' => 'yii\gii\Module',      
        'allowedIPs' => ['127.0.0.1', '::1', '192.168.0.*', '192.168.178.20'],  
211 212 213 214 215
         'generators' => [
            'myCrud' => [
                'class' => 'app\myTemplates\crud\Generator',
                'templates' => [
                    'my' => '@app/myTemplates/crud/default',
Evgeniy Tkachenko committed
216 217 218 219 220 221 222 223 224 225 226
                ]
            ]
        ],
    ];
}
```

```php
// @app/myTemplates/crud/Generator.php
<?php
namespace app\myTemplates\crud;
227

Evgeniy Tkachenko committed
228 229 230 231 232 233 234 235 236 237 238 239 240 241 242
class Generator extends \yii\gii\Generator
{
    public function getName()
    {
        return 'MY CRUD Generator';
    }

    public function getDescription()
    {
        return 'My crud generator. The same as a native, but he is mine...';
    }
    
    // ...
}
```
243 244

Open Gii Module and you will see a new generator appears in it.
245