• Как написать валидацию уникальности по двум полям laravel?

    YmNIK_13
    @YmNIK_13
    Вопросу уже год, но может еще кому пригодится.

    Вот как я решил подобное.

    В ларе ответы можно обрабатывать отдельно. наследуюсь от класса FormRequest, а у него в свою очередь есть прекрасный метод prepareForValidation() который позволяет предварительно обработать/очистить входящие параметры.

    Сам полученный объект имеет метод all() - где содержатся все входные параметры.

    Таким образом, в наследуемом классе от FormRequest я добавил поле для хранения второго параметра. а в методе prepareForValidation() его туда помещаю.

    Сама валидация проходит в методе rules() - где мы указываем правила.
    В нашем распоряжении есть класс Rule который позволяет кастомизировать проверку.

    Ниже мой класс который проверяет на уникальность два поля:
    name и parent_id

    namespace App\Http\Requests\Admin\Common;
    
    use Illuminate\Foundation\Http\FormRequest;
    use Illuminate\Validation\Rule;
    
    class SourceRequest extends FormRequest
    {
        protected $parent_id = null;
    
        protected function prepareForValidation()
        {
            $input = $this->all();
    
            // parent_id  - это int. который может быть и null, тут мы его сохраняем
            if (isset($input['parent_id'])) {
                $parent_id = intval($input['parent_id']);
                if ($parent_id > 0) {
                    $this->parent_id = $parent_id;
                }
            }
    
            $this->replace($input);
        }
    
    
        public function rules()
        {
            // передаем в запрос второй параметр
            $name_rule_uniq = Rule::unique('source')
                ->where(function ($query) {
                   // в зависимости от того какой parent_id добавляем правило
                    if ($this->parent_id !== null) {
                        $query->where([
                            ['parent_id', $this->parent_id],
                        ]);
                    } else {
                        $query->whereNull('parent_id');
                    }
                });
    
            // добавляем игнор если это текущая страница - это для редактирования
            $niche_id = $this->route()->parameter('source');
            if (!empty($niche_id)) {
                $name_rule_uniq->ignore($niche_id);
            }
    
    
            return [
                'name' => [
                    'required',
                    $name_rule_uniq,
                ],
            ];
        }
    
        // это вывод сообщений если при проверке повторяется имя или оно вообще отсутствует
        // можно не реализовывать
        public function messages()
        {
            return [
                'name.required' => ':attribute - обязательно',
                'name.unique' => ':attribute должно быть уникальным',
            ];
        }
    
        // это чтоб не писать одно и то же имя валидируемой переменной 
        // можно не реализовывать
        public function attributes()
        {
            return [
                'name' => 'Имя источника',
                'parent_id' => 'Id источника',
            ];
        }
    
    }
    Ответ написан
    1 комментарий
  • Настройка прав для nginx/php-fpm на ubuntu server?

    Если у Вас проект находится в домашней директории пользователя, то почему бы не создать отдельный pool php-fpm, работающий от нужного Вам пользователя, на директории права 755, на файлы - 644.
    Затем в /etc/php/7.0/fpm/pool.d создаете новый файл с таким содержимым:
    [user]
    user = user
    group = user
    listen = /run/php/php7.0-user.sock
    listen.owner = www-data
    listen.group = www-data
    pm = dynamic
    pm.max_children = 5
    pm.start_servers = 2
    pm.min_spare_servers = 1
    pm.max_spare_servers = 3
    chdir = /

    В конфиге Nginx:
    location ~ \.php$ {
            try_files $uri /index.php =404;
            fastcgi_split_path_info ^(.+\.php)(/.+)$;
            fastcgi_pass unix:/run/php/php7.0-user.sock;
            fastcgi_index index.php;
            fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
            include fastcgi_params;
        }

    Тогда PHP будет работать от имени заданного в директиве user пула php-fpm пользователя
    Ответ написан
    Комментировать
  • Как в VUE JS сделать так чтоб при входе на сайт отображался только preloader пока все процессы не завершились?

    @ber_enot
    Веб-разработчик, Vue.js / Node.js
    В событие компонента mounted()
    добавить показ прелоадера, запустить методы загрузки данных
    убрать прелоадер, когда они завершатся (с помощью Promise.all)
    Читать про промисы тут - https://learn.javascript.ru/promise

    Примеры:
    один запрос:
    mounted() {
    	this.showPreloader = true
    	this.$http.get('/someUrl').then(response => {
    		// данные загружены, убираем прелоадер
    		this.showPreloader = false
    		// записываем полученные данные куда-либо
    		this.someData = response.body
    	}, response => {
    		// запрос завершился ошибкой
    		// показываем сообщение об ошибке
    		this.showPreloader = false
    		this.showError = true
    	});
    },

    Несколько запросов:
    mounted() {
    	this.showPreloader = true
    	Promise.all([
    		this.$http.get('/someUrl'),
    		this.$http.get('/someUrl2')
    	]).then(results => {
    		// данные загружены, убираем прелоадер
    		this.showPreloader = false
    	}, response => {
    		// один или несколько запросов завершились с ошибкой
    		// показываем сообщение об ошибке
    		this.showPreloader = false
    		this.showError = true
    	});
    },


    PS. Код справедлив для однофайловых компонентов с использованием Webpack. Используется синтаксис ES6.
    Ответ написан
    3 комментария
  • Подскажете хороший datepicker для Vue2?

    Ответ написан
    Комментировать
  • Bootstrap-Vue - В чём фишка данного симбиоза?

    copist
    @copist
    Empower people to give
    Расскажите плиз о технологии, и чем развёрнутей, тем лучше.

    Вот захотел ты сделать сайт SPA или PWA с любимой тебе вёрсткой на базе Twitter Bootstrap и любимой библиотеки Vue. Сверстал. Поповеры не появляются, дропдауны не выпадают, модалки не открыватся, формы не валидируются, клики не работают.

    Оригинальный Twitter Bootstrap имеет поддержку интерактивных элементов на Javascript. Реализовано это на библиотеке jQuery. Если делаешь на Vue, придётся подключать ещё и jQuery, что лишняя библиотека на 100+ килобайт, что, конечно, не катастрофа (пока ты не на мобилке).

    Vue работает с состояниями привязывает данные к отображению, а jQuery работает с DOM и событиями. Это вопрос производительности. Работа JQuery начитается когда загружен и распарсен JS и HTML. Работа Vue начинается в тот момент, когда загружен и распарсен JS, то есть чуть раньше. jQuery модифицирует DOM на лету, перестраивая текущий документ. Vue работает с shadow DOM, а затем подсовывает уже готовую интерактивную страницу в пустой документ, что быстрее (разница в секунды на десктопе, десятки секунд на м...).

    Vue реализует компонентную парадигму. Куски страницы являются изолированными кусочками кода (HTML CSS JS), которые цепляются между собой динамически, а обмениваются данными через аттрибуты и события. Предположим, что вы решили следовать компонентной парадигме, тогда согласно вот такому примеру нужно будет увязать самостоятельно все интерактивные компоненты. Компонента-кнопка. Компонента-поле ввода. Компонента-форма. Компонента-контейнер. Получается около 50 компонент. Для некоторых надо будет написать логику на jQuery. Если посмотреть на код jQuery этих микрокомпонент, то он окажется несложный, его вполне можно переписать на Vue. Ну там класс заменить или клик отработать. Когда от кода jQuery не останется следа, его можно будет из проекта удалить.

    И вот получается Bootstrap-Vue

    На компоненты побили. От Jquery избавились. Написано в единой парадигме. Работает быстрее.

    Добавляем тот факт, что в Vue можно не импортировать компоненты, которые не нужны (например, я не работаю с дропдаунами и модальным окнами) и код становится меньше, грузится быстрее, работает быстрее.

    Так же будет Не лишним оценить технологию: плюсы, минусы, стоит ли вообще с этим работать ...

    Это сам изучай и сравнивай. Навыки и опыт воздушно-капельным и через Internet не передаётся
    Ответ написан
    4 комментария
  • Как называется человек, который находит клиентов?

    iiil
    @iiil
    Инженер и вэб-дизайнер, рисую.
    Менеджер. Но зависит от сферы деятельности - сутенер, например.
    Ответ написан
    1 комментарий
  • Как архивировать файлы на PHP?

    vanton
    @vanton
    Человек и пароход
    Самый быстрый способ - использование командной строки на сервере, к примеру:
    exec("tar -cvf /full/path/to/filename.tar.gz folder_to_archive/");


    Есть еще решение от David Walsh, которое использует php класс ZipArchive, но php должен быть с поддержкой данного класса
    Ответ написан
    4 комментария
  • Как открыть порт на Debian ?

    BuriK666
    @BuriK666
    Компьютерный псих
    iptables -I INPUT 1 -p tcp --dport 3306 -j ACCEPT
    Ответ написан
    1 комментарий
  • Как реализовать сообщение об ошибке после редиректа?

    silentvick
    @silentvick
    Это называется flash messages. Сообщение записывается в специальную переменную в сессии. При рендере страницы проверяется наличие такого сообщения. Если есть - оно выводится и сразу удаляется из сессии, чтобы исключить повторный вывод.
    Yii. How to work with flash messages
    Ответ написан
    1 комментарий
  • Как правильно учить Javascript?

    IonDen
    @IonDen
    JavaScript developer. IonDen.com
    Вы наверное слышали, что каждый уважающий себя программист обязан написать несколько велосипедов? И JavaScript-программисты тоже так делают и еще как! Так вот в этом нет ничего плохого, это отличное самообучение.

    Для начала заходите на любой каталог плагинов для JavaScript или jQuery. Находите интересный, не очень сложный на вид плагинчик (например карусель, лайтбокс, слайдер и т.п.) и пытаетесь сделать похожий, только лучше. Поначалу будет выходить черти что, но, это будет уже реальная задача, где вы начнете сталкиваться с реальными особенностями языка. Вот тут то знания и начнут обретать какую-то структуру у вас в голове.

    Не пытайтесь брать сразу сложные вещи, начинайте с малого. Как заметили выше, не смотрите пока что на очень сложные книжки, их читать сейчас почти бесполезно.
    Ответ написан
    6 комментариев
  • Привязка домена к VPS Hetzner?

    Что то этот вопрос возникает регулярно у людей, надо howto написать будет )
    Вобщем если кратко — заказываешь услугу Nameserver Robot, добавляешь в админке robot.your-server.de/dns свои домены (там есть мастер, указываешь просто IP и домен, или же пишешь кусок конфига bind сам) и прописываешь у регистратора неймсервера хетцнера и все.
    robotns3.second-ns.com.
    robotns2.second-ns.de.
    ns1.first-ns.de.

    А вообще — привзяка домена — это далеко не самое сложное, что надо сделать владельцу VPS. Как вы будете настраивать вебсервер, БД, резервное копирование? Может имеет смысл нанять фрилансера-сисадмина для этих целей?
    Ответ написан
    1 комментарий