php 安装symfony框架!
打开 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’);
视图中显示图片:
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 创建的类名,里面存放的是 数据库表的字段 所生成的一个文件
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.phppublic 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();}
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

