File: D:/HostingSpaces/SBogers10/momsecurity.komma.nl/app/Exceptions/Solutions/AddSiteIdToModelTable.php
<?php declare(strict_types=1);
namespace App\Exceptions\Solutions;
use Facade\IgnitionContracts\Solution;
use Illuminate\Database\Eloquent\Model;
use Komma\KMS\Core\SectionController;
use Komma\KMS\Sites\HasSiteInterface;
class AddSiteIdToModelTable implements Solution
{
public function getSolutionTitle(): string
{
return 'Add "site_id" column OR remove HasSiteInterface';
}
public function getSolutionDescription(): string
{
//Try to determine the model intelligently, based on the controllers name
$modelName = $this->guessModelNameFromController();
$modelClass = null;
$implementsSiteInterface = false;
if($modelName) {
$modelClass = $this->guessModelClassFromShortClassName($modelName);
$implementsSiteInterface = in_array(HasSiteInterface::class, class_implements($modelClass), true);
}
//Build the solution message, step by step, depending on some conditions.
$message = 'The';
$message .= $modelClass ? ' '.$modelClass.' model' : ' model';
$message .= ' is missing the site_id column in its table';
$message .= $modelClass ? ' ('.(new $modelClass)->getTable().').' : '.';
$message .= ' Please add it (and fix the migration for it). Afterwards it should work, or you may have to refresh your database.';
$message .= $implementsSiteInterface ? ' You can also choose to not implement the '.HasSiteInterface::class.' instead. ' : '';
return $message;
}
public function getDocumentationLinks(): array
{
return [
];
}
/**
* Accepts a name, for example "Page" and iterates through all
* declared classes, and finds the first class that resides in a folder calles Models (case insensitive) or ends with Model (case insensitive).
*
* @param string $modelName
* @return null|string
*/
protected function guessModelClassFromShortClassName(string $modelName) {
$filtered = array_filter(get_declared_classes(), function($declaredClass) use($modelName) {
$regex = '/((?=models\\\)\w+\\\\'.preg_quote($modelName).')|('.preg_quote($modelName).'+Model$)/i'; //Matches for example: App\Pages\Models\Page or App\PageModel
return preg_match($regex, $declaredClass);
});
while($currentClass = array_shift($filtered)) {
if(is_a($currentClass, Model::class, true)) return $currentClass;
}
return null;
}
/**
* Uses the current route's controller to guess it's model name.
*
* @return string|null
*/
protected function guessModelNameFromController() {
$controller = request()->route()->getController();
if(!is_a($controller, SectionController::class)) return null;
$regex = '/(?!\\\)\w+(?=Controller)/'; //Matches for example Page in App\Pages\Kms\PageController
if(preg_match($regex, get_class($controller), $matches)) return $matches[0];
return null;
}
}