过上一个博客系统以及对官方示例程序的基本学习,目前对symfony的各个组件有了一定的学习,学校布置了一个表白墙任务,这里就这个任务的完成进行记录

...........2019.3.20.22.31基本写完了,感觉像一坨屎,等我明天对symfony的细节再进行学习一下,重构一下,应该有很多好用的组件我不是很熟悉的,感觉这次写的还没有上一个任务用原生php+mysql写的逻辑性强一点,后续用第三方包knppaginatorBundle进行了分页功能的实现,这个网上很多博客都说过了,这里不再赘述,然后用表格显示了数据能好看一点了起码,不写前端,能看懂就行,这里没必要去研究,。。。。因为命名不规范还出现个小bug,无法正常跳转页面,,,命名不规范,亲人两行泪啊

分页链接见:https://www.cnblogs.com/zgaspnet/p/7640330.html

先看具体任务

使用staruml先确定数据库表内容以及表关系,这里比较简单就两个表,不需要用户表,匿名进行的,记录用户ip地址即可,

好了,确定好了之后,下面开始进行源码编写,let's do it!

为了达到练习的目的,这里一步一步的完成它,

首先使用 php  symfony new Expression "3.4.2" -vvv  创建symfony 3.4.2版本的应用程序,之后可能会用到其他的库,为了安装速度,这里先安装下composer国内镜像

composer config  repo.packagist composer https://packagist.phpcomposer.com           //执行此命令即可

接下来编写Entity,Comment和LoveExpress

<?php
namespace AppBundle\Entity;
use Doctrine\ORM\Mapping as ORM;
use Symfony\Component\Validator\Constraints as Assert; /**
* @ORM\Entity(repositoryClass = "AppBundle\Repository\CommentRepository")
* @ORM\Table(name = "comment")
*/
class Comment{
/**
* @ORM\Id
* @ORM\Column(type="integer")
* @ORM\GeneratedValue(strategy="AUTO")
*/
private $id;
/**
* @ORM\Column(type="text")
* @Assert\Length(
* min = 5,
* minMessage="comment.too_short",
* max =400,
* maxMessage = "comment.too_long"
* )
*/
private $content;
/**
* @ORM\ManyToOne(targetEntity = "LoveExpress",inversedBy="comments")
* @ORM\JoinColumn(name="expression_id",referencedColumnName="id")
*/
protected $expression;
}
<?php

namespace AppBundle\Entity;
use Doctrine\ORM\Mapping as ORM;
use Symfony\Component\Validator\Constraints as Assert; //验证数据是否合法
use Doctrine\Common\Collections\ArrayCollection;
use Doctrine\ORM\OneToMany; /**
* @ORM\Entity(repositoryClass="AppBundle\Repository\LoveExpressRepository")
* @ORM\Table(name = "love_express")
*/
class LoveExpress{
/**
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
* @ORM\Column(type="integer")
*/
private $id;
/**
* @ORM\Column(type="text")
* @Assert\Length(
* min=5,
* minMessage="comment.too_short",
* max=10000,
* maxMessage="comment.too_long"
* )
*/
private $content;
/**
* @ORM\Column(type="string")
*/
private $user_ip;
/**
* 点赞数
* @ORM\Column(type="integer",default=0)
*/
private $number_up;
/**
* 踩一踩的数量
* @ORM\Column(type="integer",default=0)
*/
private $number_down;
/**
* @ORM\OneToMany(tegetEntity="LoveExpress",mappedBy="expression")
*/
protected $comments; public function __construct()
{
$this->comments = new ArrayCollection();
}
}

接下来在app/config文件当中进行数据库配置,具体因人而异

再执行命令php bin/console doctrine:schema:validate 检查annoation是否有错误,最好执行这一步,不然你哪块少个字母会出现难以发现的错误

接着 php bin/console doctrine:create:database       创建数据库这里的名字为expresswall

这里创建之前先说明一下,在mysql目录下的my.cnf文件中加入下列代码,设置正确的字符集,校对集,以免后面产生未知bug

collation-server     = utf8mb4_general_ci # Replaces utf8_general_ci
character-set-server = utf8mb4 # Replaces utf

或者加入下列代码到app/config的doctrine下面

charset: utf8mb4
default_table_options:
charset: utf8mb4
collate: utf8mb4_unicode_ci

php bin/console doctrine:generate:entities AppBundle 补全entity实例

接下来进行控制器的编写,我准备先使用DoctirneFixture对数据库进行初始化,在此之前先进行安装,不赘述

艹草草哦啊哦草  气死了真的,mysql好好的突然不能用了,真的很奇怪,刚开始以为是哪里写错了,结果从新创个项目也是不行,最后发现net start mysql 启动失败,并且没有错误原因,经查找决定初始化下

先重新创建data文件,记着保存数据库,真的很奇怪为什么莫名其妙不行了

mysqld -remove

mysqld -install

mysqld --initialize

之后再从新启动就行了

一下子做了很多,遇到了很多问题,暂时没有很好地解决方法,前端根本不会写,我想用国外的一个HTML组件对前端进行重写下,等到基本功能都实现了,

下面是评论和主页面的控制器,感觉写的跟个屎一样,先做完基本功能之后再进行从写吧,

ActionController

<?php

namespace AppBundle\Controller;

use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;
use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Symfony\Component\Form\Extension\Core\Type\SubmitType;
use Symfony\Component\HttpFoundation\Request;
use AppBundle\Entity\LoveExpress;
use AppBundle\Entity\Comment;
use Symfony\Component\Form\Extension\Core\Type\TextType;
//主页面
/**
* @Route("/love")
*/
class ActionController extends Controller
{
/**
* 获取comment和loveExpress的repository
* @return \AppBundle\Repository\CommentRepository
*/
protected function getCommentRepository(){
$em = $this->getDoctrine()->getManager();
$commentRes = $em->getRepository(Comment::class);
return $commentRes;
}
/**
* @return \AppBundle\Repository\LoveExpressRepository
*/
protected function getLoveExpressRepository()
{
$em = $this->getDoctrine()->getManager();
$love = $em->getRepository(LoveExpress::class);
return $love;
}
/**
* 主控制器,用于从数据库当中获取数据并且返回给homepage模板,
* @Route("/index/{page}", name="homepage",defaults={"page":"1"})
*/
public function indexAction($page)
{
$loveExpress = $this->getLoveExpressRepository()->createQueryBuilder('u');
$paginator = $this->get('knp_paginator');
$pagination = $paginator->paginate($loveExpress, $page,3);
return $this->render('love/index.html.twig',
array('loveExpress'=>$pagination)
);
}
/**
* 获取单个表白信息并进行显示,并返回评论表单
* @Route("/show/{id}",name="loveShow")
* */
public function showAction($id, Request $request){
$loveRes = $this->getLoveExpressRepository();
$loveExpress = $loveRes->find($id); $commentRes = $this->getCommentRepository();
$comments = $commentRes->findBy(array("expression"=>$id)); //创建评论表单并更新
$comment = new Comment();
$comment->setExpression($loveExpress);
$form = $this->createFormBuilder($comment)
->add('content',TextType::class)
->add('发布评论',SubmitType::class)
->getForm(); $form->handleRequest($request); //处理请求
if($form->isValid() && $form->isSubmitted()){
$em = $this->getDoctrine()->getManager();
$em->persist($comment);
$em->flush(); return $this->redirectToRoute('loveShow',array('id'=>$id));
} return $this->render(
"love/show.html.twig",
array('loveExpress'=>$loveExpress,
'comments'=>$comments,
'form'=>$form->createView()
)
);
} /**
* 执行点赞或者踩一踩操作
* @Route("/down/{id}/{action}",name="love_action")
*/
public function loveUpDownAction($id,$action){
$loveRes = $this->getLoveExpressRepository();
$loveExpress = $loveRes->find($id);
if($action == 'down'){
$loveExpress->setNumberDown(($loveExpress->getNumberDown()+1));
}else{
$loveExpress->setNumberUp(($loveExpress->getNumberUp() + 1));
}
$em = $this->getDoctrine()->getManager();
$em->persist($loveExpress);
$em->flush(); return $this->redirectToRoute('loveShow',array('id'=>$id));
}
}

NewController

<?php
/**
* Created by PhpStorm.
* User: 亦清
* Date: 2019/3/19
* Time: 10:22
*/ namespace AppBundle\Controller; use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;
use Symfony\Component\Form\Extension\Core\Type\SubmitType;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\Form\Extension\Core\Type\TextType;
use AppBundle\Entity\LoveExpress; /**
* @Route("/love")
*/
class NewController extends Controller
{
function getRealIp()
{
$ip=false;
if(!empty($_SERVER["HTTP_CLIENT_IP"])){
$ip = $_SERVER["HTTP_CLIENT_IP"];
}
if (!empty($_SERVER['HTTP_X_FORWARDED_FOR'])) {
$ips = explode (", ", $_SERVER['HTTP_X_FORWARDED_FOR']);
if ($ip) { array_unshift($ips, $ip); $ip = FALSE; }
for ($i = 0; $i < count($ips); $i++) {
if (!eregi ("^(10│172.16│192.168).", $ips[$i])) {
$ip = $ips[$i];
break;
}
}
}
return ($ip ? $ip : $_SERVER['REMOTE_ADDR']);
} /**
* 增加表白信息,创建表单并返回给new.html.twig页面
* @Route("/newLove",name="newLove")
*/
public function addLoveAction(Request $request){
$love = new LoveExpress(); $form = $this->createFormBuilder($love)
->add('name')
->add('content',TextType::class)
->add('保存发布',SubmitType::class)
->getForm(); $form->handleRequest($request); //处理请求
if($form->isValid() && $form->isSubmitted()){
$love->setUserIp($this->getRealIp()); //获取并设置ip
$em = $this->getDoctrine()->getManager();
$em->persist($love);
$em->flush(); $this->addFlash('success','发布成功'); return $this->redirectToRoute('homepage');
} return $this->render(
'love/new.html.twig'
,array('form'=>$form->createView(),)
);
}
}

下面是twig模板

index.twig.html
{% extends 'base.html.twig' %} {% block body %}
<title>表白墙系统</title>
<div style=" text-align:center;">
<h1>主页面</h1>
<h2><a href="{{ path('newLove') }}">发布表白信息</a></h2>
{% for love in loveExpress %}
<h4>发布游客名称:{{ love.name }}</h4>
<p>
<a href={{ path('loveShow',{"id":love.id}) }}>{{ love.content|md2html|striptags|slice(0,30) }}..显示全部</a>
</p>
{% endfor %}
</div>
{% endblock %} new.html.twig {% extends "base.html.twig" %}
{% block body %} <div class="text" style=" text-align:center;">
<h1>发布表白页面</h1>
{{ form_start(form) }}
{{ form_row(form.name) }}
{{ form_row(form.content) }}
{{ form_end(form) }}
</div>
{% endblock %} show.html.twig {% extends "base.html.twig" %}
{% block body %} <div class="text" style=" text-align:center;">
<h1>发布表白页面</h1>
{{ form_start(form) }}
{{ form_row(form.name) }}
{{ form_row(form.content) }}
{{ form_end(form) }}
</div>
{% endblock %}

  

symfony小练习-表白墙的更多相关文章

  1. 校园表白墙、微信表白墙、校园墙 微信小程序 JAVA 开发记录与分享

    目录 最新版表白墙博客地址 1.微信小程序前台展示 2.功能介绍 3.后台管理 4.后端语言采用 JAVA 开发 5.体验此微信小程序 扫描下方二维码 6.如何联系我或需要源码进行联系 最新版表白墙博 ...

  2. 行星万象表白墙微信小程序、社交微信小程序,后台完整,支持多区域运营,扫码体验。

    简介 中国目前大概有5000个表白墙,累计用户近3000万,是一个庞大的群体,但现在大都以微信朋友圈为基础进行信息中转,但是这种模式经营者和用户都不友好,尤其是经营者无法变现,用户无法公开评论,这些种 ...

  3. 对表白墙js文件的解释

    index.js 1 Page({ 2 3 /** 4 * 页面的初始数据 5 */ 6 data: { 7 xcx_appid:"", 8 }, 9 HuoquDaohangLi ...

  4. PHP表白墙网站源码

    PHP表白墙网站源码,可以做校园内的,也可以做校区间的,可封装成APP.告别QQ空间的表白墙吧. 安装简单,上传程序安装,然后设置账号密码,登陆后台切换模板手机PC都要换开启插件访问前台. 安装完成后 ...

  5. 说什么也要脱单——Python WEB开发:用Tornado框架制作简易【表白墙】网站

    先来哔哔两句:(https://jq.qq.com/?_wv=1027&k=QgGWqAVF) 今天我们要用Python做Web开发,做一个简单的[表白墙]网站.众所周知表白墙的功能普遍更多的 ...

  6. 对表白墙wxml文件解释

    一.index.wxml 1.代码 1 <view class="Beijingse" style="height: 100%;"> 2 <v ...

  7. 牛客红包OI赛 C 小可爱表白

    据说是个公式题. Code #include<cstdio> #include<cstring> #include<algorithm> using namespa ...

  8. 牛可乐发红包脱单OI赛 C 小可爱表白

    打个暴力查一下OEIS,5min做完 出题人一开始把式子打错了,一开始的式子的结果为$n * (n + 3) * 2^{n - 3}$ 我们考虑化式子 首先考虑 $\sum\limits_{j = 1 ...

  9. 对表白墙wxss的解释

    一.index.wxss 1 /* 信息 */ 2 .Xinxi{ 3 display: flex; 4 flex-wrap: wrap; 5 margin: 0rpx 1%; 6 } 7 8 9 / ...

随机推荐

  1. Java基础学习--数组

    1.数组的定义: 数组(Array)是相同数据类型的数据的有序集合. 2.数组的3个特点: 2.1数组长度是确定.数组一旦申请完空间,长度不能发生变化,用length属性访问. 2.2数组的元素都是同 ...

  2. 07--STL序列容器(Array)

    一:Array了解 array<T,N> 模板定义了一种相当于标准数组的容器类型.它是一个有 N 个 T 类型元素的固定序列.除了需要指定元素的类型和个数之外,它和常规数组没有太大的差别. ...

  3. CentOS 7 安装docker (图文)

     一定要用root账号登录系统,打开终端/或远程工具(如xshell)登录系统 检查是否已经安装命令  rpm –qa|grep docker 出现如上说明已安装 也可用命令docker -v  (如 ...

  4. 转载:在做datatable时候查询数据和条数只用一次sql就可以解决需求

    前言:最近用datatable处理数据比较多,所以在使用时候想提升性能 select * from t_hr_leave SELECT FOUND_ROWS() //返回查询记录的总数 select ...

  5. MySql存储过程 CURSOR循环

    游标 游标(Cursor)是处理数据的一种方法,为了查看或者处理结果集中的数据,游标提供了在结果集中一次一行或者多行前进或向后浏览数据的能力. 使用步骤 声明一个游标: declare 游标名称 CU ...

  6. PHP安装文件的审计

    初始化安装 一般php程序都有一个初始安装的问题,如果使用了一些cms安装后且没有删除安装文件的话,就会导致二次安装等问题. 具体但不限于以下几种情况: 无验证功能,任意重装覆盖 $_GET['ste ...

  7. python学习06

    流控制 和函数 1)流控制 1.条件语句 if elif else  if else 2.循环语句 while for 3.continue 和break continue是跳过本次循环,执行下一次循 ...

  8. Java(18) 集合框架

    一.集合框架 Collectoin                   Map List           set              HashMap ArrayList LinkedList ...

  9. DOS:第二天

    今天介绍 dir ------------ dir (directory,目录)是一个条列档案及目录的命令行界面指令,在CP/M.VMS.DOS.OS/2.Singularity及Microsoft ...

  10. 01.QT初学--两个窗口相互切换

    //qqwidget.cpp #include "qqwidget.h" #include "ui_qqwidget.h" qqwidget::qqwidget ...