Как написать приложение Zend Framework, которое напрямую обслуживает запросы (сопоставляет URL-адреса с файлами)?

Предыстория: у меня есть устаревшее приложение, которое обслуживает файлы как есть. То есть, когда я перехожу к http://server/subfolder/my_index.php?value=x, он переходит в subfolder в файловой системе и обслуживает файл с именем my_index.php, передает ему параметры URL и возвращает ответ.

Я хочу перейти на стек ZF3, а маршрутизация там другая. Я хочу сохранить модель маршрутизации ZF для новых модулей на ZF3, но также иметь возможность использовать устаревшее приложение как есть, поскольку переписывать это приложение запрещено.

Есть ли способ сделать это?

Не уверен, что это способ сделать это, но я просмотрел слой промежуточного программного обеспечения здесь:

Я не понимаю, как их использовать и помогут ли они мне.

Например, я настроил этот класс и не знаю, что делать дальше.

namespace Application\Middleware;

use Psr\Http\Message\ServerRequestInterface;
use Interop\Http\ServerMiddleware\MiddlewareInterface;
use Interop\Http\ServerMiddleware\DelegateInterface;
use Zend\Http\Response;

class IndexMiddleware implements MiddlewareInterface
{

    public function process(ServerRequestInterface $request, DelegateInterface $delegate)
    {
        $response = new \Zend\Diactoros\Response();
        return $response;
    }
}

person Dennis    schedule 27.06.2017    source источник


Ответы (1)


Если вы посмотрите, какой у вас .htaccess или ваш конфиг Nginx, возможно, у вас будет что-то подобное в проекте ZF3:

RewriteEngine On
# The following rule tells Apache that if the requested filename
# exists, simply serve it.
RewriteCond %{REQUEST_FILENAME} -s [OR]
RewriteCond %{REQUEST_FILENAME} -l [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^.*$ - [L]
# The following rewrites all other queries to index.php. The 
# condition ensures that if you are using Apache aliases to do
# mass virtual hosting or installed the project in a subdirectory,
# the base path will be prepended to allow proper resolution of
# the index.php file; it will work in non-aliased environments
# as well, providing a safe, one-size fits all solution.
RewriteCond %{REQUEST_URI}::$1 ^(/.+)/(.*)::\2$
RewriteRule ^(.*) - [E=BASE:%1]
RewriteRule ^(.*)$ %{ENV:BASE}/index.php [L]

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

person Thomas Dutrion    schedule 27.06.2017
comment
Ясно.. Я попытаюсь переместить свою устаревшую структуру папок с файлами в папку ./public и посмотреть, сработает ли это. - person Dennis; 27.06.2017
comment
это сработало (я положил ZF3 в основную папку). Раньше у меня были мысли перенести устаревшие файлы в public, но я никогда не пробовал этого до сих пор. Но что-то было не так, например, когда файл не был найден, я думаю, что он пытался пройти маршрутизацию ZF3, и это замедлило работу. Может быть. - person Dennis; 28.06.2017
comment
Вместо этого я решил поместить ZF3 во вложенную папку. То есть мое устаревшее приложение не трогается, добавляется новая папка (я назвал ее zf). Это сработало. Затем я переместил все это в одну папку вверх, туда, где конфиг ZF3, поставщик и другие папки оказались в основном DOCUMENT_ROOT. Кажется, это работает. Я вызываю http://host/whatever.php для основного приложения и вызываю http://host/public/ для ZF3. Кажется, теперь я могу иметь лучшее из обоих слов - наследие и ZF3, и все в одном репо (как я и хотел). Бьюсь об заклад, я могу вызвать один из другого, а также. - person Dennis; 28.06.2017
comment
также причина, по которой я сначала установил его в подпапку, заключалась в том, чтобы изолировать ZF3, и потому, что у меня уже есть собственная конфигурация, папки поставщиков. Мне пришлось немного отредактировать composer.json, чтобы объединить два мира вместе. - person Dennis; 28.06.2017
comment
Может ли кто-нибудь опубликовать пример файла виртуального хоста для проекта zf3 с nginx? - person cwhisperer; 13.06.2018
comment
вопрос уже обсуждался: stackoverflow.com/questions/19731555/ - Что-то, что не работает для вас cwhisperer? - person Thomas Dutrion; 13.06.2018