Задать вопрос
  • Как вычислить размер страницы при печати?

    SilenceOfWinter
    @SilenceOfWinter Автор вопроса
    Вопрос в том где ставить page-break-after, можно было бы сделать несколько вариантов через media но перед таблице идет текст.
  • HMVC в PHP: как начать использовать?

    SilenceOfWinter
    @SilenceOfWinter Куратор тега PHP
    DimNS:
    1. Закрывающий тег ?> нужен только в нативных view файлах. Заголовки (headers) должны содержаться в response объекте контроллера и выводится при его отображении (метод __toString). Начальный слэш в строках аля "\MyApp\Pages\Page1\Controller::index()" не требуется, он добавляется для того чтобы избежать совпадения имен с классами php:
    namespace MyApp;
    class ArrayObject extends \ArrayObject {}

    2. Начни использовать git: заведи аккаунт на https://github.com и размещай проект там. Клиент https://desktop.github.com .
    3. Старайся не использовать статику без крайней надобности, иначе это уже не ООП. Выноси статические методы\свойства в отдельные классы-хэлперы.
    4. Вначале создаются интерфейсы\абстрактные классы, а затем уже классы-пустышки, они должны содержать основные методы симулирующие их реальную работу.
    <?php 
    
    namespace Author\Package\HTTP;
    
    interface RouteInterface
    {
        public function __construct($name, $regExpUri, array $regExpParams = [], array $defaultParams = []);
        /**
         * Проверка ссылки на соответствие роуту.
         * @param string $uri
         * @return this
         */
        public function checkUri($uri);
        /**
         * @param string $name
         * @param mixed $default
         * @return mixed
         */
        public function getParam($name, $default = null);
        /**
         * @param string $name
         * @return bool
         */
        public function existsParam($name);
        /**
         * @return array
         */
        public function getParams();
    }
    
    interface ResponseInterface
    {
        const STATUS_100 = 'Continue';
        // ...
        const STATUS_200 = 'OK';
        // ...
        const STATUS_300 = 'Multiple choices';
        // ...
        const STATUS_400 = 'Bad request';
        // ...
        const STATUS_500 = 'Internal server error';
        /**
         * @param array $options
         * @return void
         */
        public function __construct(array $options = array());
        /**
         * @param string $name
         * @param string $value
         * @return this
         */
        public function setHeader($name, $value);
        /**
         * @param string $name
         * @return array|false Array of values or false if not set
         */
        public function getHeader($name);
        /**
         * @param bool $rewrite
         * @return this
         */
        public function sendHeaders($rewrite = false);
        /**
         * @return int
         */
        public function getStatus();
        /**
         * @param int $code
         * @return this
         */
        public function setStatus($code);
        /**
         * @param string $body
         * @return this
         */
        public function setBody($body);
        /**
         * @return string
         */
        public function getBody();
        /**
         * @return string
         */
        public function __toString();
    }
    
    interface RequestInterface
    {
        const GET     = 'GET';
        const POST    = 'POST';
        const PUT     = 'PUT';
        const DELETE  = 'DELETE';
        const HEAD    = 'HEAD';
        const OPTIONS = 'OPTIONS';
        const TRACE   = 'TRACE';
        const CONNECT = 'CONNECT';
        /**
         * @param string|true $uri If true when it's initial request
         * @param array $options
         * @return void
         */
        public function __construct($uri, array $options = array());
        /**
         * @return ResponseInterface
         */
        public function execute();
        /**
         * @return string
         */
        public function getMethod();
        /**
         * @param string $method
         * @return this
         */
        public function setMethod($method);
        /**
         * return $this->execute();
         * @return string
         */
        public function __toString();
    }
    
    interface ControllerInterface
    {
        /**
         * @param RequestInterface $request
         * @param ResponseInterface $response
         * @return void
         */
        public function __construct(RequestInterface $request, ResponseInterface $response);
        /**
         * @return ResponseInterface
         */
        public function execute();
        /**
         * @return void
         */
        public function beforeAction();
        /**
         * @return void
         */
        public function afterAction();
    }
    
    interface ExceptionInterface
    {
        /**
         * @param RequestInterface $request
         * @return this
         */
        public function setRequest(RequestInterface $request);
    }
    
    class Exception extends \Exception implements ExceptionInterface
    {
        /**
         * @var null|RequestInterface
         */
        protected $request; 
        /**
         * @var array Error code => name
         */
        protected $errors = [
            E_ERROR              => 'Fatal error',
            E_WARNING            => 'Warning',
            E_PARSE              => 'Parse error',
            E_NOTICE             => 'Notice',
            E_USER_ERROR         => 'User error',
            E_USER_WARNING       => 'User warning',
            E_USER_NOTICE        => 'User notice',
            E_STRICT             => 'Strict',
            E_RECOVERABLE_ERROR  => 'Recoverable error',
            E_DEPRECATED         => 'Deprecated',
            E_USER_DEPRECATED    => 'User deprecated'
        ];
    
        /**
         * @return array
         */
        final public function getErrors()
        {
            return $this->errors;
        }
    
        /**
         * @param RequestInterface $request
         * @return this
         */
        final public function setRequest(RequestInterface $request)
        {
            $this->request = $request;
            return $this;
        }
    }
    
    Router::getInstance()->setRoute(new Route(
        'default', // Имя роута
        '(<directory>/(<controller>/(<action>/(<id>/))))', // RegExp для пути
        [ // RegExp для проверки параметров
            'directory'  => '[0-9a-zA-Z]+',
            'controller' => '[0-9a-zA-Z]+',
            'action'     => '[0-9a-zA-Z]+',
            'id'         => '[0-9]+'
        ],
        [ // Значения по умолчанию
            'directory'  => 'Frontend',
            'controller' => 'Page',
            'action'     => 'Index'
        ]
    ));
    // Первичный запрос
    $request = new Request(true, $_SERVER);
    // Получение ответа
    $response = $request->execute();
    // ... и его вывод на экран
    echo $response->sendHeaders(true)->getBody();
  • Какие книги можно купить?

    SilenceOfWinter
    @SilenceOfWinter Куратор тега PHP
    vovauadanel: по шаблонам\patterns тогда поищи, если из мо или нерезиновой могу даже подкинуть мукулатуры
  • Как оптимизировать мой php код?

    SilenceOfWinter
    @SilenceOfWinter Куратор тега PHP
    AllDecay: а ты профилирование сделай, не факт что большинство времени не уходит на ответы самого vk, надо найдти то место, где возникают задержки.
  • Как оптимизировать мой php код?

    SilenceOfWinter
    @SilenceOfWinter Куратор тега PHP
    riot26: vk\fb не использую ни ооп, ни тем более mvc. Гуру тоже не рекомендуют для одностраничных приложений использовать бизнес шаблоны - все зависит от предметной области. Хотя про right way это в точку.
  • Как оптимизировать мой php код?

    SilenceOfWinter
    @SilenceOfWinter Куратор тега PHP
    AllDecay: главный принцип: не трогай пока работает нормально)
  • Как оптимизировать мой php код?

    SilenceOfWinter
    @SilenceOfWinter Куратор тега PHP
    riot26: Оптимизацией в твоем комменте и не пахнет, это скорее структурирование.
  • HMVC в PHP: как начать использовать?

    SilenceOfWinter
    @SilenceOfWinter Куратор тега PHP
    DimNS: В данном случае своеобразным фасадом выступает контроллер. "3. А вот тут такая загвоздка" - для этого и существует рефакторинг, если модуль написан грамотно, то дописать к нему rest api не составит проблемы. Вообще нужно понимать что в основном с сервера выносятся данные и не всегда есть необходимость в переносе кода, доступ с основного сервера к ним можно получить, например, по ftp\http. И вообще если опыта нет, то даже прочтение соответствующей литературы и советы не всегда помогают, все равно придется переписывать и не раз.
  • HMVC в PHP: как начать использовать?

    SilenceOfWinter
    @SilenceOfWinter Куратор тега PHP
    DimNS: Вместо схемы лучше сделай набросок кода с классами-пустышками, так будет намного проще.
  • HMVC в PHP: как начать использовать?

    SilenceOfWinter
    @SilenceOfWinter Куратор тега PHP
    copal: если бы мы не давали имена вещам, то тебе бы звали не copal, а это и это имело бы.. это это с это ...в смысле, кучу проблем с общением
  • HMVC в PHP: как начать использовать?

    SilenceOfWinter
    @SilenceOfWinter Куратор тега PHP
    copal: Ого! да среди нас сам Джон Гроссман! :)
  • HMVC в PHP: как начать использовать?

    SilenceOfWinter
    @SilenceOfWinter Куратор тега PHP
    DimNS:
    1. Зачем нужен контроллер фасадов если есть API запрос?
    2. Чем больше абстракции, тем меньше скорость. Взять например fb\vk они используют процедурный подход (+самописные версии php) и денормализованные бд.
    Т.е. надо сразу прикинуть какие модули потом будут перенесены на внешние сервера и добавлять взаимодействие через API только для них, остальные же должны работать напрямую с внутренними модулями.
  • Как изменить переменную?

    SilenceOfWinter
    @SilenceOfWinter
    Roman: с этими "матрешками" и неполным кодом не поймешь с ходу, если соображу отпишусь
  • Слайдер, который выводить все картинки из определенной папки?

    SilenceOfWinter
    @SilenceOfWinter
    lemme: ну вот, ты его только запутал) теперь сам ему трави про nodejs и иже с ним)
  • HMVC в PHP: как начать использовать?

    SilenceOfWinter
    @SilenceOfWinter Куратор тега PHP
    DimNS: Вначале надо привести модули к определенному виду, например, обеспечить REST получение\отправку данных модулями т.е. нужно снабдить основные модели REST контроллерами.
  • Изменение высоты блока?

    SilenceOfWinter
    @SilenceOfWinter
    devele: решений тут масса, например сделай p тоже с position: absolute + bottom: 0
  • Влияет ли тип таблицы на кодировку в MySQL?

    SilenceOfWinter
    @SilenceOfWinter Куратор тега PHP
    trase8: тип не влияет, по крайней мере я о таком не слышал, да и проверить, поменяв тип таблицы, довольно просто
  • HMVC в PHP: как начать использовать?

    SilenceOfWinter
    @SilenceOfWinter Куратор тега PHP
    DimNS: Если ты собираешься переносить часть кода на далееекие севера :) , то все все равно потребуется организовывать запросы к ним и никакие фасады тут не помогут. А вот разбитие кода по независимым модулям поможет т.к. облегчит их переезд на Магадан в случае чего.. По поводу самих запросов советую почитать спецификацию REST\WDSL (первый вариант попроще наверное будет). Основной смысл всего выше сказанного - ослабить связь между классами, если все упирается в это, то HMVC не единственное решение и вообще не решение т.к. перед тем как начать его использовать нужно создать соответствующее окружение.