CMS路由在MVCCMS路由在MVC(CMS Routing in MVC)

2019-05-12 11:51发布

我PHP创建我自己的MVC框架,以学习更高级的编程手段。 我已经得到了框架起来,但是运行我有一个关于当前路由方法的问题。 我希望框架支持后台CMS恭维前端网站。 问题是,我的路由结构的工作原理是这样- mywebsite.com/controller/method/id路由引擎排序信息到一个这样的数组

segments 0 => controller, 1 => method, 2 => id

现在,如果我访问mywebsite.com/projects需要我什么,我已经建立了作为一个管理页面。 不仅我希望这是访问只能从mywebsite.com/admin/projects,我希望mywebsite.com/projects带我去前台。

所以,如果我想访问mywebsite.com/projects我想它呈现“前”控制器,推“项目”入法。 如果我访问mywebsite.com/admin/projects我想它加载的项目控制器。

下面是整个当前路由类,如下所示。

<?php

class Request {

    //url domain.com/controller/method/other
    //holds url segments 0 => controller, 1 => method, 2 => other, etc
    public $segments;
    function  __construct() {
        $this->parse_globals();
    }

    function parse_globals(){
        //$uri = preg_replace("|/(.*)|", "\\1", str_replace("\\", "/", $_SERVER['REQUEST_URI']));
        $uri = (empty($_GET['rt'])) ? '' : $_GET['rt'];
        $this->segments = array_filter(explode('/', $uri));
        if (in_array("admin", $this->segments)) {
            array_shift($this->segments);
        }
        print_r($this->segments);
        //remove index php
        if( reset($this->segments) == 'index.php') {
            array_shift ($this->segments);
        }
    }

    function controller(){
        return $this->segment(0);
    }

    function method(){
        return $this->segment(1);
    }

    function param( $str ){
        return isset($_REQUEST[$str]) ? $_REQUEST[$str] : false;
    }

    function segment( $no ){
        return isset($this->segments[$no]) ? $this->segments[$no] : false;
    }
}

Answer 1:

而不是简单地使用explode()以URL的段分开,你可以使用一组正则表达式模式。

例如,这下行话会尝试匹配的首创action ,并在action中存在这些检查是否有controller之前设置:

'/(:?(:?\/(?P<controller>[^\/\.,;?\n]+))?\/(?P<action>[^\/\.,;?\n]+))?/'

大多数PHP框架用不同的方式来产生这样的模式,用简化的符号。 这样,您可以设置这对于每个图案部分是必需的,哪些是可选的。 而且还可以为选装件提供后备值。

这就是说...

开始做的东西太复杂与框架CMS之前,你可能会投资一些额外的时间在研究OOP。 我建议至少观看MISKO Hevery和罗伯特C.马丁讲座。 仅仅因为你想,你知道如何写一个类,并不意味着,你理解面向对象编程。

更新

我在上市材料少这个答案 。 您可能会发现它们非常有用,

此外这里还有两个讲座,是不是在回答以上:

  • 干净的代码我:参数
  • 清洁守则三:功能


Answer 2:

我的理解是,有三层路由情况:

基本一个:

/<controller>/<action>/<parameters>    

一个特殊的一个用于管理面板(其中,“管理员”将是一种独立的模块的):

/<module>/<controller>/<action>/<parameters>

最后的“/项目”的特殊情况下,它映射到“/正面/项目”。

在这种情况下,你需要让你的路由类更灵活,以便它可以处理任何类型的路由方案。 在这样的Kohana框架,这将与规则,如来完成:

Route::set('adminModule', 'admin/projects')
    ->defaults(array(
        'controller' => 'projects',
        'action'     => 'admin',
    ));

Route::set('projectPage', 'projects')
    ->defaults(array(
        'controller' => 'front',
        'action'     => 'projects',
    ));

Route::set('default', '(<controller>(/<id>(/<action>)))')
    ->defaults(array(
        'controller' => 'index',
        'action'     => 'index',
    ));

显然,这只是一个例子,但你的想法。 基本上,你要提供一些合理的默认路由(如控制器/操作/ ID),但你还需要允许用户配置其他路线。



Answer 3:

我目前正在开发它的目标是在极端高性能 PHP路由器。 你或许可能要看一看。

https://github.com/c9s/Pux

我们还提供了一个模式编译器,做同样的事情,你的。 但你可以写一个简单的路径,而不是复杂的图案。

例如,你可能会写这样的事情:

 /product/:id/:name       [ id => '\d+', name => '\w+' ]

供参考:

PUX为48.5x快于静态路由调度symfony的路由器,31X更快的正则表达式调度。 (安装PUX扩展)

PUX尽量不消耗计算时间动态地建立的所有路由(如Symfony的/路由)。 相反,PUX编译你的路线为纯PHP阵列缓存,编译后的路线可以从缓存非常快装。

随着PUX PHP扩展的支持,您可以载入并派遣1.5〜2倍比纯PHP PUX更快的路由。



文章来源: CMS Routing in MVC