För att implementera den föreslagna url-strukturen måste vi skapa en central dispatcher som skulle
- Analysera den begärda webbadressen.
- Skulle fråga en databas för att hitta och visa kategorin.
- Om ingen kategori hittades skulle den försöka hitta och visa textinlägget.
Låter som jobbet för en controller. Men hur gör vi en kontrollenhet som svarar på varje begäran? Med hjälp av wildcard routing!
application/config/routes.php
$route['.*'] = 'default_controller';
Nu kommer varje begäran, oavsett URI, att dirigeras till Default_controller.php
.
Men hur skriver vi kontroller utan att veta vilken metod som kommer att kallas? Det finns ett sätt:den inbyggda kontrolltjänstmetoden _remap
.
Från dokumenten :
Så jag har låtit mig fantisera och skapa ett koncept Default_controller för dig:
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);
}
}
Obs:testade det här svaret på den nyligen nedladdade Codeigniter 3.0.3