0

所以这个问题来自我创建的另一个问题,你可以在这里找到但是我已经更改了我的代码,所以现在它看起来像这样:

汽车控制器

public function indexAction(){

        $category = new Application_Model_CarMapper();
        $gcat = $this->getRequest()->getPathInfo();

        //get id

        $id = $category->find_id_by_name($gcat); 

        $this->view->title = $category->get_sub_cat_select($id);
    }

这是我在映射器中创建的一个新函数:

public function find_id_by_name($name){

        $select = $this->getDbTable()->query("SELECT * FROM car_category WHERE category_name = '{$name}'");
        $result = $select->fetchAll();

        if(!$result) {
            return;
        }   
        return $result[0]['ID'];
    }

我正在通过标题对其进行测试,但它似乎根本没有显示。我希望它显示特定类别的下拉菜单,例如

car-live.local/cars/Volvo --->“欢迎来到沃尔沃汽车搜索”

car-live.local/cars/BMW ---> “欢迎使用BMW寻车器”

我知道它不起作用,因为我必须进一步拆分 URL,因为现在它正在通过 URL 找到 id,但我不确定如何做到这一点:s 如果你能对此有所了解,将不胜感激.. 谢谢。

[编辑]

新代码:

public function indexAction(){

        $category = new Application_Model_CarMapper();
        $gcat = explode("/", $this->getRequest()->getPathInfo());

        if(isset($gcat['category_name'])) {

        $id = $category->find_id_by_name($gcat); 

        $this->view->title = $category->get_sub_cat_select($id);
        }

    }
4

1 回答 1

1

我不确定我是否正确理解了您的问题,但从代码来看,您似乎在处理 URL 时遇到了问题。所以,让我们举这个例子:

car-live.local/car/Volvo

在你到达后,你indexAction应该爆炸/

这将返回一个包含 URL 的所有组件的数组,然后在这种情况下将最后一个组件Volvo发送到您的find_id_by_name()方法。

我对这个问题的常用方法是遵循以下内容:

  1. 用斜线爆炸;
  2. 获取第一个(在这种情况下car并将其“路由”到汽车类,方法是向构造函数发送该请求的其余部分;
  3. 然后,car类构造函数获取 URL 的下一部分Volvo并将其“路由”为适当的方法,例如getVolvo()或任何您需要的方法......

您可以将其路由到您需要的地方,但只需尝试将处理 URL 的职责委托给适当的类。例子:

/cars/whatEverCar=> 应该按类处理car

/bike/whatEverBike=> 应该按类处理bike

希望这可以帮助。


编辑:

您的find_id_by_name()方法可以有一些 URL,例如:

/car/find_id_by_name/Volvo

我解释得好吗?您可以获取 URL 的一部分并直接调用方法……然后发送 URL 的其余部分。


编辑2:代码示例...

以下代码是您问题的一个非常好的解决方案:

<?php
// Call this class as soon the site stars
class Router {

    public function __construct() {
        // In some really cool way get your full URL, for example I'm gonna use a string...
        $fullURL = "example.com/Car/findCarById/Volvo";

        array_shift($fullURL); // removes "example.com", obvious stuff...

        $explodedUrl = explode("/", $fullURL);

        $targetClass = $explodedUrl[0]; // Temporary store the target is "Car"
        array_shift($fullURL); // Removes "Car", we don't need it anymore...

        $target = new $targetClass($fullURL); // call the Car class responsible for handling all the "Car" related stuff!
    }
}

class Car {

    public function __construct($request) {
        // $request is an array with "findCarById", "Volvo"
        $targetMethod = $request[0]; // Temporary store the target is "findCarById"
        array_shift($request);
        $this->$targetMethod($request);
    }

    private function findCarById($parameter) {
        // $parameter is an array with "Volvo"..
        // Now to your query and other cool stuff with $parameter[0];
        print "I'm the method findCarById() of the class Car called by the main router to find the ID for {$parameter}...";
    }
}

?>

如果您需要向您的Car类添加更多功能,只需添加另一个方法,然后使用他的名字通过 URL 调用它,就像我对findCarById().

警告:此代码可能有小错误,它是在记事本上编写的,未经测试。

于 2013-04-30T13:39:05.703 回答