宝马娱乐在线112222 > 网络应用 > 【宝马娱乐在线】symfony学习笔记2—纯的PHP代码和

原标题:【宝马娱乐在线】symfony学习笔记2—纯的PHP代码和

浏览次数:156 时间:2019-10-01

我的refreshContent函数调用不了,我已被这个问题困扰了好几天了 ,就是找不到问题出在哪了,希望大家帮我看看,谢谢!
代码如下:

Symfony vs 纯PHP
为啥symfony比普通的php文件访问要好?
这一章我们写一个简单的php文件项目,然后组织它,你会发现为什么web应用会发展到现在这个样子。最后我们将学习symfony如何重用代码。

xajax_smarty.php

使用纯PHP创建一个简单博客程序
这里我们先使用纯php(flat php我擦 ,怎么翻译呢,就是php文件,但是谁不是php文件呢?)创建一个博客程序,先写一个文章列表,这段代码很直接,但是很脏。
<?php
// index.php
$link = mysql_connect('localhost', 'myuser', 'mypassword');
mysql_select_db('blog_db', $link);

<?php
  require_once( 'Config/Config.inc.php');
  require_once('xajax/xajax_core/xajax.inc.php');
  $xajax = new xajax();
  function loadContent($n){
      global  $Smarty;
      if($n==0){
       $data[] = array('title' =>'helloworld','content' =>'<p>what is going on?</p>');
       $data[] = array('title' =>'another item','content' => '<p>nothing fancy</p>');
            }
       else if($n == 1){
           echo '=============';
             $data[] = array('title' =>'Dynamically loaded' , 'content' => '<p>There you go</p>');
            }
       $Smarty ->assign('posts' ,$data);
       $ret = $Smarty ->fetch('post.html');
       $Smarty ->clear_all_assign();
       return $ret;
  }
   function refreshContent($formValues){//调用不了
     echo "ldkfjdl";
      $response= new xajaxResponse();
      $newContent = loadContent($formValues['select_page']);
      $response ->addAssign('content' , 'innerHTML' , $newContent);
      return $response;
   }
   $xajax ->registerFunction('refreshContent');
   $xajax->processRequest();
   
   $Smarty ->assign('content' , loadContent(0));
   $Smarty ->assign('xajaxjavascript' , $xajax ->getJavascript('xajax/'));
   $Smarty ->display('main.html');
?>

$result = mysql_query('SELECT id, title FROM post', $link);
?>

post.html
<html>
<body>
<%{foreach from = $posts item = post}%>
<div>
<h2><%{$post.title}%></h2>
<%{$post.content}%>
</div>
<%{/foreach }%>
</body>
</html>

<!DOCTYPE html>
<html>
<head>
<title>List of Posts</title>
</head>
<body>
<h1>List of Posts</h1>
<ul>
<?php while ($row = mysql_fetch_assoc($result)): ?>
<li>
<a href="/show.php?id=<?php echo $row['id'] ?>">
<?php echo $row['title'] ?>
</a>
</li>
<?php endwhile ?>
</ul>
</body>
</html>

main.html
<html>
<head>
<%{$xajaxjavascript}%>
</head>
<body>
<div id="header">
  <h1>Smarty $amp;xajax</h1>
</div>
<form id="frm_switcher" method="POST" >
   更换内容
   <select name = "select_page">
     <option value="0" selected='selected'>页面索引 0</option>
     <option value="1" > 页面索引 1</option>
   </select>
</form>
<div id ="content">
  <%{$content}%>
</div>
</body>
</html>

<?php
mysql_close($link);
?>

这个很简单,也很好写,但是随着应用逻辑增多很难维护。这里有一些问题:
1.没有错误检查,如果数据库连接失败怎么办
2.没有组织,如果应用变大,逻辑增多,这个文件将会变得很大,不可维护,从那里验证输入,从那里处理请求,最终写成一团乱码
3.代码不可重用,所有代码都放在一个文件中,没法重用

还有一个问题没有提到,如何从数据库中取数据,symfony使用Doctrine(一种ORM)来获取数据很方便。

展现分离
下面做一些该进将逻辑和html展现分离,代码如下:
<?php
// index.php
$link = mysql_connect('localhost', 'myuser', 'mypassword');
mysql_select_db('blog_db', $link);

$result = mysql_query('SELECT id, title FROM post', $link);

$posts = array();
while ($row = mysql_fetch_assoc($result)) {
$posts[] = $row;
}

mysql_close($link);

// include the HTML presentation code
require 'templates/list.php';

现在把hmtl内容放在另外一个文件中templates/list.php类似模板

<!DOCTYPE html>
<html>
<head>
<title>List of Posts</title>
</head>
<body>
<h1>List of Posts</h1>
<ul>
<?php foreach ($posts as $post): ?>
<li>
<a href="/read?id=<?php echo $post['id'] ?>">
<?php echo $post['title'] ?>
</a>
</li>
<?php endforeach ?>
</ul>
</body>
</html>

一般index.php那个可以叫做控制器,控制这个词在很多场合都用到,不管任何语言和框架,它指处理用户输入和返回响应的地方。在这个例子中控制器从数据库中查数据,然后包含了一个展现数据的文件。这样分离之后如果想修改展示数据的方式例如list.json.php就很容易了

业务逻辑分离
目前这个应用只包含一个页面,但是如果增加第二个页面也使用相同的数据连接,相同的传递数据,所以我们将主要的获取数据的逻辑分离出来放在一个model.php中,如下:

<?php
// model.php
function open_database_connection()
{
$link = mysql_connect('localhost', 'myuser', 'mypassword');
mysql_select_db('blog_db', $link);

return $link;
}

function close_database_connection($link)
{
mysql_close($link);
}

function get_all_posts()
{
$link = open_database_connection();

$result = mysql_query('SELECT id, title FROM post', $link);
$posts = array();
while ($row = mysql_fetch_assoc($result)) {
$posts[] = $row;
}
close_database_connection($link);

return $posts;
}

我们把这个文件命名为model.php是应为在应用中通常将获取数据层叫做model,通常主要的业务逻辑放在model里面。

现在这个控制器index.php可易写成下面这样:

<?php
require_once 'model.php';

$posts = get_all_posts();

require 'templates/list.php';

现在这个控制器主要的功能就是从model中获取数据然后调用模板渲染数据,这是个很简单的模型-视图-控制器的例子

布局分离
到目前为止我们已经涉及到三个不同的文件,几乎复用了所有的代码,只有一个地方我们没有用到就是布局文件,下面创建一个布局文件layout.php

<!-- templates/layout.php -->
<!DOCTYPE html>
宝马娱乐在线,<html>
<head>
<title><?php echo $title ?></title>
</head>
<body>
<?php echo $content ?>
</body>
</html>

模板templete/list.php,现在可以继承布局了。
<?php $title = 'List of Posts' ?>

<?php ob_start() ?>
<h1>List of Posts</h1>
<ul>
<?php foreach ($posts as $post): ?>
<li>
<a href="/read?id=<?php echo $post['id'] ?>">
<?php echo $post['title'] ?>
</a>
</li>
<?php endforeach ?>
</ul>
<?php $content = ob_get_clean() ?>

<?php include 'layout.php' ?>

现在可以通用这个layout了,但是还需要一些丑陋的php函数例如ob_start(),ob_get_clean()方法,下面再将symfony的处理方式。

添加博客”show”页面
博客列表页面已经重新设计,代码可以复用了。现在添加一个展示博客的页面,向这个页面传递参数ID。首先在model.php中新建一个方法,如下:

// model.php
function get_post_by_id($id)
{
$link = open_database_connection();

$id = intval($id);
$query = 'SELECT date, title, body FROM post WHERE id = '.$id;
$result = mysql_query($query);
$row = mysql_fetch_assoc($result);

close_database_connection($link);

return $row;
}

然后新建一个文件show.php,控制器

<?php
require_once 'model.php';

$post = get_post_by_id($_GET['id']);

require 'templates/show.php';

最后新建一个模板templates/show.php,渲染文件

<?php $title = $post['title'] ?>

<?php ob_start() ?>
<h1><?php echo $post['title'] ?></h1>

<div class="date"><?php echo $post['date'] ?></div>
<div class="body">
<?php echo $post['body'] ?>
</div>
<?php $content = ob_get_clean() ?>

<?php include 'layout.php' ?>

新建这个页面的时候已经很容易,没有重复代码,还是还是有些问题可能导致问题,例如丢失参数id将会使页面报错。如果这个导致404错误到还好,最坏的情况是sql注入。

另外一个问题是每个控制器文件都必须应用model.php,当我们要访问另外一个表,就要在这个控制器中添加另外一个model,这个是比较麻烦的。

前端控制器解决方案
解决这个问题的方法是前端控制器,通过这个控制器文件所有的请求都可以被处理,唯一要做的是修改url,这样更加灵活。

Without a front controller
/index.php => Blog post list page (index.php executed)
/show.php => Blog post show page (show.php executed)

With index.php as the front controller
/index.php => Blog post list page (index.php executed)
/index.php/show => Blog post show page (index.php executed)

用apache中的重写功能可以省略“index.php”这样的话访问就更加简单了,例如/show

使用前端控制器只有单独的一个index.php文件可以处理所有的请求,例如访问show页面,/index.php/show,将会最终执行index.php,这是一个很强大的功能。我怎么没看出来。

创建前端控制器
现在我们再往前走一大步,用一个文件处理所有的请求,修改index.php文件如下:

<?php
// index.php

本文由宝马娱乐在线112222发布于网络应用,转载请注明出处:【宝马娱乐在线】symfony学习笔记2—纯的PHP代码和

关键词:

上一篇:dedecms v5.7提示php.ini register_globals must is Off错误的

下一篇:没有了