加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

ThinkPHP、ZF2、Yaf、Laravel框架路由大比拼

发布时间:2020-12-14 19:51:51 所属栏目:大数据 来源:网络整理
导读:《ThinkPHP、ZF2、Yaf、Laravel框架路由大比拼》要点: 本文介绍了ThinkPHP、ZF2、Yaf、Laravel框架路由大比拼,希望对您有用。如果有疑问,可以联系我们。 前言 PHP教程 读过一篇关于Zend Framework2的技术文章《ZF2多级树形路由Route配置实例》,是介绍路由

《ThinkPHP、ZF2、Yaf、Laravel框架路由大比拼》要点:
本文介绍了ThinkPHP、ZF2、Yaf、Laravel框架路由大比拼,希望对您有用。如果有疑问,可以联系我们。

前言PHP教程

读过一篇关于Zend Framework2的技术文章《ZF2多级树形路由Route配置实例》,是介绍路由配置的.我感到很有意思,这是的需求:PHP教程

/user对应用户列表页面
/user/:user_id对应用户的个人主页,好比 /user/AlloVince 就对应AlloVince用户的个人主页
/user/:user_id/blog/对应用户的博客列表页面,好比 /user/AlloVince/blog 就会列出AlloVince写过的Blog
/user/:user_id/blog/:blog_id对应用户的一篇博客文章
方案引用自原文: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'
            ),'child_routes' => array(
            'blog' => array(
              'type' => 'Segment','options' => array(
                'route' => 'blog[/]','constraints' => array(
                ),'defaults' => array(
                  'action' => 'blog'
                )
              ),'child_routes' => array(
                'post' => array(
                  'type' => 'Segment','options' => array(
                    'route' => '[:post_id][/]','constraints' => array(
                      'post_id' => '[a-zA-Z0-9_-]+'
                    ),'defaults' => array(
                      'action' => 'post'
                    )
                  ),//profile child_routes end
        ),//profile end
      ),//user child_routes end
    ),//user end
  ),

看了这篇文章后,我盘算使用我用过的PHP框架来实现这个路由需求.PHP教程

ThinkPHPPHP教程

新建一个ThinkPHP项目:PHP教程

代码如下:

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

命令行显示我安装的是3.2.2PHP教程

Installing topthink/thinkphp (3.2.2)
我看ThinkPHP官网最新稳定版本是3.2.3.PHP教程

我特意去packagist官网查了一下,库中稳定版确实是3.2.2.PHP教程

我得使用3.2.3.为什么我分外纠结这一点哩?因为:PHP教程

3.2的路由功能是针对模块设置的,所以URL中的模块名不能被路由,路由定义也通常是放在模块配置文件中. 3.2.3版本开始增加全局路由定义支持,可以在项目的公共配置文件中定义路由.
也便是说,路由重写的部分是Controller和Action部分,Moudle还是存在.PHP教程

我希望的是/user,而不是home/user.(ThinkPHP中默认Module是Home,'DEFAULT_MODULE' => 'Home',可以改动)PHP教程

当然,这个问题也可以修改.htaccess文件的办理.但是,我还是决定安装3.2.3.PHP教程

在ThinkPHP官网下载最新的包,解压.PHP教程

使用浏览器拜访一下项目的入口文件,让ThinkPHP自动生成了一个默认的应用模块Home.PHP教程

改动公共配置文件tpApplicationCommonConfconfig.php:PHP教程

<?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: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}";
  }
}
?>

创立文件tpApplicationHomeControllerBlogController.class.php:PHP教程

<?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}";
  }
}
?>

拜访:http://127.0.0.1/tp/urlPHP教程

输出:PHP教程

代码如下:

<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 />

拜访上面4个链接,依次返回:PHP教程

我是用户列表^_^
欢迎你,jing
这是jing的博客列表
jing的这篇博客的id为1
下面其他框架,也同样输出以上内容.PHP教程

Zend Framework 2PHP教程

使用ZF2骨架法式创建一个ZF2项目:PHP教程

composer create-project --stability="dev" zendframework/skeleton-application zf2PHP教程

改动默认模块Application的配置文件zf2moduleApplicationconfigmodule.config.php:PHP教程

<?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','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[/]','controller' => 'User','child_routes' => array(
          'user' => array(
            'type' => 'Segment','options' => array(
              'route' => '[:name][/]','constraints' => array(
                'name' => '[a-zA-Z0-9_-]+','defaults' => array(
                'action' => 'show','child_routes' => array(
              'blog_list' => array(
                'type' => 'Segment','options' => array(
                  'route' => 'blog[/]','constraints' => array(
                  ),'defaults' => array(
                    'controller' => 'Blog',)
                ),'child_routes' => array(
                  'blog' => array(
                    'type' => 'Segment','options' => array(
                      'route' => '[:blog_id]','constraints' => array(
                        'blog_id' => '[0-9]+','defaults' => array(
                        'action' => 'show',)
                    ),'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(
      ),);
?>

这个文件是骨架程序中自带的,我只是修改了router部门和controllers部门.要我写这么长的文件,那就太为难我了.这也是ZF官方发布了一个骨架程序的原因.PHP教程

创立文件zf2moduleApplicationsrcApplicationControllerUserController.php: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',$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教程

<?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;
  }
}
?>

zf2不支持Action参数绑定,ThinkPHP不仅支持绑定,还支持2种绑定方式:按变量名绑定和按变量次序绑定.PHP教程

zf2中Action必须得返回视图,除非exit().如果你知道可以禁用视图的方法,请告诉我.PHP教程

创立文件zf2moduleApplicationviewapplicationuserurl.phtml:PHP教程

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

创立文件zf2moduleApplicationviewapplicationuserindex.phtml:PHP教程

我是用户列表^_^
创立文件zf2moduleApplicationviewapplicationusershow.phtml:PHP教程

欢迎你,<?php echo $username; ?>
创立文件zf2moduleApplicationviewapplicationblogindex.phtml:PHP教程

这是<?php echo $username; ?>的博客列表
创立文件zf2moduleApplicationviewapplicationblogshow.phtml:PHP教程

代码如下:

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

YafPHP教程

安装YafPHP教程

使用代码生成工具创立Yaf项目PHP教程

修改启动文件yafapplicationBootstrap.php,修改其中的_initRoute办法:PHP教程

    $router = Yaf_Dispatcher::getInstance()->getRouter();
    $route0 = new Yaf_Route_Rewrite('url',array(
      'controller' => 'User',array()
    );
    $route1 = new Yaf_Route_Rewrite('user',array()
    );
    $route2 = new Yaf_Route_Regex('#user/([a-zA-Z0-9_-]+)#','action' => 'show',array(1 => 'name',)
    );
    $route3 = new Yaf_Route_Regex('#user/([a-zA-Z0-9_-]+)/blog#',array(
      'controller' => 'Blog',)
    );
    $route4 = new Yaf_Route_Regex('#user/([a-zA-Z0-9_-]+)/blog/([0-9]+)#',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有路由功能,但是没有根据路由名生成URL的办法.所以我定义了一个项目名,用于拼接URL.PHP教程

在配置文件中添加配置项yafconfapplication.ini:PHP教程

代码如下:

project.name = 'yaf'

创立文件yafapplicationcontrollersUser.php: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教程

代码如下:

<?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要和路由中配置的名称一样,而和参数次序无关.PHP教程

LaravelPHP教程

新建Laravel项目:PHP教程

代码如下:

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

清除合并文件.在目录laravelvendor下有个文件compiled.php,这个文件是为了减少IO提高框架性能,将很多类文件合并到一个文件中而生存的.在开发环境下,应该删除该文件,不然修改了一些文件发现没有效果,其实是因为文件已经合并缓存了.
清除命令:PHP教程

代码如下:

php artisan clear-compiled

在生产环境中应该开启,以提升性能:PHP教程

代码如下:

php artisan optimize --force

改动路由文件laravelappHttproutes.php: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教程

代码如下:

php artisan route:list

输出:PHP教程

代码如下:

+--------+----------+-------------------------------+-----------+----------------------------------------------+------------+
| 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办法:PHP教程

代码如下:

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

??????? parent::boot($router);
??? }
PHP教程

创立UserController控制器:PHP教程

代码如下:

php artisan make:controller UserController

Laravel帮我们在laravelappHttpControllers目录下创建了文件UserController.php,文件中已经为我们写好一部门骨架代码.修改文件laravelappHttpControllersUserController.php: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',
??????????? 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教程

代码如下:

php artisan make:controller BlogController

改动文件laravelappHttpControllersBlogController.php: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也支持参数绑定,是按变量次序绑定的,和变量名无关.PHP教程

后语PHP教程

我是Laravel粉,但是我也没有想黑其他框架的意思,大家有兴趣也可以用本身熟悉的框架来实现这个小例子,写了记得@我,语言不限.PHP教程

以上所述便是本文的全部内容了,希望大家能够喜欢.PHP教程

请您花一点时间将文章分享给您的朋友或者留下评论.我们将会由衷感激您的支持!PHP教程

欢迎参与《ThinkPHP、ZF2、Yaf、Laravel框架路由大比拼》讨论,分享您的想法,编程之家 52php.cn为您提供专业教程。

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读