HEX
Server: Microsoft-IIS/8.5
System: Windows NT YDAWBH120 6.3 build 9600 (Windows Server 2012 R2 Standard Edition) AMD64
User: tentjecom_web (0)
PHP: 7.4.14
Disabled: NONE
Upload Files
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;
    }
}