2012-04-07 2 views
0

Я пишу поисковую систему библиотеки, где пользователь может искать по различным критериям (например, автор, название, издатель и т. Д.) С помощью CodeIgniter. Итак, я определил интерфейс BookSearch который все классы, ответственные за поиск в базе данных будет осуществлятьОборация OOP с помощью моделей CodeIgniter

interface BookSearch{ 
/** 
Returns all the books based on a given criteria as a query result. 
*/ 
public function search($search_query); 
} 

Если я хочу осуществить поиск, основанный на авторов я могу написать ему класс AuthorSearch, как

class AuthorSearch implements BookSearch extends CI_Model{ 

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

public function search($authorname){ 
    //Implement search function here... 
    //Return query result which we can display via foreach 
} 
} 

Теперь, Я определяю Контроллер, чтобы использовать эти классы и показывать свои результаты,

class Search extends CI_Controller{ 

/** 
These constants will contain the class names of the models 
which will carry out the search. Pass as $search_method. 
*/ 
const AUTHOR = "AuthorSearch"; 
const TITLE = "TitleSearch"; 
const PUBLISHER = "PublisherSearch"; 

public function display($search_method, $search_query){ 
    $this->load->model($search_method); 
} 
} 

Здесь я ударил свою проблему. В руководстве CodeIgniter указано, что для вызова метода в модели (т. Е. search) я пишу $this->AuthorSearch->search($search_query). Но поскольку у меня есть имя класса классов поиска как строки, я не могу действительно делать $this->$search_method->search($search_query) правильно?

Если бы это было на Java, я бы загрузил объекты в мои константы. Я знаю, что PHP5 имеет тип намека, но целевая платформа для этого проекта имеет PHP4. Кроме того, я ищу более «CodeIgniter» способ сделать эту абстракцию. Любые намеки?

ответ

1

Вы действительно можете сделать $this->$search_method->search($search_query). Также в CI вы можете назначить имя библиотеки по своему усмотрению.

public function display($search_method, $search_query){ 
    $this->load->model($search_method, 'currentSearchModel'); 
    $this->currentSearchModel->search($search_query); 
} 
1

Что вы хотите сказать о модели драйвера. Вы можете, по сути, делать то, что вы предлагаете не может быть сделано:

<?php 
$this->{$search_method}->search($search_query); 

CodeIgniter имеет CI_Driver_Library & CI_Driver классы, чтобы сделать это (см CodeIgniter Drivers).

Однако я обнаружил, что обычно проще реализовать интерфейс/расширить абстрактный класс, как вы делаете. Наследование работает лучше, чем драйверы CI.

Смежные вопросы