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 / ...
随机推荐
- STDIN_FILENO和stdin
title: STDIN_FILENO和stdin date: 2019/03/15 22:03:22 toc: true --- STDIN_FILENO和stdin https://blog.cs ...
- [源码分析]ReentrantLock & AbstractQueuedSynchronizer & Condition
首先声明一点: 我在分析源码的时候, 把jdk源码复制出来进行中文的注释, 有时还进行编译调试什么的, 为了避免和jdk原生的类混淆, 我在类前面加了"My". 比如把Reentr ...
- 如何为 Jupyter Notebook 安装代码提示功能
按照上一篇博客安装完 Python 和 Jupyter Notebook 后,我们已经可以使用 Notebook 愉快的编写 Python 代码了,但是发现它不像其他编辑器那样会弹出代码提示,这稍微有 ...
- python之路(4)高阶函数和python内置函数
前言 函数式编程不用变量保存状态,不改变变量 内置函数 高阶函数 把函数当作参数传给另一个对象 返回值中包含函数 使用的场景演示: num_test = [1,2,10,5,8,7] 客户说 :对上述 ...
- python excel写入及追加写入
# -*- coding:utf-8 _*- """ @author:Administrator @file: excel.py Description :如果行数是10 ...
- Selenium-Switch--切换浏览器tab/iframe/alart
Switch 我们在UI自动化测试时,总会出现新建一个tab页面.弹出一个浏览器级别的弹框或者是出现一个iframe标签,这时我们用WebDriver提供的Api接口就无法处理这些情况了.需要用到Se ...
- C# - 设计模式 - 钩子模式
钩子模式 问题场景 如何控制抽象类的行为?解决办法是靠钩子!抽象类公布一个虚方法,由子类自行决定是否重写它,抽象类以钩子做判定,如果返回真则执行某个方法,否则不执行.为什么钩子不能是抽象的,因为如果钩 ...
- 第一章Java学习(查漏补缺)
第一章主要内容: 1.Java的地位:网络地位 语言地位 需求地位 2.Java的特点:①简单 面向对象 平台无关:软件的运行不因操作系统,处理器的变化而无法运行或出现运行错误. ②多线程 动态 3. ...
- grep、awk、sed的巩固练习
作者:邓聪聪 提取日志或文本中的关键内容 Apr :: localhost NetworkManager[]: <info> (eno16777736): Activation: star ...
- 题解-BJOI2019 光线
Problem loj3093 & x谷 题意概要:给定 \(n\) 块玻璃,每块玻璃有其折射比例与反射比例(折射比例+反射比例 不一定为 \(100\%\)),求从最上头打下一束光,有多少比 ...