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’);

视图中显示图片:
<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();
    }
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

付煜晨

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值