Задать вопрос
  • Интернет-магазин на Falcon и VueJS?

    copist
    @copist
    Empower people to give
    Описанная тобой схема, при которой приложение разбито на две части: клиентское на JS и серверное, которые обмениваются данными через открытое API по HTTP - называется Rich Internet Application или Single Page Application. Реализуется на любом стеке. PHP/Python/NodeJS/Ruby/Go/C#/Java и др. с одной стороны и Vue/Angular/Meteor/React и др. (тыщи их) с другой стороны.

    (Упомянуя схема "микросервисная архитектура" по сути декомпозиция серверной части на незаввисимые модули с открытым API, совсем не обязательно реализовано через HTTP. Частный случай SPA/RIA.)

    Проблему назову одну. Только она не даёт покоя. Она выматывает душу, нервы и кошелёк.

    Интернет магазин должен быть открыт для индексации поисковым ботам, а HTML генерится в runtime на JavsScript. Только Google умеет выполнять JS, и то весьма посредственно. Остальные вообще JS не трогают. Есть два решения:
    для индексации сразу рисовать HTML на стороне сервера
    или снимать "отпечатки" HTML c приложения через виртуальный браузер, что сбоит

    Отрисовка HTML на стороне сервера (server side render) может быть реализована тремя способами:
    * подменять выдачу через серверный язык программирования, то есть вместо шаблонизации в Vue рисовать в Falcon - блин, две шаблонизации, две логики работы с данными (через AJAX и напрямую из базы)
    * имитировать исполнение JS на сервере (хм, это возможно опять же несколькими способами) - тут вообще танцы с бубном
    * отказаться от PHP/Python/Ruby и др. в пользу NodeJS и изоморфного фрейморка, например MeteorJS или VueJS (Nuxt)

    Если на рендеринг для поисковиков забить болт и отказаться от органического трафика, то можно мой опус про эту проблему проигнорировать. Трафик может быть не только органический. Его можно гнать через контекстную или тизерную рекламу, через социалки, через медийную или офлайновую рекламу. Зависит от размера кошелька владельца проекта.

    P.S. Про Google: проверено, глючит в тех местах, где клиентский JS начинает подкачку данных через HTTP - гугль обрывает рендеринг и в поисковом индексе лежат пустые HTML страницы. Толку от них никакого.
    P.P.S Снятие "отпечатков" HTML для SPA можно через специальные сервисы (prerender.io или brombone.com) или сделать самостоятельно, например через PhantomJS или Electron. В любом случае для проекта с десятком тысяч страниц это расходы на оплату сервиса, либо на мощный сервер. И электрон и фантом виснут, а HTML довольно большие и со временем забивают диск/базу. Опят же надо не забывать про то, что страницы требуют подгрузки данных через AJAX, надо чуть подождать.
    Пример: web-mastery-gauge.ru сделан на Angular, для поисковиков HTML отрисовывается через prerender.io - для проекта с 15 страницами это вообще никакой сложности не вызывает.
    P.P.P.S. SPA просто идеально для реализации той части пользовательского интерфейса, которая не индексируется поисковыми ботами. Например, то доступно только авторизованным пользователям. В этом случае не требуется server side render и 75% проблем отпадают. В том же интернет-магазине может быть админка - её можно сделать на VueJS.
    Ответ написан
    6 комментариев
  • Как сделать шаблонизатор на php?

    copist
    @copist
    Empower people to give
    Сначала - зачем нужен шаблонизатор. Тут подмена понятий. Скорее вопрос такой: как отделить вывод от заголовков. Если не отделять, то может быть такая ошибка

    <html>
    <body>
    <?php
    // начать сессию
    session_start(); // отправить куку PHPSESSID через заголовки HTTP
    // но она не может отправиться, потому что уже начался вывод HTML в строке "<html ..."
    
    // если не авторизован, то отправить на страницу логина
    if (empty($_SESSION['username']))
        header('Location: /login.php'); // но заголовок HTTP тоже не может отправиться, как и кука
    ?>
        <h1>Hello, <?php echo $_SESSION['username'] ?></h1>
    </body>
    </html>


    Проблема решается, если вывод HTML делать после вывода заголовков. Например, использовать буфер
    <?php ob_start(); // открыть буфер ?>
    <html>
    <body>
    <?php
    session_start(); //  кука PHPSESSID отправится, потому что HTML ещё в буфере
    if (empty($_SESSION['username']))
        header('Location: /login.php'); // заголовок HTTP отправится, потому что HTML ещё в буфере
    ?>
        <h1>Hello, <?php echo $_SESSION['username'] ?></h1>
    </body>
    </html>
    <?php ob_end_flush(); // выбросить содержимое буфера наружу и закрыть его ?>


    Однако так придётся писать в каждом месте, где формируется HTML. Можно ли сократить?

    Простейшее представление через буфер

    <?php
    function render($viewPath)
    {
        if (!is_file($viewPath))
            return 'View "'. $viewPath . '" not exists';
        ob_start();
        include($viewPath);
        return ob_get_clean();
    }
    
    session_start();
    if (empty($_SESSION['username']))
        header('Location: /login.php');
    
    $viewsPath = __DIR__.'/views/'; // где лежат представления
    render($viewsPath . 'page.php'); // нарисовать страницу HTML


    <?php
    # page page.php
    ?>
    <html>
    <body>
        <h1>Hello, <?php echo $_SESSION['username'] ?></h1>
    </body>
    </html>


    А дополнительно ещё решают проблему отделения логики от формирования интерфейса. Работа с внешними данными в одном месте, а отображение их - в другом. Для этого в представление передают всё, что нужно показать. И точка. Лишних данных там не надо. В некоторых фреймворках стоит Exception если представление начнёт работать с базой данных, читает данные из входного запроса или пытается отправить заголовки.

    <?php
    function render($viewPath, $vars)
    {
        if (!is_file($viewPath))
            return 'View "'. $viewPath . '" not exists';
        extract($vars); // extract делает из массива набор переменных в локальной области видимости
        ob_start();
        include($viewPath); // эти переменные будут видны внутри подключаемого файла
        return ob_get_clean();
    }
    
    session_start();
    if (empty($_SESSION['username']))
        header('Location: /login.php');
    
    $viewsPath = __DIR__.'/views/'; // где лежат представления
    render($viewsPath . 'page.php', array( // отображаемые данные передаются массивом
        'username' => $_SESSION['username'],
    ));


    # page.php
    <?php
    /**
     * Подсказки для IDE, чтобы не подсвечивал переменные как неопределённые
     * @var string $username
     */
    <html>
    <body>
        <h1>Hello, <?php echo $sername ?></h1>
    </body>
    </html>


    Не правда ли, с представлениями код становится значительно изящнее. А если логика для реализации представлений хранится в отдельном файле-библиотеке, то код становится короче и понятнее.

    В фреймворках вместо функции render может использоваться объектная реализация

    <?php
    class ViewException extends Exception {}
    
    class View
    {
        public $viewsPath = __DIR__.'/views/';
        
        public function __construct($viewsPath = null)
        {
             // настройка представлений
            // например, можно перепределить место хранения представлений
            if (!is_null($viewsPath))
                $this->viewsPath = $viewsPath;
        }
    
        public function render($viewPath, $vars)
        {
            if (!is_file($this->viewsPath . $viewPath))
                throw new ViewException('View "'. $viewPath . '" in folder "'. $this->viewsPath . '" not exists');
            extract($vars);
            ob_start();
            include($this->viewsPath . $viewPath);
            return ob_get_clean();
        }
    }
    
    $view = new View();
    $view->render('page.php', array(
        'username' => $_SESSION['username']
    ));


    Как таблицы шаблонизаирова если в одной 3 столбца, в другой 5?

    Никто в представлениях не запрещает использовать языковые конструкции. Это могут быть конструкции языка PHP или какой-нибудь другой язык, специально написанный для шаблонизатора. Например, в Smarty, Blade, Pug свои языки. Передай в представление количество колонок и сделай цикл :)

    у первой первый столбец должен быть 70% а у второй последний?

    В представлениях можно подключать стили CSS, через которые меняется отображение (колонка 70%).
    У каждого представления может быть свои стили.
    Если нужно, чтобы были некоторые общие стили и дополнительные, нужные только для этой страницы, используют что-то типа буферизирования вывода блока стилей.

    <?php
    class Assets
    {
        public static $cssLinks = array();
        public static $css = array();
    
        // добавить ссылку на файл стилей
        public function addCssLink($link)
        {
            self::$cssLinks[$link] = $link;
        }
    
        // добавить блок стилей
        public function addCss($name, $css) // $name - это чтобы не дублировались блоки стилей, на всякий случай
        {
            self::$css[$name] = $css;
        }
    
        public function renderCss()
        {
            foreach(self::$cssLinks as $url)
                echo '<link href="'.$url.'" rel="stylesheet" type="text/css" />';
            echo '<style type="text/css">';
            foreach(self::$css as $css)
                echo $css;
            echo '</style>';
        }
    }


    # index.php
    
    $assets = new Assets();
    // общие стили
    $assets->addCssLink('https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/3.3.7/css/bootstrap.min.css');
    
    // ...
    
    $view = new View();
    $view->render('page.php', array(
        'username' => $_SESSION['username']
    ));


    # page.php
    <?php
    /**
     * @var string $username
     */
    $assets = new Assets();
    $assets->addCssLink('/path/to/my/styles.css'); // ещё один файл стилей
    $assets->addCss('h1 { color: red; }'); // или даже что-нибудь микроскопическое, только для этой страницы
    ?>
    <html>
    <head>
    <?php $assets->renderCss() ?>
    </head>
    <body>
        <h1>Hello, <?php echo $username ?></h1>
    </body>
    </html>


    И аналогично про JS.
    Ответ написан
    7 комментариев
  • Как в ткинтере создать окно внутри главного окна?

    sergey-gornostaev
    @sergey-gornostaev Куратор тега Python
    Седой и строгий
    import tkinter as tk
    
    root = tk.Tk()
    root.title("Main Window")
    root.geometry("640x480")
    
    sub = tk.Toplevel(root)
    sub.transient(root)
    sub.title('Sub Window')
    sub.minsize(320, 240)
    sub.maxsize(320, 240)
    
    pos = []
    
    def main_move(event):
        if pos:
            sub.geometry("+{0}+{1}".format(pos[0], pos[1]))
    
    
    def sub_move(event):
        min_w = root.winfo_rootx()
        min_h = root.winfo_rooty()
    
        max_w = root.winfo_rootx() + root.winfo_width() - 15
        max_h = root.winfo_rooty() + root.winfo_height() - 35
    
        if event.x < min_w:
            sub.geometry("+{0}+{1}".format(min_w, event.y))
    
        elif event.y < min_h:
            sub.geometry("+{0}+{1}".format(event.x, min_h))
    
        elif event.x + event.width > max_w:
            sub.geometry("+{0}+{1}".format(max_w - event.width, event.y))
    
        elif event.y + event.height > max_h:
            sub.geometry("+{0}+{1}".format(event.x, max_h - event.height))
    
        global pos
        pos = [event.x, event.y]  
    
    
    root.bind('<Configure>', main_move)
    sub.bind('<Configure>', sub_move)
    
    root.mainloop()
    Ответ написан
    Комментировать
  • Порядок изучения C#?

    lexxpavlov
    @lexxpavlov
    Программист, преподаватель
    Неплохая книга Бена Ватсона "С# 4.0 на примерах" - много примеров, как делать конкретные вещи, в том числе, по WPF.

    Программирование зиждется на трёх китах - 1) знание (синтаксис) языка, 2) алгоритмы и 3) архитектура. Причём, последние не связаны с языком. Читайте не только о языке, но и общие знания - паттерны, архитектура, алгоритмы. В большинстве классических книг примеры написаны не на c#, но их чтение сильно развивает как программиста.
    Мартин Р. Чистый код. Создание, анализ и рефакторинг рекомендую прочитать хотя бы до 12 главы, дальше - углубление. Первые главы дают шикарный базис для построения архитектуры - почему писать так, а не иначе. Примеры на Java, но этот язык довольно сильно похож на C#.
    Фаулер М. Рефакторинг. Улучшение существующего кода классическая книга
    Гамма Э и др. Приёмы объектно-ориентированного проектирования суперклассическая книга, так называемая "банда четырёх"
    Скиена С. Алгоритмы. Руководство по разработке книга о алгоритмах, проще, чем известная книга Д. Кнута

    Ну и посмотрите этот список книг.
    Ответ написан
    Комментировать
  • Как эффективно проверять новые данные в БД?

    @melnikov_m
    Можно реализовать примерно так
    1) создать для задачи колонку isRead(0/1 не прочитано/прочитано)
    2) при создании записи добавлять в кеш с привязкой к пользователю, что у него есть непрочитанная задача
    Yii::$app->cache->set('newTask-user-'. $userId, 1);

    конечно нужно сначала проверять счетчик на существование и инкриментировать его. Например, это умеет редис
    https://yiigist.com/package/drsdre/yii2-redis-coun...
    В общем, если счетчика нет, то он создается, если есть, то берется его старое значение и делается +1
    3) Когда пользователь зашел в список задач, то идет обращение не в БД, а к этому счетчику и пользователь видит (+1, +2 и т.д).
    Когда заходит в конкретную задачу, то если колонка isRead = 0, то записываем 1, а счетчик делаем -1.
    4) Наверное, еще придется предусмотреть "разогрев кеша", если он упал(на случай если вы предполагаете, что нагрузка будет реально большая)
    Для этого пишем задачу, которая запускается при запуске сервера кеширования, в которой берем count всех непрочитанных задач, сгруппированных по пользователям и записываем эти значения в счетчики.
    Ответ написан
    1 комментарий
  • Как развернуть веб-сервер + 1С?

    @Dementor
    программист, архитектор, аналитик
    Ну так у Вас практически все уже сделано!

    Осталось самое мелкое и незначительное:
    1. Купить у вашего интернет провайдера статический IP-адрес
    2. Купить красивое доменное имя
    3. На ns-сервере (его продавцы доменных имен предоставляют бесплатно) привязать ваш домен к вашему IP с помощью A-записи
    4. Настроить Apache на ответ по запросу этого доменного имени
    5. Купить для домена сертификат или воспользоваться бесплатным от Let’s Encrypt (можно и без него, но хром и мозила обещают все сайты без HTTPS показывать как неблагонадежные - если такое устраивает, то пропускайте этот и следующий пункт)
    6. Установить купленный сертификат в вашей системе и настроить Apache на его использование
    7. Добавить в ваш фаервол разрешающие правила для вашего HTTP/HTTPS трафика
    8. Если вы работаете из локальной сети, то еще возможно нужно будет настроить форвардинг HTTP/HTTPS трафика с вашего роутера на компьютер с физически установленным Apache (где при этом база 1С находится не имеет значения; главное, что бы на компе с веб-сервером стояли 1С-кие библиотеки и был прямой доступ по локалке)
    Ответ написан
    4 комментария
  • Знание которые не устареют через 10-20 лет?

    AgentProvocateur
    @AgentProvocateur
    По вебу вообще сложно что-либо предугадывать даже на 5 лет вперед, не говоря уже о 20-30. Какими они будут эти web 4.0, 5.0...n.0 - вряд ли достоверно известно даже в Google и Microsoft.

    Наиболее вероятное развитие - всё будет браузером. Операционная система - подобие браузера, и всё в облаках - софт в виде web-сервисов (подключаемых из аппстора на рабочем столе), данные в виртуальных хранилищах и т.д. Даже игры будут крутиться на серверах, а пользователю будет передаваться только "клиентская часть" в видеопотоке. При этом всё будет кроссплатформенным с минимальными требованиями к конфигурации устройства. Не важно, ПК у пользователя (обычный или квантовый), ноутбук, планшет, смартфон, шлем VR, телевизор и проч. - каждый будет иметь возможность оплатить доступ к какой-нибудь GTA 10 и зарубиться в неё на максималках.

    Соответственно, привычные в 2000-х годах сайты на PHP также поменяют вид и преобразуются в SPA-приложения, подгружаемые на рабочий стол пользователя по клику в сторе.

    Дело в том, что такая модель полностью убивает пиратство и дико выгодна коммерчески всей IT-индустрии, потому и считается наиболее вероятной. Уже прут первые потуги типа Chrome OS, перемены начнутся, когда выкатится браузерный Windows и ТОП-500 web-сервисов адаптируются под него, а затем и под версии от Google и Apple. Собственно, примерно то же произошло с мобильным рынком с появлением Android.

    Вот только когда весь мир утонет с любого утюга и самовара в браузерах и на серверах, там уже понадобятся другие подходы в структурах данных, протоколах, базах, организации дата-центров, безопасности и т.д. А какими они будут..."сегодня в завтрашний день не все могут смотреть. Вернее, смотреть могут не только лишь все, мало кто может это делать" (с)

    С теми же языками программирования холивары горят. Огромное количество специалистов бьют пяткой в грудь на тему "javascript захватит мир", не меньшее количество людей напротив уверены, что "этот ужасный язык - лишь временная и костыльная мера переходного периода, не способная заменить на сервере .NET или компилируемый Go, рвущий все топы".

    Продолжение:
    Ответ написан
    1 комментарий
  • Сколько у вас ушло времени чтобы стать python junior developer?

    @Trahibidadido
    Backend/DevOps
    Пришел python\django juniorом с улицы. За немалое время работы сожрал пуд соли. Самое большое разочарование - все ищут питонистов для быстрой разработки (порог вхождения ниже наверное только у php) и берут джунов на не джуниорские задачи. Я за первый месяц работы что только не писал, от системы скидок для интернет магазинов на Django, до админки системы курьерской доставки интернет-ритейлера написаной на связке Flusk+Vue+Jquery которую до меня писал десяток человек и все бросали.

    Никто практически никогда не готов тебя учить, если на более "мейнстримных" языках ты получаешь более низкий оклад, но больший штат серьезных девов с многолетним опытом и высокий шанс того что за тобой будут "присматривать", то попадая в компанию которая пишет на python - ты сам по себе. Потому что питонистов тупо мало и стоят они дорого, никто не хочет тратить их время на всякие кодревью и митапы.

    Не согласен с оратором выше, джун это просто человек способный писать работающий код. Как он это делает и что этот код из себя представляет - вопрос второй. Я пишу нереальные костыли и ничего, заказчик доволен, начальнику пофигу, зп на карточке.
    Ответ написан
    Комментировать
  • Как отобразить номер телефона через Html helper?

    Самый простой вариант - создать свой класс, наследованный от Html и использовать его во всем проекте:
    <?php
    namespace app\helpers;
    class Html extends \yii\helpers\Html
    {
        public static function phone($phone, $options = [])
        {
            $options['href'] = 'tel:'.$phone;
            if (!isset($options['class'])) {
                $options['class'] = '';
            }
            return static::tag('a', $phone, $options);
        }
    }


    А дальше несколько вариантов:
    • Добавить еще несколько удобных методов и оформить все это в виде пакета composer, пример.
    • Сделать pull-request в yii2 или тому же Картику.
    Ответ написан
    5 комментариев
  • Что за тип данных static?

    @D3lphi
    Это класс, верхний в иерархии наследования, из которого происходит вызов метода. Self и Static можно поставить в один ряд. Self - это класс, в котором написан этот метод, а static - класс, из которого происходит вызов метода. Это может быть тот же самый класс, а может - наследник. Прочтите про позднее статическое связывание.
    Ответ написан
    Комментировать
  • Использование нелицензированного ПО в организации, кто несёт ответственность?

    sergey-gornostaev
    @sergey-gornostaev
    Седой и строгий
    А теперь от теории к практике, я сам несколько раз попадал под проверки, а также несколько лет "работал" независимым специалистом по киберпреступлениям, в том числе на проверках лицензионной чистоты. Руководство всегда показывает пальцем на админа и говорит "Мы не знали, вот ответственный специалист!" Заканчивается это тем, что компанию штрафуют, а админу прилетает срок. Наличие бумажки о том, что директор знал об установке пиратского софта трактуется судом как преступный сговор. Позиция админа "я не обязан разбираться в тонкостях лицензирования" - это как позиция бухгалтера "я не обязан разбираться в тонкостях налогообложения". Правильных решений может быть только два - либо заставить компанию перейти на лицензионное ПО, либо уволиться.
    Ответ написан
    39 комментариев
  • Использование нелицензированного ПО в организации, кто несёт ответственность?

    @pfg21
    ex-турист
    Пишешь документ на имя директора, где подробно перечисляешь что на таких-то компутерах имеется такое-то нелицензионное ПО. регистрируешь его у секретарши. делаешь копию с регистрационными надписями.
    твоя работа сделана, теперь начинается работа начальства по выделению денег на исправление незаконного использования.
    твоя * прикрыта.
    Ответ написан
    9 комментариев
  • Использование нелицензированного ПО в организации, кто несёт ответственность?

    @other_letter
    1. Ни в коем случае не писать никаких бумажек, как советует pfg21 .
    2. Ни в коем случае не говорить открыто, что это-пиратка.
    3. Ни в коем случае не вести "журналов установки пиратского софта".

    Зачем: В случае чего все дружно-дружно покажут на Вас. Ответственность несёт Директор. Скорее всего - даст взятку. Но если и он решит Вас слить - самый плохой вариант (остальные-то работники наверняка подтвердят). И эти бумажки будут показывать процесс подготовки к преступлению, факт его завершённости. А умысел как-нибудь найдётся. Плюс эта бумажка - подтверждение сговора (т.е. уже ч.2)

    Как делать: Вы не обязаны разбираться в тонкостях лицензирования. Кто угодно пусть пишет что угодно в стиле тыжпрограммист, но если такого навыка/обязанности нет в должностной инструкции (наверняка нет, и надо, чтобы не было), если не было такого курса в ВУЗе или Федерального Закона (тут условно) - не обязаны. Вы просто ставите то, что просят. Так, как просят. С дисков, которые Вам предоставил согласно ТК Работодатель (в качестве инструмента).
    Ответ написан
    42 комментария
  • Как построить конвейер сайтов на Ruby On Rails? Подходит ли RoR вообще?

    Matvey-Kuk
    @Matvey-Kuk
    Разработчик в Cisco, CA.
    Настраивал конвейер для полностью аналогичной компании пару лет назад. Единственное отличие - почти не было PHP наследия.

    За основу взял Django стек, т.к. он отлично подходил по количеству свободных профессионалов на рынке и тем, что в Django "всегда есть единственный очевидный путь как сделать что-либо правильно", тогда как в Node этих путей очень много и каждый новый нанятый программист должен чуть-чуть, да изменять свои подходы к разработке.

    Поначалу основной упор пришлось таки сделать на DevOps, все работало на GitLab, GitLab CI, Docker и хостинге Flops.ru. Это очень муторная, долгая работа по первичной настройке всего и вся. Не уверен, что её получится избежать.

    Разработка проекта велась следующим образом:
    1) Есть репозиторий с "заготовкой", копируется в новый репозиторий.
    2) Подключается GitLab CI, в переменных среды задается вся-вся конфигурация. Например, на каких серверах запускать, на каких доменах и так далее.
    3) Программисты выпинываются на прогулку по другим репозиториям в поисках удачных технических решений в похожих проектах.
    4) Пушат код, он заливается на сервачки. Каждая ветка - на свой поддомен, фичи тестятся отдельно. Кодревью, Юниттесты, Мерж реквесты - это все реально помогает.

    В итоге когда все завелось и начало помогать, а не делать больно (примерно через пол года), появилась другая проблема - как нам то же самое соорудить на фронтенде? А это уже совсем другая история...
    Ответ написан
    2 комментария
  • С чего можно начать изучение Symfony и стоит ли начинать знакомство с фреймворками именно с него?

    @ArtemioVegas
    php developer
    Привет!
    Сам не так давно изучаю Симфони, не всё сразу заходит , но изучать интересно, т.к. возможности у фреймворка достаточно большие. Исходный код компонентов достаточно логичен и чист(имхо).
    На русском языке лично я почти не встречал актуальных материалов, зато на английском море, офф документация просто шикарная, да и не настолько там сложный английский чтобы не понять (гугл транслейт помогает).
    По поводу материалов для изучения - есть такой интересный сайт, на котором много актуальных обучающих материалов по симфони (и не только) - https://knpuniversity.com/ курсы ведет Ryan Weaver https://github.com/weaverryan Symfony docs lead, часть контента платная, но текст и листинг кода можно смотреть в любом случае.
    Плюс рекомендую глянуть Демо проект симфони https://github.com/symfony/symfony-demo в котором показывают как надо делать приложения (от разработчиков симфони)
    Ответ написан
    1 комментарий
  • С чего можно начать изучение Symfony и стоит ли начинать знакомство с фреймворками именно с него?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Да, изучение фреймворков обязательно надо начинать с Симфони.
    Ларавель - попсовый фрейворк, который тоже может быть использован правильно, но рекламируется он как инструмент для "фигак-фигак - и в продакшен". Все туториалы по нему показывают, как сделать побыстрее, но этот подход выйдет боком в будущем. Ларавель для изучения - это зло.

    Симфони же сразу приучает, как делать правильно: не дает намусорить в контроллере, приучает делать хелперы без жестких зависимостей, показывает, как делать репозитории для обработки данных. Да это труднее, но избавит от больших проблем в будущем.

    При наличии готового проекта лучше всего изучать именно на этом готовом проекте. Практика в 100 раз лучше любой теории.
    Ответ написан
    2 комментария
  • 404 при попытке сделать REST?

    DarkRaven
    @DarkRaven
    разработка программного обеспечения
    1. Проверьте роутинг, особенно аннотации.
    2. Прекратите использовать продакшен-точку входа и обращайтесь на app_dev.php. У вас могут быть проблемы с роутингом - кэш не перестроен.
    Обращайтесь на localhost/web/app_dev.php/newUser, если вы в dev-окружении
    Ответ написан
    Комментировать
  • Какой opensource проект в качестве примера при изучении symfony 3?

    GTRxShock
    @GTRxShock
    SA
    посмотрите [Knp University] Learn Symfony 3 и будет вам счастье.
    Бест практики описаны, как ориентир можно рефакторинг Фаулера держать под рукой и как ни странно практика, много практики, придерживаясь основных идей: логика в сервисах, работа с базой в репозиториях, сущности простые и прозрачные, контроллеры держим тонкими. Внимательно изучите возможности аннотаций, di, security voter`s, расширения твига, ассеты и прочие ништяки симфони, чтобы возможности для реализации правильной архитектуры были максимальными. Если кажется, что с задачей уже не раз сталкивались коллеги ранее, посмотрите готовые бандлы, чтобы не тратить время на велосипеды (за исключением ситуаций прокачки скилла написания оных) Тут главное соблюдать границу между техническим перфекционизмом и реальностью :)
    Как уже упоминали демо приложение - вполне достойно изучения, а вот насчет Sylius'a неоднозначное впечатление, довольно давно его просматривал, symfony way как-то не проглядывается, хотя вполне занятно и интересно сделано.

    и помните, что это всего лишь фреймворк, даже если под копирку делать, гарантии что все будет верно нет, тут главное научиться думать в новых реалиях (а не пытаться перенести подходы другого фреймворка и ругать, что все плохо заточено)
    Ответ написан
    1 комментарий
  • Docker контейнер останавливается после запуска?

    @RidgeA
    Он не падает - он работает как и должен: останавливается после выполнения команды.
    Если потом надо в нем запустить веб-сервер то сделать можно как-то так

    CMD ./vendor/bin/doctrine-module migrations:migrate && <some_command_to_start_server>
    Ответ написан
    Комментировать
  • Куда двигаться дальше senior разработчику? Новый язык, технологии, opensource, стартап?

    @devunion
    Начну с конца. Суммарный вектор равен нулю именно потому, что ваши временные цели не являются целями. Они есть способ решить проблему накопившейся неудовлетворенности. По этому и интерес пропадает спустя какое-то время. Сама по себе такая цель не зажигает.

    Я был на вашем месте лет 5-6 назад. Точно так же достиг в Java определенного уровня, после которого все стало как-то не интересно. Новые задачи перестали быть новыми. Творческий процесс программирования стал машинальным кодингом. Думаю, подобный процесс выгорания характерен для любой профессии, не только для программирования. Психолого говорят, что профессионализм достигается примерно за 5 лет. Дальше рекомендуется менять работу.

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

    Можно еще в погоне за новыми проектами поискать работу на Upwork/Freelancer. Но Java-разработчикам там тяжело. Либо будет мелочь на подобие студенческих курсовых, либо будет нужен удаленный разработчик на фуллтайм в большой проект. Именно то, что вы сейчас делаете.

    В конечном итоге, я полностью поменял специализацию с Java на неширокую нишу, которая раньше являлась хобби. В финансовом плане было более выгодно за счет узкой специализации.

    Сейчас и этот пятилетний цикл подходит к концу. Пилю стартап :-).

    Как правильно посоветовал Дмитрий, нужно найти то, что нравится и идти в эту сторону. Должно быть "движение к" вместо текущего "движения от". Критерий выбора: "настоящая работа такой и должна быть – чтобы вы готовы были за нее доплачивать, лишь бы вам разрешили ее делать." - НЛПшники.

    Удачи!
    Ответ написан
    2 комментария