یک مشکل نسبتا مهم توی این سیستم روتینگ وجود داره که بهتره برطرفش کنین تا از تداخل جلوگیری بشه.
توی این روش فرقی نمیکنه که عبارت panel (آدرس بیس روتینگ شما) کجای request_uri میاد.
مثلا شما میخواین پنل شما برای این آدرس کار کنه:
example.com/panel/....
برای این آدرس پنل شما درست نمایش میده.
اما برای این آدرسها هم سیستم روتینگ شما کار میکنه:
example.com/test/panel/....
example.com/category/panel/....
example.com/tags/panel/....
اما باید کاری کنین که این پنل تنها برای بیس آدرسی که میخواین فقط اجرا بشه و برای آدرسهای ناخواسته ایگنور بشه.
یعنی مثلا فقط در صورتی اجرا بشه که فقط panel بعد از آدرس هوم پیج اومد. کافیه که یک شرط توی متدی که داره ریکوئست رو هندل میکنه اضافه کنین به این صورت:
if (preg_match('#^/panel#', $request_uri)) {
$this->dispatch_request( $request_uri );
}
این خط چک میکنه که اگر عبارت panel دقیقا بعد از آدرس سایت اومد سیستم روتینگ رو اجرا میکنه و دیگه اون آدرسهای ناخواسته رو ایگنور میکنه.
کدهای این کلاس اینطوری میشه:
<?php
defined( 'ABSPATH' ) || exit;
class UppRouter {
public function __construct() {
add_action( 'init', [ $this, 'handle_routes' ] );
}
public function handle_routes() {
$request_uri = $_SERVER['REQUEST_URI'];
$request_uri = str_replace('-','_',$request_uri);
این بخشی هست که چک میکنه که عبارت بیس روت شما دقیقا بعد از هوم پیج اومده یانه.؟
if (preg_match('#^/dashboard#', $request_uri)) {
$this->dispatch_request( $request_uri );
}
}
private function dispatch_request( $request_uri ) {
if ( strpos( $request_uri, 'dashboard' ) === false ) {
return;
}
$handler = $this->parse_uri( $request_uri );
$handler_name = $this->format_handler_name( $handler );
if ( ! $this->is_handler_valid( $handler_name ) ) {
$this->display_error_page();
exit;
}
$handler_path = $this->get_handler_file( $handler_name );
require_once $handler_path;
$handlerInstance = new $handler_name;
$handlerInstance->index();
exit;
}
private function parse_uri( $uri ) {
اگر دوست دارین انتهای آدرسهای روتینگ تون تریلینگ اسلش بزارین هم این کد رو جایگزین کنین.
$uri_parts = explode( '/', rtrim( strtok( $uri, '?' ), '/' ) );
return end( $uri_parts );
}
private function is_handler_valid( $handler ) {
$handler_file_path = $this->get_handler_file( $handler );
return file_exists( $handler_file_path ) && is_readable( $handler_file_path );
}
private function get_handler_file( $handler ) {
$handler_file_path = UPP_DIR . DIRECTORY_SEPARATOR . 'panel/controllers/' . $handler . '.php';
return $handler_file_path;
}
private function format_handler_name( $handler ) {
$formatted_handler = ucfirst( $handler ) . 'Controller';
return $formatted_handler;
}
private function display_error_page() {
include UPP_DIR . 'views/panel/error/error.php';
}
}
حتما این مورد لحاظ کنین تا تداخلی توی آدرس بندی هاتون ایجاد نشه. موفق باشین.