Я пытаюсь реализовать вспомогательную функцию, которая помогает мне как бы добавлять маршруты (которые отображаются на контроллеры / действия) в приложении 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, не добавляя файлы везде?
Заранее большое спасибо за ваше время и внимание!
Чтобы вспомогательные функции были доступны глобально, вы должны включить их глобально. Один из способов сделать это — в точке входа вашего приложения (обычно 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()
например, и он хранит функции вне глобального пространства имен.
Как описано здесь Автозагрузчик для функций, у вас есть несколько вариантов, так как для функции нет автозагрузчиков.
Если вы используете composer для управления своими зависимостями, вы можете поместить все свои функции в один файл и добавить "files"
директива к "autoload"
раздел вашего composer.json
файл. Это приведет к тому, что composer сделает за вас грязную работу в сгенерированном автозагрузчике.
Кроме этого, вы можете просто поставить require_once
для файла с вашими функциями в нем в index.php для вашей платформы и все готово.
Вы можете даже взять все свои функции, объединить их в класс как статические методы и просто вызвать их, используя Libraryname::functionname()
Затем, когда вы используете это, автозагрузчик позаботится обо всем за вас, как и с любым другим классом.
Напомним, нет автозагрузчика, но есть много хороших, надежных и чистых вариантов для этой работы.