Задать вопрос
  • Как командно разрабатывать php проект?

    copist
    @copist
    Empower people to give
    Инфраструктура
    * Создайте репозиторий на Bitbucket или GitHub.
    * Создайте себе локально копию репозитория и локально поднимите базу данных с одинаковой структурой
    * Если в базе требуются изменения, создавайте "миграции", которые обновят структуру данных или сами данные.
    * Свои изменения по коду, так же как и миграции, отправляйте в репозиторий

    Ещё есть возможность создания виртуальных серверов для разработки или использование online IDE. Решает кучу проблем, если интернет быстрый.
    * https://compilr.com/ Полноценная среда разработки
    * https://koding.com/ Среда разработки с предустановленным веб-сервером и элементами социальной сети
    * online-php.com Online IDE
    * https://codeanywhere.com/ Среда разработки. Код можно хранить в облаке, а также в Dropbox, Google Drive, FTP, github.
    Другие тулзы для совместной работы в online

    Промежуточные версии
    Если вы географически недалеко друг от друга, то просто периодически показывайте, что у вас получается.
    Если нет, пользуйтесь Skype Shared Screen, Join.me и другие аналогичные продукты, чтобы вместе смотреть и обсуждать голосом. А лучше TeamViewer, чтобы можно было вместе и посмотреть, и поправить.

    Обновление сервера
    Изменения на сервер устанавливайте из того-же репозитория. Не забудьте про миграции. Озаботьтесь вопросами безопасности. Хотя бы так: скрыть файлы .git
    Ответ написан
    Комментировать
  • Кто-нибудь использует много веб-фреймворков в новой разработке?

    copist
    @copist
    Empower people to give
    Во-первых, это вопрос личных предпочтений и предпочтений команды.
    Во-вторых, это требования обстоятельств при промышленной эксплуатации.

    На старте, обычно, выбирается то, что лучше знаешь. Да хоть бы и без фреймворков. Переключаться на старте - это тратить время впустую. Главная задача - получить MVP.

    После получения MVP (Minimum Viable Product) и "зелёного света" на промышленную разработку, можно оценить результаты тестирования на потенциальных потребителях, выяснить предполагаемую нагрузку и, при необходимости, пересмотреть платформу. Сменить программную или аппаратную архитектуру, язык программирования или их комбинацию, фреймворк - стек технологий это называется.

    Через некоторое время после начала промышленной эксплуатации могут возникнуть проблемы, связанные с неверно выбранной архитектурой или недостаточной производительностью. Команда выбрает путь: допилить текущее решение, использовать альтернативное решение или написать ещё раз с учётом возникших обстоятельств.

    Есть проекты, которые жёстко костылят и они таким образом живут годы. Вплоть до того, что там PHP4 и отображение прямо в файлах с бизнес-логикой, зато страницы выдаются за миллисекунды.
    Есть проекты, которые уже несколько раз переписывали с нуля, потому что охренеть какая сложная штука получается и без достаточно высокого уровня абстракции его очень сложно наращивать.
    Есть те, где не костылили и не меняли платформу, а просто увеличили производительность сервера до небес.
    Ответ написан
    Комментировать
  • Почему возникает Bad Request (#400) на форме в yii 2.0?

    @mrlipuzhin
    <input type="hidden" name="_csrf" value="<?=Yii::$app->request->getCsrfToken()?>" />
    Ответ написан
    1 комментарий
  • Как совместить EasyPHP и Laravel?

    Sanasol
    @Sanasol Куратор тега Laravel
    нельзя просто так взять и загуглить ошибку
    Если это ваш рабочий компутер (не сервер), то 80 порт занят скайпом 99%

    А в качестве сервера все советуют OpenServer.

    Я в свое время пользовался Vertrigo, и до сих пор бы пользовался :)
    Ответ написан
    2 комментария
  • Какой набор инструментов выбрать для реализации веб-проекта?

    evnuh
    @evnuh
    Поиск Гугл помог мне, впусти и ты его в свой дом
    PHP + любая БД + фреймворк - самое быстрое начало. Фреймворк возьмите самый примитивный, который реализует MVC, роутит маршруты и немножко шаблонизирует. Есть микро-форки популярных фреймворков типа Silex (Symfony) silex.sensiolabs.org и Lumen (Laravel) lumen.laravel.com
    P.S. Wordpress ни в коем случае не берите, это готовая cms, а чтобы её допиливать нужно 1) жопу вместо головы 2) не для новичка совсем.
    Ответ написан
    7 комментариев
  • Какова роль интерфейсов в ООП?

    Приведу пример на коленке. Хотим, например, написать абстрактную файловую систему. Для начала, определим интерфейс, для ФС:

    interface FileSystemInterface {
      public function write($file, $data);
      public function read($file);
    }


    Затем, хочу реализацию интерфейса ФС для работы с файликами:

    class OSFileSystem implements FileSystemInterface {
      public function write($file, $data) {
         // открываем файлик, пишем данные
      }
    
      public function read($file) {
        // открываем файлик, возвращаем данные
      }
    }


    Вдруг, кому-то захотелось файловую систему в облаке. Окей, не проблема, реализуем это:
    class CloudFileSystem implements FileSystemInterface {
      public function write($file, $data) {
         // открываем соединение с облаком, пишем данные
      }
    
      public function read($file) {
        // открываем соединение с облаком, возвращаем данные
      }
    }

    Пусть у нас есть кой-то код, работающий с файловой системой, назовем его "Хранилище файлов". Пусть он выглядит примерно так:

    class FileStorage {
      protected $Fs;
      
      public function __construct(FileSystemInterface $Fs) {
        $this->Fs = $Fs;
      }  
    
      public function saveFile() {
        $this->Fs->write('file.txt', 'file data');
      }
    
      public function getFile() {
        return $this->Fs->read('file.txt', 'file data');
      }
    }


    Отлично! Теперь мы можем хранилищу файлов отдать любой объект с реализованным интерфейсом FileSystemInterface. Пример:

    // Хранилище файлов работает с файловой системой ОС:
    $FS = new OSFileSystem();
    $FileStorage = new FileStorage($Fs);
    $FileStorage->getFile();
    
    // Хранилище файлов работает с файловой системой в облаке:
    $FS = new CloudFileSystem();
    $FileStorage = new FileStorage($Fs);
    $FileStorage->getFile();


    Использование интерфейса, в данном случае. позволяет нам писать только реализацию работы файловой системы, а бизнес-логика, работающая с файловой системой никак не меняется, она знает, что в любом случае файловая система реализует интерфейс FileSystemInterface и может без опаски использовать методы этого интерфейса.
    Ответ написан
    14 комментариев
  • Поможете с выбором локального сервера?

    Ashlst
    @Ashlst
    Фанат эстетики и красивых решений.
    3 комментария
  • Как организовать загрузку файлов в форме?

    vakorovin
    @vakorovin
    Разработчик
    Здравствуйте! Не раскрыли вы полностью ваш вопрос, но постараюсь ответить, исходя из наших проектов на yii2.
    Если используется механизм, при котором файлы можно прикреплять на этапе создания некой модели (скажем Portfolio), и загружаются они сервер посредством ajax-запроса (к примеру https://github.com/hayageek/jquery-upload-file), то возникает ситуация, что привязываться то еще не к чему (объект класса Portfolio еще не сохранен), а файлы уже на сервере. На этот случай используем поле hash, значение которого уникально, и именно по нему привязываются файлы. Т.е. при создании нового объекта Portfolio сразу генерируем уникальный hash, передаем его в форму создания, и с ним грузим аяксом файлы. При желании можно повесить cron-задачу для удаления из файловой системы файлов, которые привязаны к несуществующему Portfolio.hash.

    Далее, сама модель. Берем официальную документацию:

    https://github.com/yiisoft/yii2/blob/master/docs/g...

    Расширяем как нам угодно, например так:

    class File extends \yii\db\ActiveRecord
    {
        public $file;
    
        public function rules()
        {
            return [
                [['file'], 'file'],
                [['filename', 'parent_id'], 'required'],
                [['parent_id'], 'integer'],
                [['filename', 'path'], 'string', 'max' => 255],
                [['description'], 'string']
            ];
        }


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

    $model = new File();
            $model->file = UploadedFile::getInstance($model, 'file');


    и назначаем все остальные параметры, будь то parent_id или что-то еще (включая генерацию нового имени для хранения в файловой системе). Далее, если модель проходит валидацию - сохраняем ее в БД и сохраняем файл в файловой системе:

    if ($model->file && $model->validate()) {                
                $model->file->saveAs('uploads/' . $model->file->baseName . '.' . $model->file->extension);
            }


    Одно уточнение. Если загружать файлы по одному, и только в форме показывать несколько полей, то это решается средствами js, повесить кнопку для создания очередных fileInput с именем File[][file] и textInput File[][description] - проблем не составит. А вот если требуется закинуть их сразу пачкой, то выходов 2 - либо как в указанном по ссылке примере - в одной модели разрешить мультизагрузку, и уже из нее (после валидации) создавать нужные вам модели, либо (что мне кажется логичнее) играться с методом formName(), который будет возвращать нужное имя аттрибута из формы.

    Т.е. в базовом случае поля формы имею имена File[file], File[description], File[id]. В нашем же случае получаются такие имена:

    File[0][file], File[0][description], File[0][id];
    File[1][file], File[1][description], File[1][id];
    File[2][file], File[2][description], File[2][id];


    Теперь в контроллере в цикле проходим

    foreach (Yii::$app->request->post('File') as $sn => $file){
            $model = new File;
            $model->fakeFormName = "File[{$sn}]";
            $model->file = UploadedFile::getInstance($model, 'file');
        }


    В примере выше мы заранее создали свойство $fakeFormName, в которое поместим требуемое для каждого случая базовое имя полей формы и вернем его значение в методе formName(), в таком случае UploadedFile::getInstance($model, 'file') сработает как надо.

    Уф, не знаю, насколько доходчиво разъяснил, что-то может потерял в потоке сознания, но думаю основную суть и опорные точки разъяснил. Если что-то непонятно, отпишитесь, я распишу подробнее (проектов на Yii2 много, все включают работу с файлами в той или иной степени, есть разные реализации, в том числе прямо сейчас пишем файловый менеджер для нашей админки на yii2).
    Ответ написан
    Комментировать
  • Дефицит специалистов - так всё-таки это правда или миф?

    Jeiwan
    @Jeiwan
    А вы посмотрите на те вопросы, которые тут люди задают, посмотрите, какие проблемы люди пытаются решить. 30% вопросов об одном и том же: как начать что-то делать. На другие 60% вопросов ответ можно найти самостоятельно. 10% вопросов действительно чего-то стоят. А ведь все эти вопросы как раз и задают такие вот "специалисты".
    Люди не хотят самостоятельно думать, самостоятельно решать задачи. Даже не то чтобы решать, а просто найти ответ в интернете, так как 99% проблем уже решено кем-то другим. Люди не хотят просто хоть немного напрячься. Чтобы где-то работать программистом, не нужно много ума: достаточно уметь искать информацию в интернете. Но и на это не все способны. Люди не умеют работать. Поэтому на фриланс-биржах так много откликов, поэтому заказчики постоянно обжигаются на таких откликах и поэтому изо всех сил держатся за одного хорошо разработчика.
    Любого человека, который что-то делает, который самостоятельно решает задачи, в любой компании с руками оторвут и деньгами завалят. Людей много, а способных работать — единицы.
    Ответ написан
    4 комментария
  • Как обучиться созданию правильной архитектуры сайта?

    AlexXYZ
    @AlexXYZ
    O Keep Clear O
    Знаете, наверное нельзя этому обучиться по книге. На самом деле есть особый вид знания, о котором в книге не напишут и о нем никто не говорит, потому что "это" у каждого свое - это знание о том, как не надо делать. Тайна этого сакрального знания скрывается в бездне подсознания из опыта неудавшихся и загубленных проектов или самонадеянных обещаний, о которых иногда даже стыдно вспомнить. О своих неудачах никто не напишет книгу, к сожалению, хотя почитать на эту тему есть чего:
    citforum.ru/database/articles/proekt_bd_part1.shtml

    Вообще, чтобы написать хорошую программу надо заниматься интеграцией, а вы пишете, что для вас это сложно и вы ленитесь. Но именно этим вам и надо заниматься.
    "-Братан, я не ел три дня! - как не ел? Надо заставлять себя!"
    Читайте по фреймворку в день (иногда и одного примера достаточно, чтобы понять, что фреймворк не нужен), смотрите примеры его использования, сохраните эту привычку в течении года и все будет ок. )
    Ответ написан
    Комментировать
  • Где вы храните пароли?

    edinorog
    @edinorog
    Троллей не кормить!
    https://ru.wikipedia.org/wiki/KeePass но онли форточки. Автоматический ввод только с Ослика и только то что не страшно профукать.
    Ответ написан
    5 комментариев
  • Как переквалифицироваться из эникейщика в программиста?

    zolt85
    @zolt85
    Программист
    Всем привет, это снова я.
    Молодой человек! Вам 23! ВСЕГО! А Вы уже как я, по-старчески, ворчите. Я таких как Вы, вижу ежедневно. Сейчас поясню. В моем городе туго с программистами, хотя город молодежный, продвинутый (в Томске я живу). Мы постоянно ищем людей, сейчас в сторону удаленных разработчиков уже смотрим, потому что на собеседования приходят такие как Вы. Не в плане опыта, а в плане запросов. 23 года, опыта никакого нет, но нужно мне минимум 40 тыр. Родной! За что? Пойми, чтобы понять какой-ты как разработчик, с тобой нужно поработать пару месяцев, а в среднем первый "выхлоп" от тебя будет только через полгода. Поэтому такой мой Вам совет, если хотите развиться как разработчик, стисните зубы, объясните все жене, и идите джуниором. Лучше в Java или C#. Набирайтесь опыта. В нашей сфере работодатели в основном адекватные и видят, когда от Вас уже есть толк. И не стесняются повышать ЗП.

    Удачи Вам!
    Ответ написан
    13 комментариев
  • Объясните пожалуйста код на js?

    delphinpro
    @delphinpro Куратор тега JavaScript
    frontend developer
    Самовызываемая анонимная функция
    (function(){
    })();

    Такая функция будет тут же выполнена. jQuery - это параметр, который передается в функцию. $ - переменная, по которой будет доступен переданный параметр внутри функции.
    Эта конструкция эквивалентна следующей
    var myFunc = function($){
    };
    myFunc(jQuery);

    За исключением того, что не создается лишняя переменная в глобальной области видимости (myFunc), ради чего все и делается.
    Ответ написан
    1 комментарий
  • Как настроить sendmail на PHP через яндекс?

    He11ion
    @He11ion
    PHP-monkey
    help.yandex.ru/mail/support-old.xml#ssl-errors
    Статья 2010 года, с той давней поры необходимо TLS шифрование, может ли его данная программа - попробуйте выяснить у гугла. Варианты от Яндекса по ссылке выше.
    Ответ написан
    Комментировать
  • В чем суть Yii2?

    index0h
    @index0h
    PHP, Golang. https://github.com/index0h
    Что именно может ускорить разработку сайта, ведь весь функционал я могу и сам написать?


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

    Пример ситуации: удаление страницы, должно удалить запись из БД и редиректнуть на прошлую страницу, если все ок - показать сообщение "все ок", если возникли ошибки - вывести какие именно ошибки возникли.
    Задача тривиальная, с помощью самописа решается довольно просто: пишем в сессию, выводим и удаляем из сессии. Ваш коллега решая подобную задачу тоже напишет свой костыль потому, что в мире существует всего один человек, который знает как реализована задача вывода, он не будет долго сидеть и разбираться:

    * а подходит ли ваше решение под его задачу
    * что будет если ваше решение сделать более абстрактным
    * что сломается в случае ошибки

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

    suguby
    @suguby
    программист, python, django, mysql, git, hg, linux
    Написать скрипт, который сканит диру одним концом, а другим - лезет в базу: есть ли там ссылка на изображение? если нет - удаляем файл. Скрипт строчек на 10-20-30.
    Ответ написан
    5 комментариев
  • Как оптимальнее удалить все файлы, не упоминающиеся в БД?

    65536
    @65536
    Самому надо на днях это будет делать. Думаю сделать влоб так как это однократная операция. Может быть порезче получится если составить два списка. В одном имена картинок в папке, в другом имена картинок из базы. Вычесть из первого списка второй - получится список картинок, которые надо удалить
    Ответ написан
    2 комментария