PHP OOP-Kernframework


Answers

Wenn dieses Projekt Bilder enthält, wo sollte ich die Bildklasse laden, um diese zu verarbeiten? Sollte ich es in das Projektmodell laden wie $ this-> images = new Images (); und haben eine Funktion innerhalb des Modells

Ja. Das Ziel des Modells besteht darin, die Geschäftslogik so zu kapseln, dass Sie die Algorithmen nur einmal schreiben und sie mehrere Male teilen müssen. Was ich tun würde, wenn ich Sie wäre, ist das Hinzufügen einer getImages() -Methode zum Projektmodell, da die Bilder ein direktes Attribut für ein Projekt sind, so dass jedes Projekt weiß, wie es seine eigenen Bilder abrufen kann.

Ihrem Code fehlen einige Schlüsselkonzepte im Vergleich zu ORMS, mit denen ich gearbeitet habe (Hydration und Peer / Table), also werde ich versuchen, bei Ihrem Code zu bleiben. Sie können die Bilder über das Projektobjekt abrufen und dann über die Ansicht auf zwei Arten auf die Bilder verweisen:

// Controller
$this->project = new Project();
$this->projectImages = $project->getImages(); // Implemenation #2

// View

// Implemenation #1 (reference to object initialized in controller)
<?php foreach ($project->getImages() as $image): ?>
<img src="<?php echo $image['path'] ?>" />
<?php endforeach ?>

// Implemenation #2 (reference to separate variable initialized in controller)
<?php foreach ($projectImages as $image): ?>
<img src="<?php echo $image['path'] ?>" />
<?php endforeach ?>

Oben ist nur demonstrativ, aber sollte Ihnen eine Idee geben. Ich würde vorschlagen, dass Sie sich Doctrine ansehen. Es ist ein bewährtes und stabiles ORM, das viel von dem liefert, was Sie zu schreiben versuchen, und es fügt die fehlenden Komponenten hinzu, die ich bereits erwähnt habe; Hydration, Objektbeziehungen und Tabellenklassen zusammen mit vielen anderen Features wie verschachtelten Sets.

Question

Ich schreibe gerade diese Frage, damit einige von euch mir vielleicht auf die richtige Weise zeigen können. Ich wärme mich langsam auf OOP auf und beginne das Konzept zu verstehen. Ich möchte einen guten, soliden Kern oder eine solide Grundlage für den Einsatz als CMS-Backend erstellen. Es wird auch MVC verwenden. Ich habe http://gilbitron.github.com/PIP/ als MVC-Basis verwendet.

Was ich nicht herausfinden kann, ist folgendes:

Sag, auf der Projektseite im Backend habe ich 2 Abschnitte: HTML Text und Projekte und ich sollte sie beide bearbeiten können. Die URI wäre etwas wie: // Domäne / Backend / Projekte (die Methode wäre der Index und zeige die 2 Abschnitte)

Wenn ich auf Projekte klicke, wie soll es gehandhabt werden? // Domäne / Backend / Projekte / Projekte / oder // Domäne / Backend / Projekte / Liste /

Ein Schritt weiter, ein Projekt wird einige Bilder oder eine Galerie halten: // domain / backend / projects / edit / 5 / gallery / 2

Meine Frage hier ist, zuerst: wäre das ein guter Weg zu gehen und noch wichtiger, wie würde dies in OOP umgesetzt werden

der Hauptprojektleiter:

class projects {

    function index(){
        // view index
    }

    function edit{
        $project = new Project();
        $projectdata = $project->load(5);
    }
}

Ein einzelner Projektcontroller

class project {

    function __construct(){
        $this->projectmodel = $this->loadModel('project_model'); // prepare the model to be used
    }

    function load($id){
        $this->projectmodel->loadproject($id);
    }
}

Projektmodell

class project_model extends model { //extends for DB  access and such

    function __construct(){
        // do stuff
    }

    function loadproject($id){
        return $this->db->query("SELECT * FROM projects where id=" . $id . " LIMIT 1");
    }
}

Jetzt meine Frage. Wenn dieses Projekt Bilder enthält, wo sollte ich die Bildklasse laden, um diese zu verarbeiten? Sollte ich es in das Projektmodell laden wie $ this-> images = new Images (); und haben eine Funktion innerhalb des Modells

function loadimages($id){
    $this->images->load($id);
}

und dann wären Bilder so etwas wie:

class image extends model { //extends for DB  access and such 

    function __construct(){
    }

    function load($id){
        return $this->db->query("SELECT * FROM project_images where id=" . $id . " LIMIT 1");
    }
}

Es scheint, Controller und Modelle werden auf diese Weise gemischt. Aber auf eine logische Art und Weise ist ein Projekt ein Container, der projektinfo enthält, was Text, Bilder und vielleicht Videos sein kann. Wie würde ich das auch logisch ausrichten?