YII2

Gulpfile + Vue + YII2

Устанавливаем в корне

vue create frontend


Устанавливаем Gulp

npm install --global gulp-cli


Устанавливаем необходимые модули

npm install gulp-concat-css gulp-concat gulp-uglify gulp-sass gulp-autoprefixer gulp-clean-css --save-dev


Создаем в корне Gulpfile.js

const gulp = require('gulp');

const concat = require('gulp-concat');

const uglify = require('gulp-uglify');

const sass = require('gulp-sass');

const autoprefixer = require('gulp-autoprefixer');

const cleanCSS = require('gulp-clean-css');

const concatCss = require('gulp-concat-css');


gulp.task('scripts', function() {

    return gulp.src('frontend/dist/js/*.js')

        .pipe(concat('app.js'))

        .pipe(uglify())

        .pipe(gulp.dest('web/js'));

});


// gulp.task('styles', function() {

//     return gulp.src('frontend/dist/scss/*.scss')

//         .pipe(sass().on('error', sass.logError))

//         .pipe(autoprefixer())

//         .pipe(cleanCSS())

//         .pipe(gulp.dest('web/css'));

// });


gulp.task('css', function () {

    return gulp.src('frontend/dist/**/*.css')

        .pipe(concatCss("styles/bundle.css"))

        .pipe(gulp.dest('web/css'));

});

gulp.task('default', gulp.series('scripts', 'css'));


package.json

{

  "name": "your-project-name",

  "version": "1.0.0",

  "description": "Your project description",

  "main": "Gulp.js",

  "scripts": {

    "build": "gulp"

  },

  "devDependencies": {

    "gulp": "^4.0.2",

    "gulp-autoprefixer": "^8.0.0",

    "gulp-clean-css": "^4.3.0",

    "gulp-concat": "^2.6.1",

    "gulp-concat-css": "^3.1.0",

    "gulp-sass": "^5.1.0",

    "gulp-uglify": "^3.0.2"

  }

}


index.php

<!doctype html>

<html lang="en">

<head>

    <meta charset="UTF-8">

    <meta name="viewport"

          content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">

    <meta http-equiv="X-UA-Compatible" content="ie=edge">

    <title>Document</title>

</head>

<body>

<div id="app"></div>

</body>

</html>

Настройка почты:

'mailer' => [

               'class' => \yii\symfonymailer\Mailer::class,

              'viewPath' => '@app/mail',

              'transport' => [

              'class' => 'Swift_SmtpTransport',

              'host' => 'host',

              'username' => 'username',

              'password' => 'password',

              'port' => 'port',

              'encryption' => 'tls',

              'dsn'=> 'smtp://username:password@host:port',

],

'useFileTransport' => false,

],

    public function actionIndex()

    {

        Yii::$app->mailer->compose()

            ->setFrom('from@domain.com')

            ->setTo('to@domain.com')

            ->setSubject('Тема сообщения')

            ->setTextBody('Текст сообщения')

            ->setHtmlBody('<b>текст сообщения в формате HTML</b>')

            ->send();

        return 'Hello, world!';

}

Установка:

composer create-project --prefer-dist yiisoft/yii2-app-basic basic


Проверка требований:

php requirements.php


Структура:

basic/

                                                     корневой каталог приложения

          composer.json

                                                     используется Composer'ом, содержит описание

                                                     приложения

          config/

                                                     конфигурационные файлы

                     console.php

                                                     конфигурация консольного приложения

                     web.php

                                                     конфигурация Web приложения

          commands/

                                                     содержит классы консольных команд

          controllers/

                                                     контроллеры

          models/

                                                     модели

          runtime/

                                                     файлы, которые генерирует Yii во время выполнения

                                                     приложения (логи, кэш и т.п.)

          vendor/

                                                     содержит пакеты Composer'а и, собственно, сам

                                                     фреймворк Yii

          views/

                                                     виды приложения

          web/

                                                     корневая директория Web приложения. Содержит файлы,

                                                     доступные через Web

          assets/

                                                     скрипты, используемые приложением (js, css)

          index.php

                                                     точка входа в приложение Yii. С него начинается

                                                     выполнение приложения

          yii

                                                     скрипт выполнения консольного приложения Yii


Жизненный цикл пользовательского запроса

1. Пользователь обращается к точке входа web/index.php.

2. Скрипт загружает конфигурацию configuration и создает экзем-

пляр приложения для дальнейшей обработки запроса.

3. Приложение определяет маршрут запроса при помощи компонента

приложения запрос.

4. Приложение создает экземпляр контроллера для выполнения за-

проса.

5. Контроллер, в свою очередь, создает действие и накладывает на

него фильтры.

6. Если хотя бы один фильтр дает сбой, выполнение приложения оста-

навливается.

7. Если все фильтры пройдены - приложение выполняется.

8. Действие загружает модель данных. Вероятнее всего из базы дан-

ных.

9. Действие генерирует вид, отображая в нем данные (в т.ч. и полу-

ченные из модели).

10. Сгенерированный вид приложения передается как компонент от-

вет.


Доступ к Gii:

http://localhost/index.php?r=gii


$config['modules']['gii'] = [

        'class' => 'yii\gii\Module',

        // uncomment the following to add your IP if you are not connecting from localhost.

        'allowedIPs' => ['127.0.0.1', '::1', '192.168.50.88', '*'],

    ];


Создание Controller через консоль

php yii gii/controller  --controllerClass="app\controllers\TestController"


Отобразить страницу контроллера:

http://localhost/index.php?r=test/index


Get запрос:

public function actionView($id, $version = null) { // ... }

url: https://hostname/index.php?r=post/view&id=123&version=2


Post запрос:

Действие по умолчанию:

namespace app\controllers; use yii\web\Controller; 

class SiteController extends Controller { 

public $defaultAction = 'home'; 

public function actionHome() 

{ return $this->render('home'); } }


$request = Yii::$app->request; $

get = $request->get(); 

// эквивалентно: $get = $_GET; 

$id = $request->get('id'); 

// эквивалентно: $id = isset($_GET['id']) ? $_GET['id'] : null; 

$id = $request->get('id', 1); 

// эквивалентно: $id = isset($_GET['id']) ? $_GET['id'] : 1; 

$post = $request->post(); 

// эквивалентно: $post = $_POST; 

$name = $request->post('name'); 

// эквивалентно: $name = isset($_POST['name']) ? $_POST['name'] : null; 

$name = $request->post('name', ''); 

// эквивалентно: $name = isset($_POST['name']) ? $_POST['name'] : '';



// возвращает все параметры 

$params = $request->bodyParams; 

// возвращает параметр "id" 

$param = $request→getBodyParam('id');


Методы запроса

$request = Yii::$app->request; 

if ($request->isAjax) { /* текущий запрос является AJAX запросом */ } 

if ($request->isGet) { /* текущий запрос является GET запросом */ } 

if ($request->isPost) { /* текущий запрос является POST запросом */ } 

if ($request->isPut) { /* текущий запрос является PUT запросом */ }



HTTP заголовки

// переменная $headers является объектом yii\web\HeaderCollection 

$headers = Yii::$app->request->headers; 

// возвращает значения заголовка Accept 

$accept = $headers->get('Accept'); 

if ($headers->has('User-Agent')) { /* в запросе есть заголовок User-Agent */ }


Информация о клиенте 

$userHost = Yii::$app->request->userHost;

$userIP = Yii::$app→request→userIP;


Модель

Создание миграций

php yii migrate/create create_news_table

php yii migrate/

php yii gii/model --modelClass="Article" —tableName="article"

$model = new \app\models\ContactForm; 

// модель заполнения атрибутов данными, вводимыми пользователем 

$model->attributes = \Yii::$app->request->post('ContactForm'); 

if ($obj->load(Yii::$app->request->post()) && $obj->validate()) {

            return "OK";

        } else {

            $errors = $obj->errors;

            return "errors: " . print_r($errors, true);

        }


<?php $form = ActiveForm::begin(); ?>

<?= $form->field($obj, 'title') ?>

<?= $form->field($obj, 'body') ?>

<?= $form->field($obj, 'user_id') ?>

<?= Html::submitButton('Login') ?>

<?php ActiveForm::end(); ?>


Чтобы показать обычный текст, сначала кодируйте его с помощью yii\helpers\Html::encode(). 

Чтобы показать HTML содержимое, используйте yii\helpers\HtmlPurifier для того, чтобы отфильтровать потенциально опасное содержимое. 


Признаки "плохого кода"

Кратко рассмотрим 12 признаков, когда код можно улучшить: 1. Duplicated Code  — иногда повторяющийся код не всегда несет в себе пользу. Выде...