• Как сделать простой php маршрутизатор (роутер)?

    devg
    @devg
    I am Yenior software developer
    Очень простой роутер, не без недостатков, но довольно быстрый и легко использовать, дописывать под себя.

    <?php
    /**
     * Простой роутер
     * @devg
     */
    final class RouterLite {
    
      public static $routes = array();
      private static $params = array();
      public static $requestedUrl = '';
    
      /**
       * Добавить маршрут
       */
      public static function addRoute($route, $destination=null) {
        if ($destination != null && !is_array($route)) {
          $route = array($route => $destination);
        }
        self::$routes = array_merge(self::$routes, $route);
      }
    
      /**
       * Разделить переданный URL на компоненты
       */
      public static function splitUrl($url) {
        return preg_split('/\//', $url, -1, PREG_SPLIT_NO_EMPTY);
      }
      
      /**
       * Текущий обработанный URL
       */    
      public static function getCurrentUrl() {
        return (self::$requestedUrl?:'/');
      }
    
      /**
       * Обработка переданного URL
       */
      public static function dispatch($requestedUrl = null) {
    
          // Если URL не передан, берем его из REQUEST_URI
          if ($requestedUrl === null) {
            $uri = reset(explode('?', $_SERVER["REQUEST_URI"]));
            $requestedUrl = urldecode(rtrim($uri, '/'));
          }
    
          self::$requestedUrl = $requestedUrl;
    
          // если URL и маршрут полностью совпадают
          if (isset(self::$routes[$requestedUrl])) {
            self::$params = self::splitUrl(self::$routes[$requestedUrl]);
            return self::executeAction();
          }
    
          foreach (self::$routes as $route => $uri) {
            // Заменяем wildcards на рег. выражения
            if (strpos($route, ':') !== false) {
              $route = str_replace(':any', '(.+)', str_replace(':num', '([0-9]+)', $route));
            }
    
            if (preg_match('#^'.$route.'$#', $requestedUrl)) {
              if (strpos($uri, '$') !== false && strpos($route, '(') !== false) {
                $uri = preg_replace('#^'.$route.'$#', $uri, $requestedUrl);
              }
              self::$params = self::splitUrl($uri);
                
              break; // URL обработан!
            }
          } 
          return self::executeAction();
      } 
    
     /**
       * Запуск соответствующего действия/экшена/метода контроллера
       */
      public static function executeAction() {
        $controller = isset(self::$params[0]) ? self::$params[0]: 'DefaultController';
        $action = isset(self::$params[1]) ? self::$params[1]: 'default_method';
        $params = array_slice(self::$params, 2);
    
        return call_user_func_array(array($controller, $action), $params);
      }
    
    }
    ?>


    Пример использования:
    <?php
    // маршруты (можно хранить в конфиге приложения)
    // можно использовать wildcards (подстановки):
    // :any - любое цифробуквенное сочетание
    // :num - только цифры
    // в результирующее выражение записываются как $1, $2 и т.д. по порядку
    
    $routes = array(
      // 'url' => 'контроллер/действие/параметр1/параметр2/параметр3'
      '/' => 'MainController/index', // главная страница
      '/contacts' => 'MainController/contacts', // страница контактов
      '/blog' => 'BlogController/index', // список постов блога
      '/blog/:num' => 'BlogController/viewPost/$1' // просмотр отдельного поста, например, /blog/123
      '/blog/:any/:num' => 'BlogController/$1/$2' // действия над постом, например, /blog/edit/123 или /blog/dеlete/123
      '/:any' => 'MainController/anyAction' // все остальные запросы обрабатываются здесь
    ));
    
    // добавляем все маршруты за раз
    RouterLite::addRoute($routes);
    
    // а можно добавлять по одному
    RouterLite::addRoute('/about', 'MainController/about');
    
    // непосредственно запуск обработки
    RouterLite::dispatch();
    ?>


    UPDATE (07.08.2017):
    Дальнейшее развитие данного роутера см. в проекте Litero (https://github.com/bit55/litero)
    Ответ написан
    1 комментарий
  • Как сделать сеточную галерею на css?

    AlekseyNemiro
    @AlekseyNemiro
    full-stack developer
    Примерно так:
    ul{list-style-type:none;}
    li{display:inline;}
    li:nth-child(4):after { content:"\A"; white-space:pre; }

    \A - перевод строки.

    Либо можно ограничить ширину элементов.
    Ответ написан
    Комментировать
  • Как сделать сеточную галерею на css?

    L0k1
    @L0k1
    чистым css - это блоки сделать inline-block, а общему контейнеру column-count: 3;

    w3bits.com/css-masonry
    Ответ написан
    1 комментарий
  • Почему большинство программистов выбирают Mac?

    gluck59
    @gluck59
    Виртуальный глюк
    Не "программистов", а "людей, которые за компьютером РАБОТАЮТ".
    Примерно вот почему:

    U1Zp8PTy91s.jpgaORgD6FLo74.jpg
    Ответ написан
    5 комментариев
  • Как делать сетки в css?

    nanomen
    @nanomen
    front-end разработчик
    Привет!

    Вот пример создания своей сетки (английский)

    Вообще там много всего полезного есть, в поиске надо поискать побольше.
    Ответ написан
    Комментировать
  • Как делать сетки в css?

    oxojeck
    @oxojeck
    У sorax видел
    Ответ написан
    Комментировать
  • Что учить после PHP?

    alex_dm
    @alex_dm
    Я бы посоветовал учить Английский язык. С таким знанием у вас откроются новые горизонты как в дальнейшем изучении, так и в использовании PHP.
    Ответ написан
    Комментировать
  • Что такое такое rest api?

    @eandr_67
    web-программист (*AMP, Go, JavaScript, вёрстка).
    API социальных сетей - это вполне типичные примеры реализации REST API.

    REST (RESTful) - это общие принципы организации взаимодействия приложения/сайта с сервером посредством протокола HTTP. Особенность REST в том, что сервер не запоминает состояние пользователя между запросами - в каждом запросе передаётся информация, идентифицирующая пользователя (например, token, полученный через OAuth-авторизацию) и все параметры, необходимые для выполнения операции.

    Всё взаимодействие с сервером сводится к 4 операциям (4 - это необходимый и достаточный минимум, в конкретной реализации типов операций может быть больше):
    1. получение данных с сервера (обычно в формате JSON, или XML)
    2. добавление новых данных на сервер
    3. модификация существующих данных на сервере
    4. удаление данных на сервере

    Операция получения данных не может приводить к изменению состояния сервера.

    Для каждого типа операции используется свой метод HTTP-запроса:
    1. получение - GET
    2. добавление - POST
    3. модификация - PUT
    4. удаление - DELETE

    Т.е. :

    GET-запрос /rest/users - получение информации о всех пользователях
    GET-запрос /rest/users/125 - получение информации о пользователе с id=125
    POST-запрос /rest/users - добавление нового пользователя
    PUT-запрос /rest/users/125 - изменение информации о пользователе с id=125
    DELETE-запрос /rest/users/125 - удаление пользователя с id=125
    Ответ написан
    20 комментариев
  • Работа с зарубежными клиентами на фрилансе

    buttersmai
    @buttersmai
    1. Не понимаю, что вас смущает. Я с одним клиентом(из России) работаю с лимитом 30-40 часов в месяц, с другим(из США) - 20 часов в неделю. Все это вполне логично, если человеку не нужна ваша полная загрузка, то 50 часов в месяц(~10 часов в неделю) вполне себе адекватная цифра.
    2. Обычно я работал через биржи Odesk/Elance, и обе они предоставляют софт для тайм-трекинга. Для себя же иногда использую toggl.com - довольно простая штука, которая сможет за вас считать потраченное время. И клиенту потом сможете предоставить отчеты.
    Насчет модели оплаты - как fixed price(за проект), так и почасовая. Но лучше, на мой взгляд, почасовая, так как зарубежные заказчики точно так же могут в середине проекта/задачи спохватиться и попросить что-то добавить, изменить и т.д. У меня в процессе работы над одним проектом все на 80% поменялось, так что при сдельной оплате я бы уже перенервничал. А почасовая - норм.

    P.S. а как привлекаете клиентов и куда они вам стучатся(сайт-блог, LinkedIn, skype и т.д.)? То есть, откуда клиенты о вас узнают?
    Ответ написан
    1 комментарий
  • Работа с зарубежными клиентами на фрилансе

    svd71
    @svd71
    Это нормальная практика. Только количество какое то мелкое - 6 8ми-часовых рабочих дней.

    Могут ставить как софт учета времени, могут на слово - но обязательно нужно подавать таймшит - таблицу, где написано в какой день со скольки до скольки работали. По поводу предоплаты и договоров нужно обговаривать заранее. Но учтите: договориться и ударить по рукам - такая же практика на Западе, как и получить бумагу с печатью и росписью у нас. То есть я бы предпочел как то фиксировать разговор (если по скайпу, допустим) или же сохранять все письма пересылки.
    Ответ написан
    2 комментария
  • Почему хабражители не жалуют компании?

    gaelpa
    @gaelpa
    Когда статья пишется от лица компании, глаз автоматически ищет в ней самопиар и рекламные необъективности.
    Когда та же статья пишется частным лицом, [чрезмерно] положительные оценки предмета статьи с большей вероятностью будут расценены как личное восхищение, а не как джинса.
    Ответ написан
    2 комментария
  • Почему хабражители не жалуют компании?

    Iwamoto
    @Iwamoto
    Потому что тут более чем на половину — неадекваты. Их over 9000!
    Ответ написан
    1 комментарий
  • Аналог Basecamp

    MpaK999
    @MpaK999
    Буду!
    workmateapp.com/ — очень неплохой отечественный todo инструмент
    Ответ написан
    Комментировать
  • Аналог Basecamp

    adamant
    @adamant
    Битрикс24 www.bitrix24.ru

    Есть бесплатный тариф.
    Ответ написан
    Комментировать
  • Куда делись Лучшие Комментарии?

    kefirr
    @kefirr Автор вопроса
    Готовлю свой сервис, позже будет статейка:
    habrastats.comyr.com/
    Ответ написан
    1 комментарий
  • Дизайн в опенсорс

    ertaquo
    @ertaquo
    Как вариант, сделать дизайн для qutIM, у разработчиков с этим трудности
    Ответ написан
    Комментировать
  • Дизайн в опенсорс

    dudeonthehorse
    @dudeonthehorse
    Email Developer
    До тысячи не дошло? :) Работы очень приятные.
    Ответ написан
    1 комментарий
  • Никому в стартап/OS-проект дизайнер не нужен?

    @Dracontis
    Java Developer, Django enthusiast
    Попробуйте посмотреть на этом сайте подходящие проекты: programmermeetdesigner.com/
    Ответ написан
    2 комментария
  • Никому в стартап/OS-проект дизайнер не нужен?

    demark
    @demark
    Вы это, если хотите заинтересовать, особенно как дизайнер — оставляйте ссылки на свои работы.
    Ответ написан
    1 комментарий