• Как хранить html разметку в бд laravel5?

    alexey-m-ukolov
    @alexey-m-ukolov Куратор тега Laravel
    У вас же вопрос, получается, не в том, как хранить, а как выводить?

    By default, Blade {{ }} statements are automatically sent through PHP's htmlentities function to prevent XSS attacks. If you do not want your data to be escaped, you may use the following syntax:

    Hello, {!! $name !!}.

    laravel.com/docs/5.1/blade#displaying-data
    Ответ написан
    Комментировать
  • Попросили проверить код, на что смотреть нужно?

    index0h
    @index0h
    PHP, Golang. https://github.com/index0h
    Смотря зачем)). Я когда делаю Code Review критерии следующие:

    * Безопасность:
    - Каждый аргумент метода простого типа должен проверяться на тип в случае его проксирования и на граничные значения в случае обработки. Чуть что не так - бросается исключение. Если метод с кучкой аргументов на 80% состоит из поверки из аргументов - это вполне норм))
    - Никаких trigger_error, только исключения.
    - Исключения ДОЛЖНЫ быть человеко-понятны, всякие "Something went wrong" можно отдавать пользователю, но в лог должно попасть исключение со стектрейсом и человеко-понятным описанием, что же там пошло не так.
    - Каждый аргумент (объект) метода должен быть с тайпхинтингом на этот его класс, или интерфейс.
    - За eval как правило шлю на **й.
    - @ допускается только в безвыходных ситуациях, например проверка json_last_error.
    - Перед работой с БД - обязательная проверка данных.
    - Никаких == и !=. Со swtich - единственное исключение, по ситуации.
    - Если метод возвращает не только bool, а еще что-то - жесткая проверка с ===, или !== обязательна.
    - Никаких условий с присваиваниями внутри. while($row = ...) - тоже идет лесом.
    - Магические геттеры/сеттеры разрешаются только в безвыходных ситуациях, в остальном - запрещены.
    - Конкатенации в sql - только в безвыходных ситуациях.
    - Параметры в sql - ТОЛЬКО через плейсхолдеры.
    - Никаких глобальных переменных.
    - Даты в виде строки разрешаются только в шаблонах и в БД, в пхп коде сразу преобразуется в \DateTimeImmutable (в безвыходных ситуациях разрешено \DateTime)
    - Конечно зависит от проекта, но как приавло должно быть всего две точки входа: index.php для web и console(или как-то по другому назваться) - для консоли.

    * Кодстайл PSR-2 + PSR-5 как минимум, + еще куча более жестких требований (для начала все то что в PSR помечено как SHOULD - становится MUST)
    - В PhpStorm ни одна строчка не должна подсвечиваться (исключением является typo ошибки, например словарик не знает какой-то из аббревиатур, принятых в вашем проекте). При этом разрешается использовать /** @noinspection *** */ для безвыходных ситуаций.
    - Если кто-то говорит, что пишет в другом редакторе и у него не подсвечивается, на эти отговорки кладется ВОТ ТАКЕЕЕНЫЙ мужской половой **й и отправляется на доработку)).

    * Организация кода:
    - Никаких глобальных функций.
    - Классы без неймспейса разрешаются только в исключительно безвыходных ситуациях.

    * Тестируемость (в смысле простота тестирования) кода должна быть высокая.
    - Покрытие кода обязательно для всех возможных кейсов использования каждого публичного метода с моками зависимостей.

    * Принципы MVC:
    - Никаких обработок пользовательского ввода в моделях, от слова совсем.
    - Никаких ***ть запросов в БД из шаблонов.
    - Никаких верстки/js/css/sql-ин в контроллерах.
    - В моделях НИКАКОЙ МАГИИ, только приватные свойства + геттеры с сеттерами.
    - В моделях разрешено использовать метод save(при наличии такого разумеется) только в исключительных ситуациях. Во всех остальных - либо insert, либо update.

    * Принципы SOLD:
    - Никаких божественных объектов умеющих во все.
    - Если метод для внутреннего пользования - private, никаких public.
    - Статические методы разрешаются только в случае безвыходности.

    * Принцип DRY разрешено нарушать в случаях:
    - Явного разделения обязанностей
    - В тестах (каждый тест должен быть независимым, на сколько это возможно)

    * Работа с БД:
    - Запрос в цикле должен быть РЕАЛЬНО обоснован.
    - За ORDER BY RAND() - шлю на***й.
    - Поиск не по ключам (конечно если таблица НЕ на 5 строк) запрещен.
    - Поиск без LIMIT (опять же если таблица НЕ на 5 строк) запрещен.
    - SELECT * - запрещен.
    - Денормализация БД должна быть обоснована.
    - MyISAM не используется (так уж)) )
    - Множественные операции обязательно в транзакции, с откатом если чо пошло не так.
    - БД не должна содержать бизнес логики, только данные в целостном виде.
    - Не должно быть нецелесообразного дерганья БД там, где без этого можно обойтись.

    * Кэш должен очищаться по двум условиям (не по одному из, а именно по двум):
    - Время.
    - Протухание по бизнес логике.
    Разрешается по только времени в безвыходных ситуациях, но тогда время - короткий период.
    - При расчете ключей кэша должна использоваться переменная из конфигурации приложения (на случай обновлений кэш сбрасывается кодом, а не флашем кэш-сервера). В случае использования множества серверов - это очень удобный и гибкий инструмент при диплое.

    * О людях:
    - "Я привык писать так и буду дальше" - не вопрос, ревью пройдешь только когда поменяешь свое мнение.
    - "Я пишу в vim-е и мне так удобно" - здорово, код консолью я тоже в нем пишу)) но есть требования к коду, если в них не сможешь - не пройдешь ревью.
    - "Я скопировал этот страшный метод и поменял 2 строчки" - это конечно замечательно, но по блейму автор всего этого метода ты, так что давай без говняшек, хорошо?
    - "Оно же работает!" - вот эта фраза переводится примерно так: "да, я понимаю, что пишу полную хрень, но не могу писать нормально потому, что руки из жо", я правильно тебя понял?))
    - "У меня все работает!" - рад за тебя, а как на счет продакшна?
    - "Там все просто" - не используй слово "просто", от слова "совсем". Вот тебе кусок кода (первого попавшегося с сложной бизнес логикой), где там ошибка (не важно есть она, или нет)? Ты смотришь его уже 2 минуты, в чем проблема, там же все "просто"))

    * Всякое:
    ActiveRecord (это я вам как в прошлом фанат Yii говорю) - полное говно, примите за исходную. По факту у вас бесконтрольно по проекту гуляют модельки с подключением к БД. Не раз натыкался на то, что в тех же шаблонах вызывают save, или update (за такое надо сжигать).
    То, что используется Laravel - это печально((. Что бы выполнить требования приведенные выше, приходится "воевать" с фреймворком.

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

    UPD

    Формализировал данные критерии по ссылочке: https://github.com/index0h/php-conventions
    Ответ написан
    55 комментариев
  • Как заставить логирование Guzzle работать в Laravel?

    Denormalization
    @Denormalization
    Если нужно писать в общий лог файл лог Guzzle, то:
    use GuzzleHttp\HandlerStack;
    use GuzzleHttp\Middleware;
    use GuzzleHttp\MessageFormatter;
    use Monolog\Logger;
    
    $stack = HandlerStack::create();
    $stack->push(
        Middleware::log(
            \Illuminate\Support\Facades\Log::getMonolog(),
            new MessageFormatter('{req_body} - {res_body}')
        )
    );
    $client = new \GuzzleHttp\Client(
        [
            'base_uri' => 'some-url.com',
            'handler' => $stack,
        ]
    );


    Оно будет писать в общий лог файл.
    Если же нужно писать в кастомный лог файл, то:
    use Monolog\Handler\StreamHandler;
    // ....
    $logger = new Logger('GuzzleLogger');
    $logger->pushHandler(new StreamHandler(storage_path('logs/guzzle.log')));
    $stack->push(
        Middleware::log(
           $logger,
            new MessageFormatter('{req_body} - {res_body}')
        )
    );
    Ответ написан
    2 комментария
  • Как в Laravel 5.1 изменить pagination?

    Tesla
    @Tesla
    Правильно было бы сделать свой Paginator, унаследовать его от Illuminate\Pagination\Paginator или Illuminate\Pagination\LengthAwarePaginator, и в методе url() добавить проверку на вывод первой страницы. Но тогда придется создавать пагинатор вручную, передавая ему необходимые параметры.

    Странно, что в Illuminate\Database\Eloquent\Builder Paginator вызывается напрямую, а не через DI, это решило бы все проблемы.
    Ответ написан
    3 комментария
  • Как показывать языковые версии сайта средставами php?

    ArsenBespalov
    @ArsenBespalov
    Сам себе разработчик
    Можно, но все по большей части зависит от CMS движка вашего сайта, если вы занимаетесь изобретением велосипеда, тогда вот вам с ходу набросанная реализация того, о чем вы говорите:

    class Language
    {
    	var $language = null;
    
    	public function __construct()
    	{
    		if (($list = strtolower($_SERVER['HTTP_ACCEPT_LANGUAGE']))) {
    			if (preg_match_all('/([a-z]{1,8}(?:-[a-z]{1,8})?)(?:;q=([0-9.]+))?/', $list, $list)) {
    				$this->language = array_combine($list[1], $list[2]);
    				foreach ($this->language as $n => $v)
    					$this->language[$n] = $v ? $v : 1;
    				arsort($this->language, SORT_NUMERIC);
    			}
    		} else $this->language = array();
    	}
    
    	public function getBestMatch($default, $langs)
    	{
    		$languages=array();
    		foreach ($langs as $lang => $alias) {
    			if (is_array($alias)) {
    				foreach ($alias as $alias_lang) {
    					$languages[strtolower($alias_lang)] = strtolower($lang);
    				}
    			}else $languages[strtolower($alias)]=strtolower($lang);
    		}
    		foreach ($this->language as $l => $v) {
    			$s = strtok($l, '-'); // убираем то что идет после тире в языках вида "en-us, ru-ru"
    			if (isset($languages[$s]))
    				return $languages[$s];
    		}
    		return $default;
    	}
    }


    Вот таким образом уже будете использовать:
    // Определяем для кого будет выбираться русский язык
    $site_langs = array('ru' => array('ru', 'be', 'uk', 'ky', 'ab', 'mo', 'et', 'lv'));
    
    // Опеределяем язык пользователя и выбираем нужный для сайта
    $user_lang = new Language();
    $current_lang = $user_lang->getBestMatch('de', $site_langs);
    
    // Отправляем пользователя на нужный язык для его локали.
    if ($user_uri == '/') {
        if ($current_lang != 'de') {
            header("Location: http://site.de/" . $current_lang . "/");
        }
    }
    Ответ написан
    Комментировать
  • Как сделать картинку обтекаемой другими картинками?

    delphinpro
    @delphinpro Куратор тега CSS
    frontend developer
    Ответ написан
    Комментировать
  • Кто ставит копирайт на сайте (дизайнер или разработчик)?

    dimonchik2013
    @dimonchik2013
    non progredi est regredi
    (c) 2015, разработка: студия "Рога и копыта"; дизайн: Сидор Лютый
    Ответ написан
    Комментировать
  • Как проще публиковать (js/css/jpg)-файлы из ./vendor?

    bower.io + Laravel Elixir зачем ананизмом заниматся?

    Copy a File to a New Location

    elixir(function(mix) {
        mix.copy('vendor/foo/bar.css', 'public/css/bar.css');
    });

    Copy an Entire Directory to a New Location

    elixir(function(mix) {
        mix.copy('vendor/package/views', 'resources/views');
    });
    Ответ написан
    Комментировать
  • Как получить результатом простой массив используя запрос к базе данных в laravel?

    alexey-m-ukolov
    @alexey-m-ukolov Куратор тега Laravel
    Если вы используете Query Builder, то он итак возвращает массив объектов StdClass.
    Если вы используете Eloquent, то при выборках возвращаются коллекции, а у коллекций есть метод toArray.
    Ответ написан
    Комментировать
  • Как указать нужные поля в relations?

    Denormalization
    @Denormalization
    Распространенная проблема. Решается добавлением ключа в список select:
    $list = $query->with(array('source' => function ($query) {
        $query->select(['id', 'url', 'name', 'key_field']);
    }))->select(['id', 'image_url', 'published', 'added', 'header']);


    Где key_field - это поле которое у вас связывает таблицы News и Source. Например news_id, или как оно у вас там называется.
    Ответ написан
    1 комментарий
  • Какой вы используете файловый менеджер для Laravel 5?

    AmdY
    @AmdY
    PHP и прочие вебштучки
    Использую barryvdh/laravel-elfinder и прочие пакеты от barryvdh, очень адекватный вендор. А в чём проблема была?
    Ответ написан
    4 комментария
  • Что можно написать на Node.js?

    MarcusAurelius
    @MarcusAurelius Куратор тега Node.js
    автор Impress Application Server для Node.js

    Часто применяется для:

    1. Локальные приложения и утилиты командной строки
    • Сборщики и трансляторы
    • Пакетная обработка и сценарии отложенной обработки
    • Скрипты, CLI (интерфейсы командной строки)
    • Генерация документации, отложенное формирование отчетов
    • Сценарии тестирования для других систем

    2. Серверы
    • Серверы веб-приложений и SPA
    • Серверы и API для мобильных приложений
    • Любые другие веб-API (RPC, JSON, REST)
    • Серверы сообщений и трансляция событий (чаты, игры, интерактив)
    • Заплаты на уже готовые системы, написанные на других языках, для реализации вебсокетов, SSE, лонг-пулинга и т.д., т.е. для затыкания дыр, для решения проблем в узких местах уже работающих систем.

    3. Клиенты
    • Оконные приложения (nw.js, node-webkit)
    • Кравлеры, парсеры и сбор данных

    4. Железо
    • Программирование микроконтроллеров (arduino, espruino, tessel)
    • Промышленная автоматизация

    Редко применяется (но подходит) для:
    • CMS, публикация контента (просто ниша уже занята и в этой задаче нода не дает чего-то принципиально нового или сверх соблазнительного).
    • Массовая электронная коммерция и торговля (не применяется для массовых движков магазинов, но используется отдельными крупными компаниями для торговых и платежных задач в качестве дополнительного средства к уже имеющемуся ПО, по сути закрывает узкие места).

    И плохо подходит:
    • Вычисления и моделирование, со скоростью математических операций нода и JS, как не типизированный язык, не дают хороших показателей
    • Научные приложения (по тем же причинам)
    Ответ написан
    10 комментариев