• Добавить запись в таблицу PostgreSQL, ругается на id?

    @rudikov
    Если у Вас тип integer, то нет.
    Для инкремента нужно использовать тип SERIAL.
    Ответ написан
    4 комментария
  • Как сделать простой 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 комментарий
  • Как использовать слеши в регулярном выражении в Gulp?

    Seasle
    @Seasle Куратор тега JavaScript
    А зачем так делать, когда можно просто
    gulp.src('src/**/*.html')
        .pipe(gulp.dest('build/'));
    Ответ написан
    1 комментарий
  • Как можно оптимизировать использование памяти при работе с экземплярами классов в Python?

    fox_12
    @fox_12 Куратор тега Python
    Расставляю биты, управляю заряженными частицами
    Попробуйте так класс определить:
    class Unit:
      __slots__ = ('number', 'radius', 'width', 'color')
    
      def __init__(self, number, radius, width, color):
    
        self.number = number
        self.radius = radius
        self.width = width
        self.color = color
    
        l.append(self)


    Без использования __slots__
    Partition of a set of 71837 objects. Total size = 6887839 bytes.
     Index  Count   %     Size   % Cumulative  % Kind (class / dict of class)
         0  10000  14  1120000  16   1120000  16 dict of __main__.Unit
         1  12606  18  1099993  16   2219993  32 str
         2  10056  14   729024  11   2949017  43 tuple
         3  10000  14   560000   8   3509017  51 __main__.Unit
         4    561   1   460680   7   3969697  58 type
         5   2512   3   361909   5   4331606  63 types.CodeType
         6   4892   7   340577   5   4672183  68 bytes
         7   2413   3   328168   5   5000351  73 function
         8  11220  16   317416   5   5317767  77 int
         9    561   1   269392   4   5587159  81 dict of type
    <125 more rows. Type e.g. '_.more' to view.>


    С использованием __slots__:
    Partition of a set of 61841 objects. Total size = 5928031 bytes.
     Index  Count   %     Size   % Cumulative  % Kind (class / dict of class)
         0  12606  20  1099995  19   1099995  19 str
         1  10058  16   729232  12   1829227  31 tuple
         2  10000  16   720000  12   2549227  43 __main__.Unit
         3    561   1   460512   8   3009739  51 type
         4   2512   4   361909   6   3371648  57 types.CodeType
         5   4892   8   340583   6   3712231  63 bytes
         6   2413   4   328168   6   4040399  68 function
         7  11220  18   317416   5   4357815  74 int
         8    561   1   269392   5   4627207  78 dict of type
         9    400   1   181760   3   4808967  81 set
    <124 more rows. Type e.g. '_.more' to view.>
    Ответ написан
    Комментировать