Я хочу постепенно перенести очень старомодное PHP-приложение на Laravel. Приложение пока не использует общую точку входа, но использует для работы прямые URL-адреса файлов. Итак, чтобы постепенно переходить к функциональности, я хотел бы сначала проверить в своих маршрутах, существует ли URL-адрес в виде физического файла на сервере. Если это так, запустите этот файл. Если нет, пройдите маршруты laravel.
Я просматривал как превосходную публикацию в блоге «Legacy to Laravel » от Tighten, так и более старую статью на PHPArch « Миграция устаревших веб-приложений в Laravel». Они оба предполагают, что существует один интерфейсный контроллер, но в моем приложении это не так.
Каков был бы самый чистый способ реализовать это в Laravel 11?
при использовании «красивых URL-адресов» это уже происходит: веб-сервер проверяет наличие существующих файлов и папок перед передачей их фронтальному загрузчику (точке входа вашего приложения)
Это должно быть тривиально просто. Если вы используете Apache, вам, вероятно, не нужно делать ничего особенного, Laravel уже должен работать таким образом. В каталоге /public
Laravel вы получите файл .htaccess
, который содержит что-то вроде этого:
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^ index.php [L]
Обратите внимание на условия. Если запрошенное имя файла не является каталогом и не является файлом, выполните перенаправление на фронт-контроллер. То есть, если запрошенное имя файла уже существует, Apache просто обработает его как есть, и вы полностью обойдете Laravel. Единственное, что вам может потребоваться сделать, это изменить имя одного из индексных файлов. Вероятно, у вас уже есть index.php
для вашего устаревшего сайта, но Laravel захочет его использовать. Итак, вы можете сохранить существующее наследие index.php
, переименовать index.php
Laravel в laravel.php
, а затем изменить .htaccess
:
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^ laravel.php [L]
В nginx это может выглядеть примерно так:
location / {
try_files $uri $uri/ /laravel.php?$args;
}
Так:
http://example.com/old_page.php
обрабатывается с
/public/old_page.php
http://example.com/new_page
обрабатывается Laravel через фронт-контроллер на /public/laravel.php
.
Если все функции автономны, просто переместите эти
.php
файлы в папкуpublic
вашего приложения Laravel. Затем, как только вы реализовали эту функциональность, замените содержимое файла.php
простым<?php header('Location: http://your-site/laravel/route');
, чтобы переход непосредственно к этому URL-адресу.php
перенаправлял вас на нужную страницу, обрабатываемую Laravel. Вот как мне приходилось переносить устаревшие приложения в новые, но это было только для 1 или 2 URL-адресов, которые люди добавили в закладки; может быть не лучшим решением, если у вас куча файлов.php
, и в любом случае это кажется немного «хакерским».