yii、laravel框架都是基于symfony组件衍生,symfony的强大不用多说。文档里有的,很好找的就不写了

附:

  1. symfony官网  https://symfony.com/doc/3.4
  2. yml语法(秒懂的那种)https://www.jianshu.com/p/a8252bf2a63d
  3. twig语法  https://www.kancloud.cn/yunye/twig-cn/159454

--------------------------

学习笔记(v 3.4.22 附symfony5.0笔记) :

# 展示所有命令
php bin/console

1、bundle

1>创建

  php bin/console generate:bundle --namespace=BundleNamespace\YourBundle

2>注册

// app/AppKernel.php
public function registerBundles()
{
$bundles = [
//…,
new BundleNamespace\YourBundle(),
]; if (in_array($this->getEnvironment(), ['dev', 'test'])) {
$bundles[] = new Symfony\Bundle\WebProfilerBundle\WebProfilerBundle();
$bundles[] = new Sensio\Bundle\DistributionBundle\SensioDistributionBundle();
$bundles[] = new Sensio\Bundle\GeneratorBundle\SensioGeneratorBundle();
} return $bundles;
}

2、服务

一旦你启动一个Symfony应用程序,你的容器已经包含许多服务。这些就像工具*等待你利用它们。

可以通过如下命令查看全部服务:

  php bin/console debug:container

1>注册服务

  1. 在需要的Bundle下新建服务文件夹(service)
  2. 在新建的文件夹(service)下,建立class(名字根据业务逻辑来,symfony会自动注册/src下的类)
  3. 也可以在/config/service.yml手动注册
#   /config/service.yml

services:
# ... # this is the service's id
App\Service\SiteUpdateManager:
public: true

附.官网文档 》

2>调用服务

//方式1、在controller中 $this->container->get('服务的id')
$doctrine = $this->container->get('doctrine'); //方式2、在controller中 $service = $this->get(服务的类名::class);
//!!!此方式必须先use,即:use youerNamespace\yourServiceClass;
$service = $this->get(yourServiceClass::class); //方式3、从服务容器获取服务
$doctrine = $this->getContainer()->get('doctrine'); //方式4、依赖注入方式获取服务
use Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorageInterface;
use Symfony\Component\DependencyInjection\ContainerInterface;
class RunActionListenter
{
protected $em;
protected $tokenStorage;
public function __construct(TokenStorageInterface $tokenStorage,ContainerInterface $container){
$this->tokenStorage = $tokenStorage;
$this->em = $container->get('doctrine')->getManager();
}
}

3、数据库

1>常用命令:

#)、通过数据库生成实体类
php bin/console doctrine:mapping:import --force AppBundle annotation
//AppBundle:bundle名
//annotation:实体类格式 xml,yml, annotation #)、通过交互式的问题生成实体类
php bin/console doctrine:generate:entity #)、验证映射:
php bin/console doctrine:schema:validate #)、生成geter、seter
php bin/console doctrine:generate:entities AppBundle/Entity --no-backup #)、根据实体类更新数据库
php bin/console doctrine:schema:update --force

注意:每次更新完实体(entity)后要运行上面的update命令,否则对实体的更改不能同步到数据库,查询时会报错!

2>连接多数据库:

Symfony2 多数据库连接 - d&lufd - 博客园

3>一些概念:

// 一对多:当前表(entity)的一条记录和目标表(targetEntity值指向的那个表)的多条记录对应;

//Disasters.php

/**
* @ORM\OneToMany(targetEntity="Chatmessages", mappedBy="disasterid", cascade={"persist", "remove"})
*
*/
protected $chatmessages;

// 多对一:当前表(entity)多条记录和目标表(targetEntity值指向的那个表)的一条记录对应;

//Chatmessages.php

/**
* @ORM\ManyToOne(targetEntity="App\Entity\Role", inversedBy="users")
* @ORM\JoinColumn(name="roles", referencedColumnName="id")
* :
* targetEntity 目标实体类
* inversedBy/mappedBy 要映射到的目标类里的那个属性
* (inversedBy一般和Joincolumns并存,处于name外键所在的类;mappedBy为要映射到的类)
* name 当前表中外键的名字
* referencedColumnName 参考属性
*/
private $roles;

其他的一对一,多对多概念和上面类似,相信不用再多写废话了···

4>操作数据库:

1、常用操作方式

  1. Repository
  2. dql
  3. queryBuilder

  4. executeQuery 执行原生sql


# 使用Repository查询
// find($id) 通过id查询记录
// findBy(array('id' => $id)) 查询满足条件的条记录
// findOneBy(array('id' => $id)) 查询满足条件的一条记录
!!!注意,条件数组里的key(比如这里的id)不是数据库里的表字段,必须是entity里存在的属性。
// eg
$this->em->getRepository('App\Entity\ResourceType')->find($id);
$this->em->getRepository(ResourceType::class)->find($id);
$this->em->getRepository(ResourceType::class)->findBy(array('id' => $id)); # 使用DQL查询
$query = $em->createQuery('SELECT s FROM AppBundle\Entity\Signin s
WHERE s.userid = :uId
AND s.signintime BETWEEN :date AND :endDate');
$query->setParameters(array(
'uId' => $u->getId(),
'date' => date('Y',time()).'-01-01',
'endDate' => date('Y-m-d',time())
)); #$query->setMaxResults(10); 取10条记录
$res = $query->getResult(); # 使用executeQuery
$query = $this->em->getConnection()->prepare("SELECT * FROM project WHERE `open`=1 ORDER BY RAND() LIMIT 1");
$res = $query->executeQuery()->fetchAllAssociative();

4、文件系统

1>获取上传的文件

  • $request->files->all();获取上传的文件。

2>文件操作

  • Symfony\Component\Filesystem\Filesystem;  new这个类即可使用syfmony文件系统。

5、http

1>从Request获取请求的所有数据

适用于GET POST PUT DELETE等所有常用方式,

public function getParams($request){
$query = $request->query->all(); # get
$request = $request->request->all(); # post和其他
$data = json_decode($request->getContent(), true); # json return array_merge($query,$params);
} // 接收文件
$files = $request->files->all(); # 文件

参考自:Symfony\Component\HttpFoundation\Request.php

2>http响应/Response

# 返回一个http状态码
return new Response('parameter error', 400); # 返回json
$this->json([]);
$this->json($entiyObj); # 返回file
return $this->file(new File('path/to/file'));

6、获取配置的参数值

# 在控制器里 可以直接调用getParameter获取参数
$this->getParameter('参数名'); # 在其他服务里 use Symfony\Component\DependencyInjection\ContainerInterface; class SceneSplit
{
protected $container; // 先注入服务容器
public function __construct(ContainerInterface $container)
{
$this->container = $container;
} public function split($file)
{
// 调用getParameter获取参数
$url = $this->container->getParameter('参数名');
}
}

--------------------------

未完待续……

最后更新于:2022-3-22

symfony学习笔记3.4(bundle、service、doctrine的使用…)的更多相关文章

  1. symfony学习笔记2—纯的PHP代码和symfony的区别

    Symfony vs 纯PHP为啥symfony比普通的php文件访问要好?这一章我们写一个简单的php文件项目,然后组织它,你会发现为什么web应用会发展到现在这个样子.最后我们将学习symfony ...

  2. symfony学习笔记1—简介

    1.symfony快速入门还是先看代码结构把,这个是拿到代码的第一印象,app/:整个应用的配置,模版,translations,这个可能是多语言文件什么,src/:项目php文件,vendor/:第 ...

  3. android菜鸟学习笔记28----Android中的Service生命周期及本地和远程服务绑定的实现

    Service是Android中长期在后台运行的没有界面的组件,使用服务的优势在于:能够提高进程的优先级,系统不容易回收掉进程,即便回收了,内存充足的时候,会把进程重新创建. 1.服务的简单使用示例: ...

  4. Android(java)学习笔记146:Bundle和Intent类使用和交互

            Bundle只是一个信息的载体 将内部的内容以键值对组织 ,Intent负责Activity之间的交互自己是带有一个Bundle的.Intent.putExtras(Bundle bu ...

  5. Android(java)学习笔记181:利用Service在后台播放背景音乐

    1.在android应用程序里,有一种没有UI的类(android.app.Service)——Service.简单来说,Service是一个 background process(背景程序),通过背 ...

  6. 【ASP.NET MVC 学习笔记】- 18 Bundle(捆绑)

    本文参考:http://www.cnblogs.com/willick/p/3438272.html 1.捆绑(Bundle),一个在 View 和 Layout 中用于组织优化浏览器请求的 CSS ...

  7. k8s学习笔记之九: Service Account

    第一章.前言 每一个用户对API资源进行操作都需要通经过以下三个步骤: 第一步:对客户端访问进行认证操作,确认是否具有访问k8s权限 token(共享秘钥) SSL(双向SSL认证) ....通过任何 ...

  8. Sharepoint2013商务智能学习笔记之Secure Store Service服务配置(二)

    Secure Store Service 是运行在应用程序服务器上的授权服务,它提供一个存储用户凭据的数据库,Secure Store Service 在商务智能中的地位很重要,Sharepoint商 ...

  9. Android(java)学习笔记89:Bundle和Intent类使用和交互

    1. Bundle 和 Intent:    Bundle只是一个信息的载体 将内部的内容以键值对组织 ,Intent负责Activity之间的交互自己是带有一个Bundle的.Intent.putE ...

  10. Android(java)学习笔记124:利用Service在后台播放背景音乐

    1. 在android应用程序里,有一种没有UI的类(android.app.Service)——Service.简单来说,Service是一个 background process(背景程序),通过 ...

随机推荐

  1. Ceph的crush算法与一致性hash对比介绍

    本文分享自天翼云开发者社区<Ceph的crush算法与一致性hash对比介绍>,作者:l****n 首先,我们先回顾下一致性hash以及其在经典存储系统中的应用. 一致性hash的基本原理 ...

  2. flutter-double小数点相加,会出现小数点很多位

    在我们进行两个double运算时,例如:2..0-1.1 不是想象的输出0.9,而是0.89999999999999999.其主要原因是浮点数值采用二进制系统表示,而在二进制系统中无法精确的表示分数1 ...

  3. 关于选择最佳.NET Core SSH服务器库的全面分析

    关于选择最佳.NET Core SSH服务器库的全面分析 在安全远程访问领域,SSH(安全外壳协议)服务器对于在潜在不安全的网络上实现客户端与服务器之间的安全通信至关重要.对于使用.NET Core的 ...

  4. Hadoop - 执行start-dfs.sh、stop-dfs.sh 报错处理

    执行 sbin/start-dfs.sh 和 sbin/stop-dfs.sh 报错,且进程仍然在 start-dfs.sh和stop-dfs.sh会去hadoop-env.sh中找JDK的值,但是设 ...

  5. Vulnhub-DC-9靶机-SQL注入拿到账户+利用端口敲门连接ssh+信息泄露利用root脚本追加提权

    一.环境搭建 选择扫描虚拟机 选择靶机路径 如果出现以下信息 如下修改,修改和虚拟机一样的版本 二.信息收集 扫ip nmap -sn 192.168.108.0/24 得到靶机ip:192.168. ...

  6. 我的公众号接入了DeepSeek-R1模型,成为了一个会深度思考的强大.NET AI智能体!

    前言 前不久腾讯元器宣布接入满血版 Deepseek R1 模型,模型免费使用且不限量,为智能体开发提供更多样化的模型选择,带来更丰富的智能体功能和玩法. 今天咱们一起来把我公众号的.NET AI智能 ...

  7. 实测windows系统使用cmd搜索包含某个关键词的代码及PHP自动生成数据字典

    1.windows系统下进入cmd窗口-->替换自己的路径,执行下面命令 findstr /s /i "carlist" D:\phpstudy_pro\WWW\wxx\*. ...

  8. AI技术革命,工作效率10个最佳AI工具

    AI技术革命,工作效率10个最佳AI工具 目       录 1.      Vidwud AI PowerPoint生成器... 4 2.      Vidnoz AI音乐视频生成器... 5 3. ...

  9. uniapp 截屏扫码

    最近开发功能遇到个需求,用户点击某个操作之后,需要截取当前屏幕内容,并扫码识别屏幕截图中的二维码,代码如下: 首先将代码抽离到外部文件中,以便复用: // 截图 export function tak ...

  10. go 判断数组下标是否存在

    举例 现在需要判断命令行是否传了参数,即 os.Args[1] 是否存在 如果使用下述的判断: func main() { fmt.Println(os.Args[1]) } 会报错:index ou ...