www.2527.com_澳门新葡8455手机版_新京葡娱乐场网址_
做最好的网站

一周自制PHP框架,Laravel框架路由大比拼

2019-07-06 08:25 来源:未知

小编们怎么要采纳路由?原因1:贰个更了不起的U揽胜极光I

我们怎么要选择路由?

前言

1.URI的改进

缘由1:贰个更加美观好的U福特ExplorerI

1.URI的改进

刚刚初步学PHP时,我们必定写过blog.php?id=1之类的U安德拉I,使用GET情势获得参数。那样的U奥迪Q5I有几个毛病,一是便于被SQL注射攻击,二是维护性可读性差,我们能够相比较上边三种U昂科拉I哪个种类更具有可读性。

www.mysite.com/blog.php?id=1

上边U奇骏I是大家初学PHP最常用的。

www.mysite.com/blog/1

这种UCRUISERI是时下最盛行的UCR-VI,举个例证,举例相当多读书类,电影类网址,都应用了那般的UHavalI,那样的U安德拉I要比index.php?a=1&b=2&c=3&d=4....要切中时弊非常多。

2.贯彻情势

在WEB项目标根目录下写三个.htaccess文本

RewriteEngine On
RewriteRule ^([a-zA-Z0-9/]*)$ index.php/$1

重写法规,让域名前面包车型客车字符串直接做为叁个参数字传送入index.php,那样index.php就改为了你一切WEB应用的主旨,定义了“须求和响应的照耀”。

读过一篇关于Zend Framework2的能力小说《ZF2多级树形路由Route配置实例》,是介绍路由配置的。小编感觉很风趣,那是的急需:

刚刚起始学PHP时,我们自然写过blog.php?id=1之类的UMuranoI,使用GET格局获得参数。那样的UOdysseyI有多个毛病,一是轻巧被SQL注射攻击,二是维护性可读性差,我们能够比较下边两种U牧马人I哪种更享有可读性。

案由2:单一入口机制的易维护性

1.路由数组

一个PHP初学者,刚初步做项目,项目做着做着规模做大了,平日这几个PHP页面给另三个PHP页面用GET方法传值,一时传的值还不住二个,时间一久,你的WEB项目,N个PHP页面就好像贰个犬牙相错的蜘蛛网,让您难以启齿维护。一旦有涂改,会波及比非常多PHP文件,职业量非常的大。

MVC的单纯入口机制得以消除保险难的难题,路由正是一套映射,能够让你一个ULX570I对应贰个格局。

$route=[
    ''=>'IndexController@Index',
    'blog'=>'BlogController@Show',
    'blog/{id}/{name}'=>'BlogController@Show',
];

2.赢得参数

$path=$_SERVER['PATH_INFO'];
$path=ltrim($path,'/');
echo $path.PHP_EOL;

大家在浏览器里输入:www.mysite.com/blog/1后,path变量为/blog/1。使用ltrim函数删除左边包车型客车斜杠,然后使用explode把字符串拆解成数组。

$path_arr=explode('/', $path);

基本代码如下:

if(isset($_SERVER['PATH_INFO'])){
    $path=$_SERVER['PATH_INFO'];
    $path=ltrim($path,'/');
    $path_arr=explode('/', $path);
}

if(isset($path_arr[0])){
    $key=$path_arr[0];
    unset($path_arr[0]);
}
else{
    $key='';
}

if(isset($path_arr[1])){
    $parameters=array_values($path_arr);
}


if(isset($route[$key])){
    $arr=explode('@', $route[$key]);

    $controller=new $arr[0];
    $action=$arr[1];

    if(isset($parameters)){
        $controller->$action($parameters);
    }
    else{
        $controller->$action();
    }   
}
else{
    require 'error.html.php';
}

unset函数能够销毁数组中key和value,可是并不会重新建立索引,所以path_arr[0]是要调用的主宰器类和措施名,path_arr[1]或者path_arr[1..N]就作为传播方法的参数。

重定向和不当页面是WEB系统中最分布的,要是不用路由体制,你或许要没完没了的重新写重定向大概不当页面包车型地铁来得或许跳转代码,有了路由,只供给一句话就足以成功。

/user对应用户列表页面
/user/:user_id对应用户的个人主页,举个例子 /user/AlloVince就对应AlloVince用户的个人主页
/user/:user_id/blog/对应用户的博客列表页面,比如 /user/AlloVince/blog 就能够列出AlloVince写过的Blog
/user/:user_id/blog/:blog_id对应用户的一篇博客小说
方案援引自原作:

www.mysite.com/blog.php?id=1

缘由3:缩短能源的损耗

MVC选拔了调节器(controller)来响应央求(request),每便乞请来时,应该在钦命的二个PHP文件中先河化这几个调控器,并非个别在不一致的PHP文件中做初阶化职业,那样可以削减少资本源的损耗。

'router' => array(
  'routes' => array(
    'user' => array(
      'type' => 'Segment',
      'options' => array(
        'route' => '/user[/]',
        'defaults' => array(
          'controller' => 'UserController',
          'action' => 'index',
        ),
      ),
      'may_terminate' => true,
      'child_routes' => array(
        'profile' => array(
          'type' => 'Segment',
          'options' => array(
            'route' => '[:id][/]',
            'constraints' => array(
              'id' => '[a-zA-Z0-9_-] '
            ),
            'defaults' => array(
              'action' => 'get'
            ),
          ),
          'may_terminate' => true,
          'child_routes' => array(
            'blog' => array(
              'type' => 'Segment',
              'options' => array(
                'route' => 'blog[/]',
                'constraints' => array(
                ),
                'defaults' => array(
                  'action' => 'blog'
                )
              ),
              'may_terminate' => true,
              'child_routes' => array(
                'post' => array(
                  'type' => 'Segment',
                  'options' => array(
                    'route' => '[:post_id][/]',
                    'constraints' => array(
                      'post_id' => '[a-zA-Z0-9_-] '
                    ),
                    'defaults' => array(
                      'action' => 'post'
                    )
                  ),
                  'may_terminate' => true,
                ),
              ),
            ),
          ), //profile child_routes end
        ), //profile end
      ), //user child_routes end
    ), //user end
  ),
),

地方U中华VI是大家初学PHP最常用的。

是或不是必然要用调整器?

看了那篇小说后,作者筹算接纳本身用过的PHP框架来促成那么些路由需要。

www.mysite.com/blog/1

方案1:不用调控器

笔者们未来路由数组里增加一项,value不是一个字符串,而是贰个无名氏函数(Closure)

$route=[
    ''=>'Index',
    'blog'=>'BlogController@Show',
    'blog/{id}/{name}'=>'BlogController@Show',
    'f'=>function(){echo 'hello';}
]; 

这里的route[f]是二个佚名函数,并非叁个说了算器类的法子,所以,我们要把上一节路由代码做一下修改:

if(isset($route[$key])){
    if($route[$key] instanceof Closure){
        $route[$key]();
    }
    else{
        $arr=explode('@', $route[$key]);    
        $controller=new $arr[0];
        $action=$arr[1];    
        if(isset($parameters)){
            $controller->$action($parameters);
        }
        else{
            $controller->$action();
        }
    }
}
else{
    require 'error.html.php';
}

ThinkPHP

这种U猎豹CS6I是近来最流行的U奥迪Q7I,举个例证,比如非常多读书类,电影类网址,都利用了这么的U奇骏I,那样的ULANDI要比index.php?a=1&b=2&c=3&d=4....要简明相当多。

方案2:使用调节器

图片 1

每叁次都require二个html页面是一件很不优雅的事体,所以大家写三个render函数

function render($path,array $args){
    extract($args);
    require($path);
}

接上一篇博客,大家清楚各样UKoleosI对应了叁个主意,不过咱们日常遇到这么的题材:

<?php 

class Controller{
    public function __call($method,$args){
        echo 'has not this function'.$method;
    }
}

class IndexController extends Controller{
    public function Index(){
        echo __CLASS__;
        for($i=1;$i<=20;  $i){
            $data[$i]='content';
        }

        render('template.html.php',['data'=>$data]);
    }
}

class BlogController extends Controller{
    public function Show(){
        echo __CLASS__;
        for($i=1;$i<=10;  $i){
            $data[$i]='blog';
        }
        render('template.html.php',['data'=>$data]);
    }
}

?>

用不用调控器,取决于你的业务复杂度。个人提议选择调整器,不过对于事情很简短的页面跳转或检查,可以一贯写在贰个佚名函数里。

新建叁个ThinkPHP项目:

2.贯彻情势

调节器里写些什么?

大家兴许写过这么的代码:

class IndexController extends Controller{
    public function Index($content){
        return '<html><head></head><body>'.$content.'</body></html>';
    }
}

这么把分界面包车型客车代码嵌入的写法是这一个不便维护的,也是成都百货上千开荒职员(包涵笔者)最胸口痛的写法,因为这种写法并不曾做好分界面与作业逻辑的分离,所以大家须要运用视图。

<html>
    <head>

    </head>

    <body>
        <?php foreach($data as $key=>$value){ ?>   
            <div>
                <?php echo $key.':'.$value; ?>    
            </div>
        <?php } ?>
    </body>
</html>

每二次调用调整器的某部方法时,render函数都会把参数以涉及数组的款型传播,做到“业务逻辑”和“表现”的浅档次分离,可是这种分离还不是最棒的,因为前端开采职员仍旧需求面临以致处理PHP代码,后端开辟职员也可能有和前端人士关系的基金,所今后边某一节,会再谈一种越来越好的分开药方式。

 

复制代码 代码如下:

在WEB项指标根目录下写四个.htaccess文书

composer create-project topthink/thinkphp tp --prefer-dist

RewriteEngine On

RewriteRule ^([a-zA-Z0-9/]*)$ index.php/$1

命令行展现自个儿设置的是3.2.2

重写法规,让域名前边的字符串直接做为一个参数字传送入index.php,那样index.php就产生了您全体WEB应用的宗旨,定义了“须要和响应的投射”。

Installing topthink/thinkphp (3.2.2)
自个儿看ThinkPHP官方网站最新牢固版本是3.2.3。

原因2:单一入口机制的易维护性

本人刻意去packagist官方网址查了一晃,库中稳固版确实是3.2.2。

1.路由数组

自身得利用3.2.3。为啥作者特意纠结这点呢?因为:

四个PHP初学者,刚开头做项目,项目做着做着规模做大了,平常这几个PHP页面给另三个PHP页面用GET方法传值,有的时候传的值还持续二个,时间一久,你的WEB项目,N个PHP页面如同贰个头眼昏花的蜘蛛网,让您麻烦保险。一旦有涂改,会涉及非常多PHP文件,专门的职业量不小。

3.2的路由成效是指向模块设置的,所以U奥迪Q7L中的模块名不能够被路由,路由定义也不以为奇是坐落模块配置文件中。 3.2.3版本初阶扩大全局路由定义帮忙,能够在品种的公共配置文件中定义路由。
也正是说,路由重写的一对是Controller和Action部分,Moudle照旧存在。

MVC的单一入口机制能够消除保险难的主题材料,路由正是一套映射,能够让你三个U奥迪Q5I对应二个格局。

本人期望的是/user,实际不是home/user。(ThinkPHP中暗中认可Module是Home,'DEFAULT_MODULE' => 'Home',能够修改)

$route=[

  ''=>'IndexController@Index',

  'blog'=>'BlogController@Show',

  'blog/{id}/{name}'=>'BlogController@Show',

];

本来,那一个难题也足以修改.htaccess文件的化解。不过,小编只怕决虞升卿装3.2.3。

2.获得参数

在ThinkPHP官方网站下载最新的包,解压。

$path=$_SERVER['PATH_INFO'];

$path=ltrim($path,'/');

echo $path.PHP_EOL;

选择浏览器访谈一下档案的次序的入口文件,让ThinkPHP自动生成了二个暗中认可的使用模块Home。

大家在浏览器里输入:www.mysite.com/blog/1后,path变量为/blog/1。使用ltrim函数删除左边的斜杠,然后使用explode把字符串拆解成数组。

修改公共配置文件tpApplicationCommonConfconfig.php:

$path_arr=explode('/', $path);
<?php
return array(
  // 开启路由
  'URL_ROUTER_ON' => true,
  // URL访问模式,可选参数0、1、2、3,代表以下四种模式:
  // 0 (普通模式); 1 (PATHINFO 模式); 2 (REWRITE 模式); 3 (兼容模式) 默认为PATHINFO 模式
  'URL_MODEL' => 2,
  // URL伪静态后缀设置,为空表示可以支持所有的静态后缀
  // 使用U函数生成URL时会不带后缀
  'URL_HTML_SUFFIX' => '',
  // URL变量绑定到Action方法参数,默认为true
  'URL_PARAMS_BIND' => true,
  // URL变量绑定的类型 0 按变量名绑定 1 按变量顺序绑定,默认为0
  'URL_PARAMS_BIND_TYPE' => 0,
  // 路由配置
  'URL_ROUTE_RULES' => array(
    '/^url$/' => 'Home/User/url',
    '/^user$/' => 'Home/User/index',
    '/^user/([a-zA-Z0-9_-] )$/' => 'Home/User/show?name=:1',
    '/^user/([a-zA-Z0-9_-] )/blog$/' => 'Home/Blog/index?name=:1',
    '/^user/([a-zA-Z0-9_-] )/blog/([0-9] )$/' => 'Home/Blog/show?name=:1&blog_id=:2',
  ),
);
?>

骨干代码如下:

制造文件tpApplicationHomeControllerUserController.class.php:

if(isset($_SERVER['PATH_INFO'])){

  $path=$_SERVER['PATH_INFO'];

  $path=ltrim($path,'/');

  $path_arr=explode('/', $path);

}



if(isset($path_arr[0])){

  $key=$path_arr[0];

  unset($path_arr[0]);

}

else{

  $key='';

}



if(isset($path_arr[1])){

  $parameters=array_values($path_arr);

}





if(isset($route[$key])){

  $arr=explode('@', $route[$key]);



  $controller=new $arr[0];

  $action=$arr[1];



  if(isset($parameters)){

    $controller->$action($parameters);

  }

  else{

    $controller->$action();

  }  

}

else{

  require 'error.html.php';

}
<?php
namespace HomeController;
use ThinkController;
class UserController extends Controller {
  public function url() {
    $name = 'jing';
    $blogId = 1;
    $urls = array(
      U('/user'),
      U("/user/{$name}"),
      U("/user/{$name}/blog"),
      U("/user/{$name}/blog/{$blogId}"),
    );
    foreach ($urls as $url) {
      echo "<a href="{$url}">{$url}<a/><br />n";
    }
  }
  public function index() {
    echo '我是用户列表^_^';
  }
  public function show($name) {
    echo "欢迎你,{$name}";
  }
}
?>

unset函数能够销毁数组中key和value,不过并不会重新建立索引,所以path_arr[0]是要调用的支配器类和方法名,path_arr[1]或者path_arr[1..N]就当做传播方法的参数。

创设文件tpApplicationHomeControllerBlogController.class.php:

重定向和不当页面是WEB系统中最广泛的,假设不用路由体制,你大概要没完没了的再一次写重定向只怕失实页面包车型大巴展现或然跳转代码,有了路由,只要求一句话就能够形成。

<?php
namespace HomeController;
use ThinkController;
class BlogController extends Controller {
  public function index($name) {
    echo "这是{$name}的博客列表";
  }
  public function show($blog_id, $name) {
    echo "{$name}的这篇博客的id为{$blog_id}";
  }
}
?>

缘由3:收缩财富的成本

访问:

MVC选取了调整器(controller)来响应伏乞(request),每回诉求来时,应该在钦点的二个PHP文件中初叶化那么些调控器,并非分别在区别的PHP文件中做起先化职业,那样能够减小能源的损耗。

输出:

是否绝对要用调整器?方案1:不用调节器

复制代码 代码如下:

大家以后路由数组里增添一项,value不是贰个字符串,而是一个佚名函数(Closure)

<a href="/tp/user">/tp/user<a/><br />
<a href="/tp/user/jing">/tp/user/jing<a/><br />
<a href="/tp/user/jing/blog">/tp/user/jing/blog<a/><br />
<a href="/tp/user/jing/blog/1">/tp/user/jing/blog/1<a/><br />

$route=[

  ''=>'Index',

  'blog'=>'BlogController@Show',

  'blog/{id}/{name}'=>'BlogController@Show',

  'f'=>function(){echo 'hello';}

]; 

做客上边4个链接,依次重回:

这里的route[f]是一个无名氏函数,并非多少个操纵器类的法子,所以,大家要把上一节路由代码做一下改换:

笔者是用户列表^_^
欢迎你,jing
这是jing的博客列表
jing的那篇博客的id为1
下边别的框架,也一模二样输出以上内容。

if(isset($route[$key])){

  if($route[$key] instanceof Closure){

    $route[$key]();

  }

  else{

    $arr=explode('@', $route[$key]);  

    $controller=new $arr[0];

    $action=$arr[1];  

    if(isset($parameters)){

      $controller->$action($parameters);

    }

    else{

      $controller->$action();

    }

  }

}

else{

  require 'error.html.php';

}

Zend Framework 2

方案2:使用调节器

利用ZF2龙骨程序创建贰个ZF2类型:

图片 2

composer create-project --stability="dev" zendframework/skeleton-application zf2

每回都require一个html页面是一件很不优雅的事务,所以大家写二个render函数

修改私下认可模块Application的配备文件zf2moduleApplicationconfigmodule.config.php:

function render($path,array $args){

  extract($args);

  require($path);

}
<?php
/**
 * Zend Framework (http://framework.zend.com/)
 *
 * @link   http://github.com/zendframework/ZendSkeletonApplication for the canonical source repository
 * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com)
 * @license  http://framework.zend.com/license/new-bsd New BSD License
 */
return array(
  'router' => array(
    'routes' => array(
      'home' => array(
        'type' => 'ZendMvcRouterHttpLiteral',
        'options' => array(
          'route' => '/url',
          'defaults' => array(
            'controller' => 'ApplicationControllerUser',
            'action' => 'url',
          ),
        ),
      ),
      // The following is a route to simplify getting started creating
      // new controllers and actions without needing to create a new
      // module. Simply drop new controllers in, and you can access them
      // using the path /application/:controller/:action
      'application' => array(
        'type' => 'Literal',
        'options' => array(
          'route' => '/application',
          'defaults' => array(
            '__NAMESPACE__' => 'ApplicationController',
            'controller' => 'Index',
            'action' => 'index',
          ),
        ),
        'may_terminate' => true,
        'child_routes' => array(
          'default' => array(
            'type' => 'Segment',
            'options' => array(
              'route' => '/[:controller[/:action]]',
              'constraints' => array(
                'controller' => '[a-zA-Z][a-zA-Z0-9_-]*',
                'action' => '[a-zA-Z][a-zA-Z0-9_-]*',
              ),
              'defaults' => array(
              ),
            ),
          ),
        ),
      ),
      'user_list' => array(
        'type' => 'Segment',
        'options' => array(
          'route' => '/user[/]',
          'defaults' => array(
            '__NAMESPACE__' => 'ApplicationController',
            'controller' => 'User',
            'action' => 'index',
          ),
        ),
        'may_terminate' => true,
        'child_routes' => array(
          'user' => array(
            'type' => 'Segment',
            'options' => array(
              'route' => '[:name][/]',
              'constraints' => array(
                'name' => '[a-zA-Z0-9_-] ',
              ),
              'defaults' => array(
                'action' => 'show',
              ),
            ),
            'may_terminate' => true,
            'child_routes' => array(
              'blog_list' => array(
                'type' => 'Segment',
                'options' => array(
                  'route' => 'blog[/]',
                  'constraints' => array(
                  ),
                  'defaults' => array(
                    'controller' => 'Blog',
                    'action' => 'index',
                  )
                ),
                'may_terminate' => true,
                'child_routes' => array(
                  'blog' => array(
                    'type' => 'Segment',
                    'options' => array(
                      'route' => '[:blog_id]',
                      'constraints' => array(
                        'blog_id' => '[0-9] ',
                      ),
                      'defaults' => array(
                        'action' => 'show',
                      )
                    ),
                    'may_terminate' => true,
                  ),
                ),
              ),
            ),
          ),
        ),
      ),
    ),
  ),
  'service_manager' => array(
    'abstract_factories' => array(
      'ZendCacheServiceStorageCacheAbstractServiceFactory',
      'ZendLogLoggerAbstractServiceFactory',
    ),
    'aliases' => array(
      'translator' => 'MvcTranslator',
    ),
  ),
  'translator' => array(
    'locale' => 'en_US',
    'translation_file_patterns' => array(
      array(
        'type' => 'gettext',
        'base_dir' => __DIR__ . '/../language',
        'pattern' => '%s.mo',
      ),
    ),
  ),
  'controllers' => array(
    'invokables' => array(
      'ApplicationControllerIndex' => 'ApplicationControllerIndexController',
      'ApplicationControllerUser' => 'ApplicationControllerUserController',
      'ApplicationControllerBlog' => 'ApplicationControllerBlogController',
    ),
  ),
  'view_manager' => array(
    'display_not_found_reason' => true,
    'display_exceptions' => true,
    'doctype' => 'HTML5',
    'not_found_template' => 'error/404',
    'exception_template' => 'error/index',
    'template_map' => array(
      'layout/layout' => __DIR__ . '/../view/layout/layout.phtml',
      'application/index/index' => __DIR__ . '/../view/application/index/index.phtml',
      'error/404' => __DIR__ . '/../view/error/404.phtml',
      'error/index' => __DIR__ . '/../view/error/index.phtml',
    ),
    'template_path_stack' => array(
      __DIR__ . '/../view',
    ),
  ),
  // Placeholder for console routes
  'console' => array(
    'router' => array(
      'routes' => array(
      ),
    ),
  ),
);
?>

接上一篇博客,大家了然种种UOdysseyI对应了一个主意,可是大家平日碰着这么的主题素材:

本条文件是骨架程序中自带的,小编只是修改了router部分和controllers部分。要本身写这么长的文书,那就太为难笔者了。那也是ZF官方发布了三个骨架程序的缘由。

<?php 



class Controller{

  public function __call($method,$args){

    echo 'has not this function'.$method;

  }

}



class IndexController extends Controller{

  public function Index(){

    echo __CLASS__;

    for($i=1;$i<=20;  $i){

      $data[$i]='content';

    }



    render('template.html.php',['data'=>$data]);

  }

}



class BlogController extends Controller{

  public function Show(){

    echo __CLASS__;

    for($i=1;$i<=10;  $i){

      $data[$i]='blog';

    }

    render('template.html.php',['data'=>$data]);

  }

}



?>

创建文件zf2moduleApplicationsrcApplicationControllerUserController.php:

用不用调整器,取决于你的事体复杂度。个人提出选取调节器,不过对于事情很简短的页面跳转或检查,能够直接写在三个无名函数里。

<?php
namespace ApplicationController;
use ZendMvcControllerAbstractActionController;
use ZendViewModelViewModel;
class UserController extends AbstractActionController {
  public function urlAction() {
    $name = 'jing';
    $blogId = 1;
    $urls = array(
      $this->url()->fromRoute('user_list'),
      $this->url()->fromRoute('user_list/user', array('name' => $name)),
      $this->url()->fromRoute('user_list/user/blog_list', array('name' => $name)),
      $this->url()->fromRoute('user_list/user/blog_list/blog', array('name' => $name, 'blog_id' => $blogId)),
    );
    $view = new ViewModel(compact('urls'));
    $view->setTerminal(true);
    return $view;
  }
  public function indexAction() {
    $view = new ViewModel();
    // 禁用布局模板
    $view->setTerminal(true);
    return $view;
  }
  public function showAction() {
    $username = $this->params()->fromRoute('name');
    $view = new ViewModel(compact('username'));
    $view->setTerminal(true);
    return $view;
  }
}
?>

调控器里写些什么?

创设文件zf2moduleApplicationsrcApplicationControllerBlogController.php:

咱俩兴许写过这样的代码:

<?php
namespace ApplicationController;
use ZendMvcControllerAbstractActionController;
use ZendViewModelViewModel;
class BlogController extends AbstractActionController {
  public function indexAction() {
    $username = $this->params()->fromRoute('name');
    $view = new ViewModel(compact('username'));
    $view->setTerminal(true);
    return $view;
  }
  public function showAction() {
    $username = $this->params()->fromRoute('name');
    $blogId = $this->params()->fromRoute('blog_id');
    $view = new ViewModel(compact('username', 'blogId'));
    $view->setTerminal(true);
    return $view;
  }
}
?>
class IndexController extends Controller{

  public function Index($content){

    return '<html><head></head><body>'.$content.'</body></html>';

  }

}

zf2不援救Action参数绑定,ThinkPHP不仅仅扶助绑定,还帮忙2种绑定方式:按变量名绑定和按变量顺序绑定。

那样把分界面包车型地铁代码嵌入的写法是可怜麻烦保证的,也是无数开采职员(富含自己)最讨厌的写法,因为这种写法并不曾办好分界面与工作逻辑的分手,所以大家须要采用视图。

zf第22中学Action要求得回去视图,除非exit()。要是你驾驭可以禁用视图的措施,请报告小编。

<html>

  <head>



  </head>



  <body>

    <?php foreach($data as $key=>$value){ ?>  

      <div>

        <?php echo $key.':'.$value; ?>  

      </div>

    <?php } ?>

  </body>

</html>

开创文件zf2moduleApplicationviewapplicationuserurl.phtml:

每三次调用调节器的某部方法时,render函数都会把参数以关周详组的款式传播,做到“业务逻辑”和“表现”的浅档次分离,不过这种分离还不是最佳的,因为前端开采职员照旧须要直面以至管理PHP代码,后端开辟人士也许有和前端职员联系的工本,所以往边某一节,会再谈一种更加好的分离方式。

<?php foreach ($urls as $url): ?>
<a href="<?php echo $url;?>"><?php echo $url;?><a/><br />
<?php endforeach; ?>

您或许感兴趣的小说:

  • PHP实现路由映射到钦定调节器
  • Laravel 5框架学习之路由、调控器和视图简要介绍
  • thinkphp的U奥迪Q5L路由法规与布局实例
  • php url路由入门实例
  • thinkphp路由法规使用示例详解和伪静态作用完成(apache重写)
  • ThinkPHP、ZF2、Yaf、Laravel框架路由大比拼
  • ThinkPHP路由详解
  • php管理restful须要的路由类分享
  • PHP UEvoqueL路由类实例

制造文件zf2moduleApplicationviewapplicationuserindex.phtml:

自身是用户列表^_^
创造文件zf2moduleApplicationviewapplicationusershow.phtml:

欢迎你,<?php echo $username; ?>
创设文件zf2moduleApplicationviewapplicationblogindex.phtml:

那是<?php echo $username; ?>的博客列表
开创文件zf2moduleApplicationviewapplicationblogshow.phtml:

复制代码 代码如下:

<?php echo $username; ?>的那篇博客的id为<?php echo $blogId; ?>

Yaf

安装Yaf

动用代码生成工具创建Yaf项目

修改运行文件yafapplicationBootstrap.php,修改当中的_initRoute方法:

    $router = Yaf_Dispatcher::getInstance()->getRouter();
    $route0 = new Yaf_Route_Rewrite('url', array(
      'controller' => 'User',
      'action' => 'url',
        ), array()
    );
    $route1 = new Yaf_Route_Rewrite('user', array(
      'controller' => 'User',
      'action' => 'index',
        ), array()
    );
    $route2 = new Yaf_Route_Regex('#user/([a-zA-Z0-9_-] )#', array(
      'controller' => 'User',
      'action' => 'show',
        ), array(1 => 'name',)
    );
    $route3 = new Yaf_Route_Regex('#user/([a-zA-Z0-9_-] )/blog#', array(
      'controller' => 'Blog',
      'action' => 'index',
        ), array(1 => 'name',)
    );
    $route4 = new Yaf_Route_Regex('#user/([a-zA-Z0-9_-] )/blog/([0-9] )#', array(
      'controller' => 'Blog',
      'action' => 'show',
        ), array(1 => 'name', 2 => 'blogId',)
    );
    $router->addRoute('url', $route0);
    $router->addRoute('user_list', $route1);
    $router->addRoute('user', $route2);
    $router->addRoute("blog_list", $route3);
    $router->addRoute("blog", $route4);

Yaf有路由成效,但是从未基于路由名生成U奇骏L的不二秘籍。所以自个儿定义了八个品种名,用于拼接U安德拉L。

在配置文件中加上配置项yafconfapplication.ini:

复制代码 代码如下:

project.name = 'yaf'

创办理文件件yafapplicationcontrollersUser.php:

<?php
class UserController extends Yaf_Controller_Abstract {
  public function urlAction() {
    $name = 'jing';
    $blogId = 1;
    $app = Yaf_Application::app();
    $projectName = $app->getConfig()->project->name;
    $urls = array(
      "/{$projectName}/user",
      "/{$projectName}/user/{$name}",
      "/{$projectName}/user/{$name}/blog",
      "/{$projectName}/user/{$name}/blog/{$blogId}",
    );
    foreach ($urls as $url) {
      echo "<a href="{$url}">{$url}<a/><br />n";
    }
    return false;
  }
  public function indexAction() {
    echo '我是用户列表^_^';
    // 禁用视图模板
    return false;
  }
  public function showAction($name) {
    echo "欢迎你,{$name}";
    return false;
  }
}

创建文件yafapplicationcontrollersBlog.php:

复制代码 代码如下:

<?php
class BlogController extends Yaf_Controller_Abstract {
    public function indexAction($name) {
        echo "那是{$name}的博客列表";
        return false;
    }
    public function showAction($blogId, $name) {
        echo "{$name}的那篇博客的id为{$blogId}";
        return false;
    }
}

Yaf的Action帮忙参数绑定,是按变量名绑定的。$name、$blogId要和路由中布署的称号一致,而和参数顺序无关。

Laravel

新建Laravel项目:

复制代码 代码如下:

composer create-project laravel/laravel --prefer-dist

破除合併文件。在目录laravelvendor下有个文件compiled.php,那几个文件是为了削减IO升高框架质量,将洋洋类公事合併到二个文件中而生活的。在支付情状下,应该删除该文件,不然修改了某些文本开采并未有效果,其实是因为文件已经济同盟并缓存了。
解除命令:

复制代码 代码如下:

php artisan clear-compiled

在生养条件中应该敞开,以晋级品质:

复制代码 代码如下:

php artisan optimize --force

修改路由文件laravelappHttproutes.php:

复制代码 代码如下:

<?php
Route::get('/url', array('uses' => 'UserController@getUrl'));
Route::get('/user', array('uses' => 'UserController@getIndex'));
Route::get('/user/{username}', array('uses' => 'UserController@getShow'));
Route::get('/user/{username}/blog', array(
    'as' => 'blog_list',
    'uses' => 'BlogController@getIndex',
));
Route::get('/user/{username}/blog/{blogId}', array(
    'as' => 'blog',
    'uses' => 'BlogController@getShow',
))->where(array('blogId' => '[0-9] '));

查看路由定义景况:

复制代码 代码如下:

php artisan route:list

输出:

复制代码 代码如下:

-------- ---------- ------------------------------- ----------- ---------------------------------------------- ------------
| Domain | Method   | URI                           | Name      | Action                                       | Middleware |
-------- ---------- ------------------------------- ----------- ---------------------------------------------- ------------
|        | GET|HEAD | url                           |           | AppHttpControllersUserController@getUrl   |            |
|        | GET|HEAD | user                          |           | AppHttpControllersUserController@getIndex |            |
|        | GET|HEAD | user/{username}               |           | AppHttpControllersUserController@getShow  |            |
|        | GET|HEAD | user/{username}/blog          | blog_list | AppHttpControllersBlogController@getIndex |            |
|        | GET|HEAD | user/{username}/blog/{blogId} | blog      | AppHttpControllersBlogController@getShow  |            |
-------- ---------- ------------------------------- ----------- ---------------------------------------------- ------------

定义路由变量全局格局,修改文件laravelappProvidersRouteServiceProvider.php中的boot方法:

复制代码 代码如下:

    public function boot(Router $router) {
        $router->pattern('username', '[a-zA-Z0-9_-] ');

        parent::boot($router);
    }

创建UserController控制器:

复制代码 代码如下:

php artisan make:controller UserController

Laravel帮我们在laravelappHttpControllers目录下创办了文件UserController.php,文件中一度为大家写好一些龙骨代码。修改文件laravelappHttpControllersUserController.php:

复制代码 代码如下:

<?php
namespace AppHttpControllers;
use AppHttpControllersController;
class UserController extends Controller {
    public function getUrl() {
        $name = 'jing';
        $blogId = 1;
        $urls = array(
            url('/user'),
            action('UserController@getShow', array($name)),
            route('blog_list', array($name)),
            route('blog', array($name, $blogId)),
        );
        foreach ($urls as $url) {
            echo "<a href="{$url}">{$url}<a/><br />n";
        }
    }
    public function getIndex() {
        echo '作者是用户列表^_^';
    }
    public function getShow($name) {
        echo "欢迎你,{$name}";
    }
}

创建BlogController控制器:

复制代码 代码如下:

php artisan make:controller BlogController

修改文件laravelappHttpControllersBlogController.php:

复制代码 代码如下:

<?php
namespace AppHttpControllers;
use AppHttpControllersController;
class BlogController extends Controller {
    public function getIndex($name) {
        echo "那是{$name}的博客列表";
    }
    public function getShow($name, $blogId) {
        echo "{$name}的那篇博客的id为{$blogId}";
    }
}

Laravel的Action也辅助参数绑定,是按变量顺序绑定的,和变量名毫无干系。

后语

本人是Laravel粉,可是自个儿也不曾想黑其余框架的意味,大家有意思味也足以用自个儿深谙的框架来兑现那一个小例子,写了回想@笔者,语言不限。

如上所述便是本文的全部内容了,希望我们能够欣赏。

请你花一点小时将稿子分享给您的恋人仍旧留下商酌。大家将会由衷感激您的辅助!

您大概感兴趣的篇章:

  • Laravel框架路由设置与利用示例
  • Laravel框架模板加载,分配变量及轻巧路由作用示例
  • Laravel框架路由配置总结、设置技艺大全
  • Laravel 5框架学习之模型、调控器、视图基础流程
  • Laravel5.1数据库连接、创设数据库、创建model及创造调整器的法子
  • Laravel 5框架学习之路由、调控器和视图简单介绍
  • Laravel框架数据库CUWranglerD操作、连贯操作总括
  • Laravel 5 框架入门(一)
  • Laravel 5框架学习之数据库迁移(Migrations)
  • Laravel 5框架学习之Blade 简单介绍
  • Laravel框架路由和调控器的绑定操作方法
TAG标签:
版权声明:本文由澳门新葡8455手机版发布于www.2527.com,转载请注明出处:一周自制PHP框架,Laravel框架路由大比拼