91 lines
		
	
	
		
			2.4 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
			
		
		
	
	
			91 lines
		
	
	
		
			2.4 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
| <?php
 | |
| 
 | |
| namespace Objects\Router;
 | |
| 
 | |
| use Elements\Document;
 | |
| use Objects\Context;
 | |
| use Objects\Search\Searchable;
 | |
| use Objects\Search\SearchQuery;
 | |
| use ReflectionException;
 | |
| 
 | |
| class DocumentRoute extends AbstractRoute {
 | |
| 
 | |
|   use Searchable;
 | |
| 
 | |
|   private string $className;
 | |
|   private array $args;
 | |
|   private ?\ReflectionClass $reflectionClass;
 | |
| 
 | |
|   public function __construct(string $pattern, bool $exact, string $className, ...$args) {
 | |
|     parent::__construct($pattern, $exact);
 | |
|     $this->className = $className;
 | |
|     $this->args = $args;
 | |
|     $this->reflectionClass = null;
 | |
|   }
 | |
| 
 | |
|   private function loadClass(): bool {
 | |
| 
 | |
|     if ($this->reflectionClass === null) {
 | |
|       try {
 | |
|         $file = getClassPath($this->className);
 | |
|         if (file_exists($file)) {
 | |
|           $this->reflectionClass = new \ReflectionClass($this->className);
 | |
|           if ($this->reflectionClass->isSubclassOf(Document::class)) {
 | |
|             return true;
 | |
|           }
 | |
|         }
 | |
|       } catch (ReflectionException $exception) {
 | |
|         $this->reflectionClass = null;
 | |
|         throw $exception;
 | |
|       }
 | |
| 
 | |
|       $this->reflectionClass = null;
 | |
|       return false;
 | |
|     }
 | |
| 
 | |
|     return true;
 | |
|   }
 | |
| 
 | |
|   public function match(string $url) {
 | |
|     $match = parent::match($url);
 | |
|     if ($match === false || !$this->loadClass()) {
 | |
|       return false;
 | |
|     }
 | |
| 
 | |
|     return $match;
 | |
|   }
 | |
| 
 | |
|   protected function getArgs(): array {
 | |
|     return array_merge(parent::getArgs(), [$this->className], $this->args);
 | |
|   }
 | |
| 
 | |
|   public function call(Router $router, array $params): string {
 | |
|     try {
 | |
|       if (!$this->loadClass()) {
 | |
|         return $router->returnStatusCode(500, [ "message" =>  "Error loading class: $this->className"]);
 | |
|       }
 | |
| 
 | |
|       $args = array_merge([$router], $this->args, $params);
 | |
|       $document = $this->reflectionClass->newInstanceArgs($args);
 | |
|       return $document->load($params);
 | |
|     } catch (\ReflectionException $e) {
 | |
|       return $router->returnStatusCode(500, [ "message" =>  "Error loading class $this->className: " . $e->getMessage()]);
 | |
|     }
 | |
|   }
 | |
| 
 | |
|   public function doSearch(Context $context, SearchQuery $query): array {
 | |
|     try {
 | |
|       if ($this->loadClass()) {
 | |
|         $args = array_merge([$context->router], $this->args);
 | |
|         $document = $this->reflectionClass->newInstanceArgs($args);
 | |
|         if ($document->isSearchable()) {
 | |
|           return $document->doSearch($query, $this);
 | |
|         }
 | |
|       }
 | |
| 
 | |
|       return [];
 | |
|     } catch (\ReflectionException) {
 | |
|       return [];
 | |
|     }
 | |
|   }
 | |
| } |