0

Ich habe eine Frage mehr in Bezug auf Stil und Organisation, dass alles andere. Ich habe oft eine einzelne Seite (Controller), die mehrere Ajax-Aufrufe erfordert. Anstatt einen separaten Controller nur für die AJAX-Erstellung nennt, weil das mehr Controller bedeuten würde ich nur Folgendes tun:Separater AJAX-Controller im Vergleich zum Stromregler?

class Management extends MY_Controller 
{ 

    public function __construct() 
    { 
     parent::__construct(); 
     $this->protect->protect(); 
     if ($this->uri->segment(2, 0) !== 0 && !$this->input->is_ajax_request()) { 
      exit('No direct script access allowed'); 
     } 
    } 

    public function index() 
    { 
     $this->load->model('management_model'); 
     $data['row_config'] = $this->management_model->getConfigRows(); 
     $data['row_users'] = $this->management_model->getUsers(); 
     $data['roles'] = $this->management_model->getRoles(); 
     $this->tpl->head(); 
     $this->load->view('management/scripts'); 
     $this->tpl->body(); 
     if ($this->messages->hasMessages()) { 
      $this->output->append_output($this->messages->display()); 
     } 
     $this->load->view('management/manage', $data); 
     $this->load->view('management/current_users', $data); 
     $this->load->view('management/modals', $data); 
     $this->tpl->footer(); 
    } 

    public function get_user_details() 
    { 
     $user = new \Auth\ASUser($_POST['userId']); 
     echo json_encode($user->getAll()); 
    } 

    public function delete_user() 
    { 
     $user = new \Auth\ASUser($_POST['userId']); 
     $user->deleteUser(true); 
    } 

Da der Index die einzige Seite ist, wo ich brauche eigentlich eine richtige Ansicht zu machen, und der Rest sind Ajax-Aufrufe Ich überprüfe einfach das URI-Segment, um zu sehen, ob etwas anderes als der Index existiert und dann überprüfe, ob es eine Ajax-Anfrage ist.

Ist das eine schlechte Übung? Soll ich die AJAX-Anrufe und den View-Controller trennen?

Antwort

1

Ihre Frage ist eine Meinung, die im Gegensatz zu Stack Overflow SOP ist. Aber ich werde meine Meinung trotzdem anbieten.

Ist das schlecht Praxis? Ich denke nicht. Das heißt, warum ein Controller größer als es sein muss? Wenn Ihr Ajax die vollständige CRUD-Funktionalität für einige Seiten verarbeitet, könnte der Controller ziemlich groß sein. Sie könnten besser von einem separaten Controller bedient werden.

Ein Ajax-Aufruf ist eine eindeutige Anfrage an den Server - im Wesentlichen das Gleiche, als wenn der Browser auf eine andere Seite in einem anderen Browser-Tab geleitet wird. Warum nicht diese Anfrage an einen Controller richten, der Ajax gewidmet ist? Man könnte argumentieren, dass ein solcher Controller eine bessere "Trennung der Interessen" bewirkt. Das ist eine gute Übung.

Es gibt eine Technik, um sicherzustellen, dass dieser Controller nur verwendet wird, wenn er von einem Ajax-Aufruf angefordert wird. Ein paar Codezeilen in der Steuerung werden die Bestimmung vornehmen.

class Some_ajax_handler extends CI_Controller 
{ 
    public function __construct() 
    { 
     if(!is_ajax()){ 
      show_404(); 
     } 
     parent :: __construct(); 
     //if needed, do the rest of your construct here 
    } 

    public function get_user_details() 
    { 
    $user = new \Auth\ASUser($_POST['userId']); 
    echo json_encode($user->getAll()); 
    } 
} 

Der Aufruf von show_404(); mit einem Anruf beendet zu exit() so brauchen Sie keine return; Anweisung oder else Block in der Steuerung. Sie können sicher sein, dass jede Methode, die auf diesem Controller aufgerufen wird, tatsächlich eine Ajax-Anfrage ist.

Auf der anderen Seite, wenn die Ansicht eines Controllers Ajax verwendet, um den Inhalt für eine ausgewählte Eingabe oder einen anderen einfachen GET-Aufruf zu erhalten, scheint die Erstellung eines separaten Controllers wie Overkill zu sein.

Übrigens gibt es eine CI-Bibliothek, die Ajax-Aufrufe HERE vereinfacht, die Sie vielleicht interessant finden könnten.

Die eine Kritik, die ich biete, ist nicht über Ajax, sondern über Ihre Verwendung von new, die im Gegensatz zu den "Codeigniter Weg" zum Laden und Verwenden anderer Klassen (Bibliotheken). Aber ich denke, das ist ein anderes Thema.

3

Ehrlich gesagt, ich denke nicht, dass es ein Muster auf, wo Sie Ihre Ajax-Funktionen hinzufügen sollten, vor allem in Codeigniter, die locker für die meisten seiner Struktur gekoppelt ist.

Meiner Meinung nach sollten Sie sich die folgenden Fragen stellen, um herauszufinden, wo Sie Ihre Ajax-Anrufe platzieren sollten.

  1. Sind die zurückgegebenen Daten aus dem Ajax Anruf, bezogen auf den Controller ich bin schon?
  2. Wird ich jemals wieder die gleiche Methode/Funktionalität in einem anderen Controller oder woanders verwenden?
  3. Benötige ich den bereits definierten Konstruktor des Controllers, von dem ich denke, dass ich den Ajaxaufruf setzen sollte?
  4. Zähle ich auf die DRY principle der Softwareentwicklung?
  5. Ist mein Code flexibel, wiederverwendbar usw.?

Jedes Projekt hat eine eigene Philosophie und einen eigenen Workflow. Das Designmuster und die Datenstruktur, nach der Sie entscheiden werden, werden die meisten Ihrer Fragen in Ihrem Codierungsstil lösen.

Verwandte Themen