Зачем мне это понадобилось покажу позже.А зачем в админке список моделей вообще
какое дело админу до внутреннего устройства исходного кода?
Вы как раз описали ту задачу которую я пытаюсь решить.Список моделей ищется glob по файловой маске. В характерном месте/местах сайта. Обычно эти места прописываются в конфиге, или система сама их знает... В друпал, к примеру, все модели имеют расширение не .php, а .model, так как в нормальной модельке может быть значительно более одного файла. Дальше, когда файл нашелся, его можно попробовать отзеркалить - reflectionClass. так можно получить информацию об общем предке (бывает полезно), проверить параметры ключевых методов, если нет интерфейсов, или настроить автоматом вызов, если так и надо.
Я не могу перечислять явно в этом нет смысла1) перечислить явно (поскольку далеко не все модели - это aggregate roots)
Слишком сложно ради того что бы получить инфу о класее.2) просканировать файловую систему, найти по паттерну нужные php-файлы, преобразовать имя файла в имя класса, подгрузить автолоадером (class_exists), отфильтровать по необходимости reflection-ом
? Проще инклудить неизвестный файл и непонятным классом? иногда нарываясь на синтаксические ошибки ...Слишком сложно ради того что бы получить инфу о класее.
<?php
namespace scenario;
/**
* анализатор логов
*/
/**
* Читалка длинных логов. Греп по IP.
* Class grep_logs_scenario
* @property scaner $scaner
* @tags scanlog
*/
class grep_logs_scenario extends scenario
{
/**
* Сканирование логов по IP
* @param string $log :select[:все|~dir(*.{gz,log})] лог для поиска
* @param string $pattern :text IP для поиска
* @param string $text :text текст для поиска
*/
function do_scanlog($log,$pattern,$text=''){
$this->scaner->newhandle($log);$reg1='';
if(!empty($text)) $reg1=$text;
if(!empty($pattern)) $reg='~'.preg_quote($pattern).'[^\n]+~';
else {
$reg=$reg1;
}
$reg1='~\.(jpe?g|gif|js|ico|css|png)(\?\d+?|)\s+HTTP/1~';
$reg2='~YandexBot/3\.0|AhrefsBot/5\.0~';
do {
$this->scaner->scan($reg,0);
if($this->scaner->found){
$result=$this->scaner->getresult();
$result=$result[0];
if(preg_match($reg1,$result) || preg_match($reg2,$result)) continue;
echo $result. PHP_EOL;
} else
break;
} while (true);
}
А при чем здесь плагины? Вопрос был про модели, а не про плагиныЧтобы предложить админу включить или выключить имеющиеся плагины ?
namespace Lampa;
class LampaLoader
{
function __construct() {
/*
* Здесь можно перечислить те пространства имён и директорию к классам этого пространства,
* которые должны грузиться в первую очередь (например системные)
*/
// $this->addPsr4('Lampa\\', 'system/classes');
}
protected $namespaceMap = array();
protected $prefixMap = array();
public function addPsr4($namespace, $path, $prepend = false)
{
$length = strlen($namespace);
if ('\\' !== $namespace[$length - 1]) {
die('Не пустой PSR-4 префикс должен быть со слешем (\) в конце');
}
$fixPath = static::fixPath(dirname(dirname(__FILE__)) . DIRECTORY_SEPARATOR . $path);
if (is_dir($fixPath)){
$this->namespaceMap[$namespace] = $fixPath;
$this->prefixMap[$namespace[0]][$namespace] = $length;
$this->register();
return true;
}
return false;
}
public function register()
{
spl_autoload_register(array($this, 'autoload'));
}
protected function autoload($class)
{
if (!empty($this->prefixMap[$class[0]])) {
$sortPrefixes = uksort($this->prefixMap[$class[0]], function ($a, $b) {
return strlen($b) - strlen($a);
});
foreach ($this->prefixMap[$class[0]] as $kPref => $vPref) {
if(stristr($class, $kPref)) {
$sPref = $kPref;
break;
}
}
$pathParts = explode('\\', str_replace($sPref, '', $class));
if (is_array($pathParts)){
if (!empty($this->namespaceMap[$sPref])) {
$filePath = $this->namespaceMap[$sPref]. DIRECTORY_SEPARATOR .implode(DIRECTORY_SEPARATOR, $pathParts).'.php';
if (file_exists($filePath)) {
require_once $filePath;
return true;
} else {
return false;
}
}
}
} else {
die('Класс «'.$class.'» не найден в системе');
}
return false;
}
public static function fixPath($path)
{
return str_replace('/', DIRECTORY_SEPARATOR, str_replace('\\', '/', $path));
}
}
return new LampaLoader();
call_user_func()
в 2019 режет глаз