Эффективные способы реализации вспомогательных функций?

Я пытаюсь реализовать вспомогательную функцию, которая помогает мне как бы добавлять маршруты (которые отображаются на контроллеры / действия) в приложении MVC.

Мой файл index.php выглядит следующим образом.

//  use block
use App\Router;
use App\Config;
use App\Core\Database;
use App\Bootstrap;

// dependencies
$router    = new Router;
$config    = new Config;
$database  = new Database($config);
$bootstrap = new Bootstrap($router, $database);

// routes
require '../App/Routes.php';$bootstrap->router->dispatch($_SERVER['QUERY_STRING']);

И мой файл маршрутов содержит один маршрут, мои маршруты выглядят так.

$bootstrap->router->add('/home', ['controller' => 'home', 'action' => 'index']);

Я бы предпочел просто добавить корни в мой файл, как это …

route('/home', ['controller' => 'home', 'action' => 'index']);

Поэтому мне нужно сделать вспомогательную функцию

вопрос

Благодаря автозагрузке psr-4 я знаю, как использовать классы, когда они мне нужны это менее ясно, когда речь идет о старых функциях самолета. Как я могу аккуратно добавить свои вспомогательные функции в мою MVC Framework, не добавляя файлы везде?

Заранее большое спасибо за ваше время и внимание!

1

Решение

Чтобы вспомогательные функции были доступны глобально, вы должны включить их глобально. Один из способов сделать это — в точке входа вашего приложения (обычно index.php), вам нужен файл, который имеет ваши вспомогательные функции.

Laravel, например, делает это и имеет множество помощников: https://laravel.com/docs/5.1/helpers

Всякий раз, когда я писал свой собственный фреймворк для целей обучения, я обнаруживал, что мне нравится разделять своих помощников по областям функциональности, поэтому я обычно имею папку для помощников, что-то вроде /app/helpers и использовать немного кода, как это в моей точке входа:

foreach (glob("./app/helpers/*.php") as $helper) {
require_once($helper);
}

Помните, что это загрязняет глобальное пространство имен, поэтому будьте очень внимательны и продуманны в своих соглашениях об именах.

Альтернативой является создание Helper класс и иметь методы статически доступны в них, чтобы вы могли вызывать такие вещи, как Helper::route() например, и он хранит функции вне глобального пространства имен.

4

Другие решения

Как описано здесь Автозагрузчик для функций, у вас есть несколько вариантов, так как для функции нет автозагрузчиков.

Если вы используете composer для управления своими зависимостями, вы можете поместить все свои функции в один файл и добавить "files" директива к "autoload" раздел вашего composer.json файл. Это приведет к тому, что composer сделает за вас грязную работу в сгенерированном автозагрузчике.

Кроме этого, вы можете просто поставить require_once для файла с вашими функциями в нем в index.php для вашей платформы и все готово.

Вы можете даже взять все свои функции, объединить их в класс как статические методы и просто вызвать их, используя Libraryname::functionname()Затем, когда вы используете это, автозагрузчик позаботится обо всем за вас, как и с любым другим классом.

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

1

По вопросам рекламы [email protected]