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 для того, чтобы отфильтровать потенциально опасное содержимое.