For at implementere den foreslåede url-struktur skal vi oprette én central dispatcher, der ville
- Analyser den anmodede URL.
- Ville forespørge en database for at finde og vise kategorien.
- Hvis ingen kategori blev fundet, ville den forsøge at finde og vise tekstindlægget.
Det lyder som jobbet for en controller. Men hvordan laver vi en controller, der reagerer på enhver anmodning? Ved hjælp af wildcard-routing!
application/config/routes.php
$route['.*'] = 'default_controller';
Nu vil enhver anmodning, uanset URI, blive dirigeret til Default_controller.php
.
Men hvordan skriver vi controller uden at vide, hvilken metode der bliver kaldt? Der er en måde:den indbyggede controller-tjenestemetode _remap
.
Fra dokumenterne :
Så jeg har ladet mig fantasere og skabe et koncept Default_controller til dig:
applikation/controllere/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);
}
}
Bemærk:testede dette svar på den nyligt downloadede Codeigniter 3.0.3