Я обновляю PHP-фреймворк, который я написал. Раньше просто использовали поведение по умолчанию для маршрутизации. Например, рассмотрим случай, когда запрос domain.com/package/controller/method
…
$url = ["package", "controller", "method"];
//Check if package exists...
//Check if controller exists in package...
//Check if method exists in controller...
Это все хорошо, и работает отлично. Тем не менее, я хотел добавить некоторые дополнительные функции в мой маршрутизатор. Эта функциональность заключается в способности определять собственные маршруты и передавать анонимную функцию, которая делает все, что вы хотите.
Однако, предположив, что запрос не соответствует ни одному из пользовательских маршрутов, я хочу использовать функциональность по умолчанию, которую я сейчас имею, чтобы проверить, есть ли дополнительные возможные маршруты. Таким образом, я могу обновлять старые проекты с помощью новой инфраструктуры, не прерывая их, и, кроме того … Мне просто нравится это поведение по умолчанию, потому что большинство временных маршрутов не так уж сложно, и определение маршрутов кажется мне нарушением DRY.
Проблема в том, что я не хочу передавать пользовательские маршруты в виде массива в конструктор объекта. Скорее, я хочу, чтобы пользователь вызывал их как методы базового объекта приложения, аналогично тому, как это обрабатывает laravel или express.
Проблема в том, что я хочу, чтобы проверка маршрута по умолчанию происходила ПОСЛЕ того, как определенные пользователем маршруты были проверены не ранее. Этот квази-код может помочь вам понять, что я имею в виду …
class App
{
__construct
{
//Check Default Routing
}
private function get()
{
//Get Request
}
private function post()
{
//Post Request
}
private function put()
{
//Put Request
}
private function delete()
{
//Delete Request
}
}
app::get();
В приведенном выше случае маршрутизация по умолчанию будет выполняться до вызова пользовательских маршрутов. Я посмотрел на странице PHP консруктор / деструктор и узнал о __destruct
, Однако после прочтения этот вопрос Я немного не уверен, что это сработает.
PHP.net говорит …
Метод деструктора будет вызван, как только нет других
ссылки на конкретный объект или в любом порядке во время выключения
последовательность.
Первая часть этого объяснения звучит как то, что я хочу. И.Е. как только все методы были вызваны для объекта приложения, мы запустим __destruct
функция, которая будет проверять, были ли определенные пользователем маршруты плодотворными, а если нет, проверять, дает ли система маршрутизации по умолчанию какие-либо результаты.
Проблема в том, что я не уверен, что это плохая практика или просто не сработает. Могу ли я потребовать файл, установить свой контроллер, а затем вызвать метод на этом контроллере изнутри __destruct
? Существуют ли ограничения, которые могут повлиять на код в этих контроллерах? Предположим, что есть проблема с использованием __destruct
таким образом, каковы мои альтернативы, помня, что мне не нравится ни одно из этих решений …
Я думаю, ты здесь запутался. Обратите внимание на это из руководства по PHP
Метод деструктора будет вызываться, как только не будет никаких других ссылок на конкретный объект или в каком-либо порядке во время последовательности выключения.
Иными словами, есть две причины вызывать деструктор
unset
все ссылки на экземпляр класса. Это означает, что вы больше не можете напрямую вызывать этот классДругими словами, классу больше нечего делать. Но в своем собственном утверждении вы говорите это
Первая часть этого объяснения звучит как то, что я хочу. И.Е. как только все методы были вызваны для объекта приложения, мы запустим функцию __destruct, которая проверит, были ли определенные пользователем маршруты полезны, а если нет, проверьте, дает ли система маршрутизации по умолчанию какие-либо результаты.
Здесь нет «а также» здесь, чтобы работать с. В этом-то и дело. По факту, Есть очень мало мест, где вы могли бы использовать это.
Что вам нужно, это думать в слоях. Таким образом, у вас будет слой контроллера, который вы будете вызывать для проверки методов. В свою очередь, этот контроллер открывает новый слой, который проверяет пользовательские функции. Этот класс или метод должен что-то вернуть или бросить Exception
если не получится. В случае неудачи он может попытаться использовать методы по умолчанию. Вот как вы должны структурировать свою программу. Попытка использовать деструктор для этого, вероятно, только запутает людей. Сделайте поток данных явным, а не неявным (что и делают магические методы).
Других решений пока нет …