Om de voorgestelde URL-structuur te implementeren, moeten we één centrale dispatcher maken die
- Analyseer de gevraagde URL.
- Zou een database doorzoeken om de categorie te vinden en weer te geven.
- Als er geen categorie werd gevonden, zou het proberen het tekstbericht te vinden en weer te geven.
Klinkt als de baan voor een controller. Maar hoe maken we een controller die op elk verzoek reageert? Met behulp van wildcard-routing!
application/config/routes.php
$route['.*'] = 'default_controller';
Nu wordt elk verzoek, ongeacht de URI, doorgestuurd naar Default_controller.php
.
Maar hoe schrijven we controller zonder te weten welke methode zal worden aangeroepen? Er is een manier:de ingebouwde controller-servicemethode _remap
.
Van de documenten :
Dus ik heb mezelf laten fantaseren en een concept Default_controller voor je maken:
application/controllers/Default_controller.php
<?php
defined('BASEPATH') OR exit('No direct script access allowed');
class Default_controller extends CI_Controller {
// Pseudocode ensues
public function _remap()
{
// www.mydomain.com/(someTextHere)
$slug = $this->uri->segment(1);
$result = $this->load_data($slug);
echo $result;
}
private function load_data($slug)
{
// Trying to find a category
$category = $this->category_model->find($slug);
if($category !== false)
{
// Presumably loads view into buffer
// and returns it to the calling method
return $this->load_category($category);
}
Trying to find post
$post = $this->post_model->find($slug);
if($post !== false)
{
return $this->load_post($post);
}
// Neither category nor post found
show_404();
}
private function load_category($category)
{
// http://www.codeigniter.com/user_guide/general/views.html#returning-views-as-data
return $this->load->view("category", array("category" => $category), true);
}
}
Opmerking:testte dit antwoord op de vers gedownloade Codeigniter 3.0.3