打开 symfony官网 https://symfony.com/download
下载 scoop 工具 ! 这个很苦恼,这个可是搞了我好就… 跟着安装就好了
1.打开powershell的远程权限
Set-ExecutionPolicy RemoteSigned -scope CurrentUser
不这样做的话 会报错!!!
2.自定义 Scoop 安装目录 $env:SCOOP=‘D:\scoop’
3.设置用户环境变量
[Environment]::SetEnvironmentVariable(‘SCOOP’, $env:SCOOP,‘User’)
4.输入命令安装 iwr -useb get.scoop.sh | iex
安装成功后 输入命令 scoop help 查看是否安装成功
安装成功后 在按照文档安装scoop 命令
scoop install symfony-cli
最后两个命令 安装项目,到你指定的文件下,例如 cd/phpstudy/www
symfony new --webapp my_project
symfony new my_project
symfony的路由 有一个注释路由
需要安装软件包才能使用 命令:
composer require annotations
安装symfony模版 template :index存放的位置
composer require template
二、安装 一些扩展
1.composer update 更新扩展
2.composer make 安装 make扩展
3.通过docker容器 安装mysql
symfony console make:docker:database
我的有乱码,可以忽略掉,主要是 他问你 选择哪一个数据库进行安装
这里选择的是mysql ,输入 0,然后他问你 要安装的版本是多少,选择的是5.7 回车
然后选择 A 的命令进行复制 :忽略乱码,命令为:docker-compose up -d database
就成功安装了mysql5.7 的数据库
symfony console make:entity 创建类 —— 也可以叫 创建数据库字段
图片路径自定义:
symfony console config:dump framework assets
查看 asset 配置项 ,配置不同的包名,为不同的包设置路径
在文件 : framewoke.yaml 中 定义:
asset:
packages:
file_upload : # 包的名字
base_path : ‘%base_path%’ # 包路径
然后在 servers.yaml 文件中 定义: 找到 parameters
parameters :
base_path : ‘upload/img’ #图片存放的路径
upload_dir : ‘public/%base_path%’ #图片上传的路径
设置成功后,在代码中 可以通过 $this->getParameters(‘base_path’);
设置图片的路径 和上传路径
$this->getParameters(‘upload_dir’);
视图中显示图片:
<img src = " {{ asset(value.img, ‘file_upload’)}}">
value.img : 图片显示的值,file_upload : 图片的路径,也就是 farmework.yaml 文件中 assets 下 包的名字
controller 创建表单
需要先安装 form类
composer require symfony/form
安装好之后,我们需要通过make 方法来创建一个表单
symfony console make:form —— 创建一个表单类
创建提示:
1.创建的类名,也就是文件名字
例如:CommentType
2.要绑定的类名 —— 解释:
例如:Comment
最开始的时候 使用命令行 symfony console make:entity 创建的类名,里面存放的是 数据库表的字段 所生成的一个文件
<?php
namespace App\Form;
use App\Entity\Comment;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolver;
class CommentType extends AbstractType
{
public function buildForm(FormBuilderInterface $builder, array $options): void
{
$builder
->add('author')
->add('email')
// ->add('createTime')
// ->add('updateTime')
->add('message')
// ->add('article')
;
}
public function configureOptions(OptionsResolver $resolver): void
{
$resolver->setDefaults([
'data_class' => Comment::class,
]);
}
}
然后会通过 add方法创建表单,注释掉的部分是不需要的展示在页面的,前两个是 创建时间 和 修改时间,这个添加的时候去生成,最下面的是 关联的 ID,这个也是不需要显示在页面上的。
然后在 对应的控制器下面添加代码:
// ArticleController.php
// 使用 createForm 调用表单方法
// 里面的参数 就是你类名—— 上一步创建的文件名字
$formData = $this->createForm(ContentType::class);
//然后通过 $this->render 里面去渲染
$this->render('模版名字',[
'formData'=>$formData->createView();
]);
HTML 引用此模版
{{ form(formData) }}
但是现在只有表单,没有提交按钮,接下来创建一个提交按钮
->add('submit',submitType::class)
// add 方法有三个参数 1: 设置名字,2:设置类型,3:设置属性
修改代码:
// ArticleController.php
public function show(Request $request , Article $article,EntityManagerInterface $doctrine): Response
{
// $request 获取请求,$article 获取对象的方法,EntityManagerInterface 通过依赖注入的方式,传入参数,可以理解为插入数据库的操作
$data = $this->createForm(ContentType::class);
// 上面讲过,此处略过
$data->handleRequest($request);
// 对表单提交的请求 进行处理,参数就是 $request 对象
// 如果表单已经提交,并且表单是可以使用的 情况下
if($formData->isSubmitted() && $formData->isValid()){
//获取表单提交的对象 数据
$result = $data->getData();
//声明 $result 是 Content 的集合
/**@var Content $result**/
// 这个是因为 Content 表里面有 Article的关联 ID
// 此为 设置关联ID 的值,参数就是上面方法传过来的对象
$result->setArticle($article);
// 提交数据
$doctrine->persit($result);
$doctrine->flsh();
}
}
遇到的很烦人的问题:
//括号里面的是依赖注入!Article 和 Content 分别是两个不同的表结构文件,里面的 自增ID 名字都叫ID
// 现在有一个场景是 评论 和回复评论,那么我现在要拿到这两个的ID,去做处理,通过 ParamConverter 注解去实现,可以把他理解为 ID 的重命名
// 假设我的路由 如下:
/**
* @Route("/article/{article_id}/comment/{content_id}/reply", name="app_comment",methods={"GET","POST"}),
* @ParamConverter("article", class="App\Entity\Article", options={"id": "article_id"})
* @ParamConverter("Content", class="App\Entity\Content", options={"id": "content_id"})
* @param Request $request
* @param Article $article
* @param Content $content
* @param EntityManagerInterface $doc
* @return Response
*/
// ParamConverter : 第一个参数 就是你的文件名字相当于,第二个参数可以理解为 路径,第三个参数,可以理解为 你要重命名的 参数是什么
// @ParamConverter("article", options={"id": "article_id"}) 之前是这样写的,但是不知道咋回事,看视频上的就好使,我的就不行,就各种找不到类,找不到类......
public function demo(Request $request,Article $article,Content $content){
}
2.cascade : 级连操作,例如:删除上级评论,但是上级评论下有子评论,这个时候后台删除,就会报错,意思是告知你 ,这条评论下有子评论,不能删除
可以使用 cascade 这个属性 来操作
children 是一个子集的集合
/**
* @ORM\OneToMany(targetEntity=Content::class, mappedBy="parent",cascade={"remove"})
*/
private $children;
提示消息:
// 提示消息
$this->addFlash('success','成功');
数据分页:
//ArticleController.php
/**
* @Route("/index/{page}", name="app_article_index", methods={"GET"})
* @param ArticleRepository $articleRepository
* @return Response
*/
public function index(Request $request, ArticleRepository $articleRepository,PaginatorInterface $paginator,$page = 1): Response
{
//自己写的分页
// $page = $request->query->getInt('page',1);
// $limit = 5;
// $offset = ($page-1) * $limit;
// $paginator = $articleRepository->getPagination($limit,$offset);
// $maxPage = ceil($paginator->count()/$limit);
// 自带的分页
$products = $articleRepository->getPage();
$pagination = $paginator->paginate($products, $page,3);
return $this->render('article/index.html.twig', [
// 'articles'=>$paginator,
// 'page'=>$page,
// 'maxPage'=>$maxPage,
'pagination'=>$pagination,
// 'articles'=>$products,
// 'articles' => $articleRepository->findBy(['status' => 1],['id'=>'DESC']),
]);
}
//ArticleRepository.php
// 可以理解为 封装的自定义查询方法
public function getPagination(int $limit,int $offset):Paginator
{
$query = $this->createQueryBuilder('p')
->andWhere('p.status = 1')
->orderBy('p.id','DESC')
->setMaxResults($limit) // 查询限制条数
->setFirstResult($offset) // 查询起始量
->getQuery();
return new Paginator($query);
}
public function getPage():Query
{
return $query = $this->createQueryBuilder('p')
->andWhere('p.status = 1')
->orderBy('p.id','DESC')
->getQuery();
}