symfony小练习-表白墙
过上一个博客系统以及对官方示例程序的基本学习,目前对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小练习-表白墙的更多相关文章
- 校园表白墙、微信表白墙、校园墙 微信小程序 JAVA 开发记录与分享
目录 最新版表白墙博客地址 1.微信小程序前台展示 2.功能介绍 3.后台管理 4.后端语言采用 JAVA 开发 5.体验此微信小程序 扫描下方二维码 6.如何联系我或需要源码进行联系 最新版表白墙博 ...
- 行星万象表白墙微信小程序、社交微信小程序,后台完整,支持多区域运营,扫码体验。
简介 中国目前大概有5000个表白墙,累计用户近3000万,是一个庞大的群体,但现在大都以微信朋友圈为基础进行信息中转,但是这种模式经营者和用户都不友好,尤其是经营者无法变现,用户无法公开评论,这些种 ...
- 对表白墙js文件的解释
index.js 1 Page({ 2 3 /** 4 * 页面的初始数据 5 */ 6 data: { 7 xcx_appid:"", 8 }, 9 HuoquDaohangLi ...
- PHP表白墙网站源码
PHP表白墙网站源码,可以做校园内的,也可以做校区间的,可封装成APP.告别QQ空间的表白墙吧. 安装简单,上传程序安装,然后设置账号密码,登陆后台切换模板手机PC都要换开启插件访问前台. 安装完成后 ...
- 说什么也要脱单——Python WEB开发:用Tornado框架制作简易【表白墙】网站
先来哔哔两句:(https://jq.qq.com/?_wv=1027&k=QgGWqAVF) 今天我们要用Python做Web开发,做一个简单的[表白墙]网站.众所周知表白墙的功能普遍更多的 ...
- 对表白墙wxml文件解释
一.index.wxml 1.代码 1 <view class="Beijingse" style="height: 100%;"> 2 <v ...
- 牛客红包OI赛 C 小可爱表白
据说是个公式题. Code #include<cstdio> #include<cstring> #include<algorithm> using namespa ...
- 牛可乐发红包脱单OI赛 C 小可爱表白
打个暴力查一下OEIS,5min做完 出题人一开始把式子打错了,一开始的式子的结果为$n * (n + 3) * 2^{n - 3}$ 我们考虑化式子 首先考虑 $\sum\limits_{j = 1 ...
- 对表白墙wxss的解释
一.index.wxss 1 /* 信息 */ 2 .Xinxi{ 3 display: flex; 4 flex-wrap: wrap; 5 margin: 0rpx 1%; 6 } 7 8 9 / ...
随机推荐
- NameNode与DataNode的工作原理剖析
NameNode与DataNode的工作原理剖析 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.HDFS写数据流程 >.客户端通过Distributed FileSyst ...
- JMeter命令行监控CPU
JMeter 命令行执行脚本得到的报告中,是没有CPU.内存使用率等监控数据的,我们可以使用JMeter插件帮忙. 首先,需要下载JMeterPlugins-Standard.jar,jmeter-p ...
- Kubernetes基本功能
说明 目前kubernetes的资料介绍很多也很深刻,本文只是做一个针对自己学习k8s过程的介绍,仅仅是学习笔记的记录. 一.基本使用 1. 命令行 集群信息 Namespace 信息 Control ...
- H5_0003:JS禁用调试,禁用右键,监听F12事件的方法
1,禁用调试 // 这个方法是防止恶意调试的 (function () { console["log"]("=============================== ...
- Asp.net core 3.0
序言 我的看法:如果你未来五到十年还打算靠 ASP.NET 吃饭,ASP.NET MVC 一定要学,写 WebForm 工作机会将变得很少,具备 MVC 技能才有本钱跟年轻小伙子们抢饭碗,很高比例的 ...
- python3 练手实例3 摄氏温度与华氏温度转换
def wd(): w=input('请输入一个摄氏温度或者一个华氏温度,如,34c/C or 34f/F:') if w[-1] in ['c','C']: w=float(w[:-1]) hs=1 ...
- XGBboost 特征评分的计算原理
xgboost是基于GBDT原理进行改进的算法,效率高,并且可以进行并行化运算,而且可以在训练的过程中给出各个特征的评分,从而表明每个特征对模型训练的重要性, 调用的源码就不准备详述,本文主要侧重的是 ...
- vue父子组件生命周期执行顺序
之前写了vue的生命周期,本以为明白了vue实例在创建到显示在页面上以及销毁等一系列过程,以及各个生命周期的特点.然而今天被问到父子组件生命周期执行顺序的时候一头雾水,根本不知道怎么回事.然后写了一段 ...
- Oracle 数据库基础知识
depyno 部门编号 部门表 dname 部门名称 location 地址----------------------------------------empno 员工编号 员工表ename 员工 ...
- eclipse添加jar包进jar源码debug调试
1.点击调试配置 2.选中源码 3.点击添加 4.点击java路径变量 5.点击环境变量配置 6.输入名称及jar包复制限定名