Scopes в Yii2

В Yii первой версии были scope, что очень улучшало практику написания кода. В Yii2 тоже есть скопы, но они называются немного по-другому.

Итак, как сделать scope в Yii2.

Создаем класс UserQuery в common\models (если шаблон advanced)

UserQuery.php

<?php

namespace common\models;

use yii\db\ActiveQuery;

class UserQuery extends ActiveQuery
{
    public function active()
    {
        return $this->andWhere(['status' => 10]);
    }
}

В модели User добавляем код

public static function find()
{
    return new UserQuery(get_called_class());
}

Пример использования:

User::find()->active()->all(); //выводим всех пользователей с полем status = 10

Task::findOne(123)->getUsers()->active()->all(); //пример с реляциями

Более подробно смотрите в документации https://www.yiiframework.com/doc/guide/2.0/en/db-active-record

Внешний вид уведомлений Xubuntu

При установке i3 и подобных оконных менеджеров, где устанавливается dmenu внешний вид уведомлений становится мягко говоря не очень красивым. Темы из настроек Xfce не меняются, иконки в уведомлении нет.

Причиной тому служит dunst, который выводит все OSD уведомления.

Все решается очень просто - нужно удалить пакет dunst

sudo apt-get purge dunst

Self hosted

Облачные сервисы уже очень тесно вошли в нашу жизнь. Мы не можем контролировать свои данные - сервис могут взломать, сервис может потерять или слить кому-нибудь ваши данные, или использовать в своих целях.

Наткнулся на проект De-google-ify Internet и поделиться некоторым софтом, который я использую на своем сервере.

Мои аналоги:

Google read (который закрыли) - Tiny Tiny RSS

VPN (любой сервис) - OpenVPN

Github, Bitbucket - Gitlab, Gogs, Gitea, форк Gogs

Pocket - Wallabag

Evernote - TURTL. Все данные хранятся в зашифрованном виде.

Trello - Taiga

Деплой Yii2 с Capistrano

Очень удобно заливать проект одной командой, не заливая по FTP кучу файлов. К тому же, можно автоматически ставить новые пакеты через Composer и выполнять последние миграции.

Данная методика позаимствована с Ruby On Rails. Сам Capistrano написан на Ruby, но это не мешает использовать его для других языков.

Устанавливаем сам Capistrano:

gem install capistrano

Инициализация Capistrano:

cap install

После данной команды в папке проекта создадутся папки и файлы: config и Capfile.

Все нужные Вам настройки находятся в папке config.

config/deploy.rb содержит основные настройки деплоя

Пример deploy.rb

lock '3.8.1'

# Название приложения
set :application, 'app_name'
set :repo_url, 'git@your-host.com/repo.git'

# Директория, где на сервере будет располагаться Ваше приложение
set :deploy_to, '/var/www/app_name.com'

# Система управления версиями - git
set :scm, :git

# Файлы, которых не должно быть в репозитории. Например, конфиг. 
# Я сделал main-local.php, где хранятся настройки подключения к базе данных. 
# Необходимые файлы и папки надо создать в папке с  проектом на сервере в папке shared
append :linked_files, 'common/config/main-local.php'

# Папки, которых не должно быть в репозитории. Здесь всякие временные файлы и загрузки
append :linked_dirs, 'api/runtime', 'backend/runtime', 'frontend/runtime', 'frontend/web/uploads', 'vendor', 'console/runtime'

# Задания после окончания деплоя. Устанавливаем новые пакеты и применяем миграции

namespace :deploy do
    desc 'composer install'
    task :composer_install do
        on roles(:web) do
            within release_path do
                execute "cd #{release_path} && composer install"
            end
        end
    end

    desc 'apply migrations'
    task :migrate do
        on roles(:web) do
            within release_path do
                execute "cd #{release_path} && php yii migrate --interactive=0"
            end
        end
    end

    after :updated, 'deploy:composer_install'
    after :updated, 'deploy:migrate'

end

Далее нам нужно настроить сервера, на которые будет производиться деплой. По умолчанию представляется два файла в config/deploy: production.rb и staging.rb

В каждом файле можно настроить IP сервера, пользователя, под которым заходить на сервер, номер порта, роли сервера, и т.д.

Важно! При запуске миграций может вылезти такая ошибка:

Could not open input file: yii

Это может быть из-за того, что в стандартном репозитории Yii нет файла под названием yii. Этот файл появляется только после локальной инициализации фреймворка. Поскольку на каждый релиз мы заново тянем все файлы из репозитория, соответственно этого файла и не будет. Поэтому добавляем скрипт инициализации после установки пакетов через Composer, добавив в composer.json строки

"scripts": {
    "post-install-cmd": "php init --env=Production --overwrite=n"
}

Деплой:

cap production deploy для production и cap staging deploy для staging

На этом всё. Хорошего деплоя! ;)

Клиентская настройка ssh

Порой бывает нужно зайти на сервер под другим пользователем, по другому порту, или по другому IP (например, если используется Cloudflare). Каждый раз в консоли не удобно писать кастомный порт или имя пользователя. А если еще и IP адрес другой, постоянно надо искать и копировать IP.

На помощь приходит файл конфигурации ssh для клиента, который находится по адресу ~/.ssh/config.

По умолчанию в поставке openssh нет такого файла, поэтому первым делом нужно его создать:

touch ~/.ssh/config

Структура у файла следующая:

Host название_хоста_1
  SSH_OPTION_1 custom_value
  SSH_OPTION_2 custom_value

Host название_хоста_2
  SSH_OPTION custom_value

Host *
  ANOTHER_OPTION custom_value

Что это все означает - в начале используется имя хоста. Задать можно любое значение и писать в консоли ssh название_хоста. Ниже указываются опции, как имя пользователя, порт, адрес хоста.

Пример:

Host dev.myhost
  HostName dev.myhost.com
  Port 4567
  User custom_user

Теперь, чтобы не указывать все флаги вручную, можно просто написать в консоли ssh dev.myhost и мы подключимся к dev.myhost.com по порту 4567 и под пользователем custom_user.

Доступ к SMB без логина и пароля

Не все программы поддерживают гостевой доступ через SMB (Samba).

Чтобы зайти как гость, нужно ввести логин и пароль “Guest”.

Отладка почты

Чтобы каждый раз не отправлять письма при тестировании почты можно использовать локальный сервер и клиент, на помощь приходит очень простой гем, который называется mailcatcher.

Устанавливается просто:

gem install mailcatcher

После чего запускаем в коносли

mailcatcher

Mailcatcher запускается как демон, и слушает порт 1025 для отправки почты (SMTP прописывается в Вашем приложении localhost:1025 без авторизации).

Просматривать отправленные письма можно через веб-интерфейс - http://localhost:1080

Несколько версий PostgreSQL

Иногда бывает нужно держать на одной машине несколько версий PostgreSQL

Можно подключаться к разным версиям следующим образом:

# cd /usr/lib/postgresql/9.4/bin

# sudo -u postgres ./psql -p 5433

Обязательно нужно запускать psql той же версии, что и СУБД. В данном случае мы подключаемся к порту 5433, который слушает инстанс другой версии PostgreSQL

Мой конфиг gulp

Оставлю конфиг здесь, чтобы не искать каждый раз

Устанавливается Gulp так:

npm install -g gulp gulp-uglify gulp-concat gulp-clean-css

gulpfile.js

var gulp = require('gulp'),
    uglify = require('gulp-uglify'),
    concat = require('gulp-concat'),
    cleanCss = require('gulp-clean-css');

var javascripts = [
  'js/script1.js',
  'js/script2.js'

];

var css = [
  'css/style1.css',
  'css/style2.css'
];

gulp.task('minify', function () {
    gulp.src(javascripts)
        .pipe(uglify().on('error', function(e) {
          console.log(e);
        }))
        // .pipe(rename({ suffix: '.min' }))
        .pipe(concat('script.min.js'))
        .pipe(gulp.dest('themes/default/assets/site/js'));
});

gulp.task('minifyCss', function () {
    gulp.src(css)
        .pipe(cleanCss().on('error', function(e) {
          console.log(e);
        }))

        .pipe(concat('style.min.css'))
        .pipe(gulp.dest('themes/default/assets/site/css'));
});

gulp.task('watch', function() {
  gulp.watch(javascripts, ['minify']);
  gulp.watch(css, ['minifyCss']);
});

Можно запустить gulp и сохранять файлы, gulp сам выполнит нужные задачи

gulp watch

или сделать только минификацию и конкатенацию js

gulp minify

или сделать минификацию или конкатенацию css

gulp minifyCss

Смена пароля в PostgreSQL

Заходим под пользователем postgres

sudo -u postgres psql

И меняем пароль

\password postgres

Выходим

\q

Старые записи