2012-03-24 16 views
5

Jestem spróbować coś z tym komentarzem idei Code Igniter Controller/Model name conflictskontroler CodeIgniter i model o takiej samej nazwie Collison

Znajdź Nazwisko klasa zmienną na rdzeń/CodeIgniter.php:

$class = $RTR->fetch_class(); i zmienić tak:
$class = 'Controller' . $RTR->fetch_class();

teraz zmienić nazwę kontrolera:

class ControllerUser extends CI_Controller { ...

Działa, teraz mogę korzystać z modelu użytkownika i kontrolera użytkownika. Ale moje pytanie brzmi: czy to ma sens? lub Czy problem? (przepraszam mój zły angielski)

+0

Oto dlaczego powinieneś spróbować znaleźć framework, który umożliwia pracę z PHP5.3 [namespaces] (http://php.net/manual/en/language.namespaces.php). Chociaż nienawidzę tej struktury, FuelPHP może być logicznym krokiem dla ciebie. Jest to całkiem nowy widelec CI. To oczywiście, jeśli masz jakąkolwiek kontrolę nad tym, która struktura jest używana lub jesteś na etapie, na którym jest to możliwe. Jeśli nie, po prostu zachowaj to dla rozważenia, kiedy odbierzesz kolejny projekt. –

+0

Nie wiem, skąd wziął się pomysł z FuelPHP to widelec CI. Nie jest, został zbudowany od zera, nie ma nic wspólnego z CI i nie jest zgodny. – WanWizard

Odpowiedz

5

Aby obejść ten problem, zwykle większość ludzi dodać „_model” przyrostek do nazwy klasy modelu

myślę, że lepiej jest dodać przyrostek do kontrolerów zamiast, ponieważ są one prawie nigdy nie odwołuje swojej klasie imiona w twoim kodzie.

Najpierw musimy rozszerzyć klasę Routera.

Tworzenie ten plik „application/libraries/MY_Router.php”

class MY_Router extends CI_Router { 
    var $suffix = '_controller'; 

    function __construct() { 
     parent::CI_Router(); 
    } 

    function set_class($class) { 
     $this->class = $class . $this->suffix; 
    } 

    function controller_name() { 

     if (strstr($this->class, $this->suffix)) { 
      return str_replace($this->suffix, '', $this->class); 
     } 
     else { 
      return $this->class; 
     } 

    } 
} 

Teraz edytuj „system/CodeIgniter/CodeIgniter.php”

linii 153:

if (! file_exists(APPPATH.'controllers/'.$RTR->fetch_directory().$RTR->controller_name().EXT)) 

wiersza 158:

include(APPPATH.'controllers/'.$RTR->fetch_directory().$RTR->controller_name().EXT); 

Następnie edit: „System/Biblioteki/Profiler.php”, linia 323:

$output .= " 
<div style="color:#995300;font-weight:normal;padding:4px 0 4px 0">".$this->CI->router->controller_name()."/".$this->CI->router->fetch_method()."</div>"; 

Source

+0

nie działa. 404 Nie Znaleziono. – musa

+0

@musa, który był z rozwiązaniem hmvc, Sprawdź moją edycję i aktualizację – Starx

+0

nie powinno być 'parent :: __ construct()'? Od czasu PHP5 nastąpiła zmiana w sposobie wykonywania konstrukcji ... to znów CI jest nadal semi-php4 frameworks. –

1

Tak to wygląda. Codeigniter to ścisłe środowisko obiektowe. Oznacza to, że jeśli masz 2 lub więcej obiektów o tej samej nazwie, nazwa obiektu nie jest wystarczająco unikatowa.

W twoim przypadku model to procesor danych i kontroler klasy, która łączy twój widok z modelem. Więc logicznie trzeba nazwać coś takiego:

Twój model będzie: "Model_User", "użytkownik_bazy_danych" lub "UserList"

Twój kontroler będzie: "Użytkownik", Controller_User lub UserController

W przypadku modelu sugeruję użycie Db_User (krótkie, ale przejrzyste nazwy) iw przypadku kontrolerów sugeruję użycie "Użytkownik" (skrót i klasa, która definiuje użytkownika, gdy jest połączony z modelem i widokiem dla tego użytkownika)

Nigdy nie miałem problemów z korzystaniem z moich systemów kodów sygnalizacyjnych takich jak ten

+0

Nie używam liczby mnogiej, ponieważ mówię o liście lub tabeli. Użytkownicy na przykład są ściśle mówiącymi właściwościami listy –

7

nie będę modyfikować rdzeń CodeIgniter. Po uaktualnieniu utracisz tę zmianę.

Zrobiłem dwie rzeczy w przeszłości: 1. nazwane moi modele User_model 2. nazwanych moje kontrolerów jak mnogiej, a moje modele jak pojedynczej.

Teraz robię to drugie. Semantycznie ma to sens, ponieważ nazwa kontrolera znajduje się w adresie URL, więc ścieżki wyglądają jak app_path/users/username. Ponadto model zazwyczaj modeluje pojedynczego użytkownika, więc ma to również sens.

Można również śledzić dyskusję ze społecznością na ten temat tutaj: http://codeigniter.uservoice.com/forums/40508-codeigniter-reactor/suggestions/1269847-controller-prefixes

+0

Używam datamapper, więc nie chcę tworzyć User_model. ale tak, modele Użytkowników, kontrolerów Użytkownicy mogą być. również znalazłem ten http://phpfour.com/blog/2009/09/codeigniter-controller-naming-convention-modified/ co sądzisz? – musa

+0

aż do punktu # 2 idzie, jak dotąd ma sens, i myślę, że jest to nieco bardziej przyjazne SEO, ale chciałbym uzyskać więcej referencji na ten temat. – Jahmic

1

Dlaczego nie po prostu zrobić swoje kontrolery liczbie pojedynczej i modeli/db tabele mnogiej?

Powiązane problemy