Symfony 服务
最后修改于 2025 年 3 月 3 日
Symfony 服务教程展示了如何在 Symfony 中创建服务。该服务从数据库中获取数据。
Symfony
Symfony 是一套可重用的 PHP 组件,也是一个用于 Web 项目的 PHP 框架。Symfony 于 2005 年发布为自由软件。Symfony 的最初作者是 Fabien Potencier。Symfony 深受 Spring Framework 的启发。
Symfony 服务
Symfony 应用程序的功能被划分为称为服务的更小的块。服务是 PHP 对象。服务存在于 Symfony 服务容器中。有许多内置服务。可以使用类型提示在 Symfony 应用程序中自动注入服务。
可以使用 php bin/console debug:container 命令生成可用服务的列表。
# makes classes in src/ available to be used as services
# this creates a service per class whose id is the fully-qualified class name
App\:
resource: '../src/*'
exclude: '../src/{DependencyInjection,Entity,Migrations,Tests,Kernel.php}'
这是 services.yaml 配置文件的一部分。src 目录中的 PHP 类可以通过类型提示自动注入到我们的代码中。
Symfony 服务示例
在下面的示例中,我们从 PostgreSQL 数据库中获取数据。数据检索被委托给一个特定的应用程序组件:Symfony 服务。
$ symfony new symservice $ cd symservice
我们创建一个新的 Symfony 骨架项目,并导航到新创建的项目目录。
$ composer req doctrine orm
我们安装 Doctrine ORM 模块。
$ composer req maker --dev
我们安装 Symfony maker 组件。
CREATE TABLE countries (id serial PRIMARY KEY, name VARCHAR(100), population INT);
INSERT INTO countries(name, population) VALUES('China', 1382050000);
INSERT INTO countries(name, population) VALUES('India', 1313210000);
INSERT INTO countries(name, population) VALUES('USA', 324666000);
INSERT INTO countries(name, population) VALUES('Indonesia', 260581000);
INSERT INTO countries(name, population) VALUES('Brazil', 207221000);
INSERT INTO countries(name, population) VALUES('Pakistan', 196626000);
INSERT INTO countries(name, population) VALUES('Nigeria', 186988000);
INSERT INTO countries(name, population) VALUES('Bangladesh', 162099000);
INSERT INTO countries(name, population) VALUES('Nigeria', 186988000);
INSERT INTO countries(name, population) VALUES('Russia', 146838000);
INSERT INTO countries(name, population) VALUES('Japan', 126830000);
INSERT INTO countries(name, population) VALUES('Mexico', 122273000);
INSERT INTO countries(name, population) VALUES('Philippines', 103738000);
这是一些测试数据。它在 PostgreSQL 中创建了一个小型表。
doctrine:
dbal:
driver: 'pdo_pgsql'
server_version: '13'
charset: 'utf8'
default_table_options:
charset: 'utf8'
collate: 'utf8_unicode_ci'
url: '%env(resolve:DATABASE_URL)%'
默认情况下,我们为 Doctqrine DBAL 配置了 PostgreSQL 数据库。Doctrine Database Abstraction Layer (DBAL) 是一个建立在 PDO 之上的抽象层,它提供了一个直观且灵活的 API 来与最流行的关系型数据库进行通信。
DATABASE_URL=postgresql://user12:s$cret@localhost:5432/testdb
在 .env 文件中,我们配置数据库 URL。
$ php bin/console make:controller MyController
使用 bin/console 创建一个 MyController。
<?php
namespace App\Controller;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\Routing\Attribute\Route;
use App\Service\CountryService;
class MyController extends AbstractController
{
#[Route('/countries', name: 'countries')]
public function index(CountryService $countryService): JsonResponse
{
$countries = $countryService->findAll();
return $this->json([
'countries' => $countries
]);
}
}
MyController 以 JSON 格式返回 countries 表的所有行。它使用 CountryService 服务。
public function index(CountryService $countryService): JsonResponse
CountryService 是通过参数注入创建的。
<?php
namespace App\Service;
use App\Repository\CountryRepository;
class CountryService
{
public function __construct(
private readonly CountryRepository $countryRepository
) {}
/**
* Finds all countries
*/
public function findAll(): array
{
return $this->countryRepository->findAll();
}
}
CountryService 使用 CountryRepository 来获取数据。
public function __construct(
private readonly CountryRepository $countryRepository
) {}
我们自动注入 CountryRepository,并从中检索数据。
<?php
namespace App\Repository;
use Doctrine\DBAL\Connection;
class CountryRepository
{
public function __construct(
private readonly Connection $conn
) {}
/**
* Finds all countries
*/
public function findAll(): array
{
$queryBuilder = $this->conn->createQueryBuilder();
$queryBuilder->select('*')->from('countries');
return $queryBuilder->executeQuery()->fetchAllAssociative();
}
}
CountryRepository 包含一个从 countries 表检索所有行的方法。它使用 Symfony 的 DBAL 执行查询。
public function findAll(): array
{
$queryBuilder = $this->conn->createQueryBuilder();
$queryBuilder->select('*')->from('countries');
return $queryBuilder->executeQuery()->fetchAllAssociative();
}
我们使用 DBAL QueryBuilder 从表中获取所有行。Doctrine DBAL QueryBuilder 提供了一个方便、流畅的接口来创建和运行数据库查询。
$ symfony serve
Web 服务器已启动。
$ curl localhost:8000/countries
{"countries":[{"id":"1","name":"China","population":"1382050000"},
{"id":"2","name":"India","population":"1313210000"},
{"id":"3","name":"USA","population":"324666000"},
{"id":"4","name":"Indonesia","population":"260581000"},
{"id":"5","name":"Brazil","population":"207221000"},
{"id":"6","name":"Pakistan","population":"196626000"},
{"id":"7","name":"Nigeria","population":"186988000"},
{"id":"8","name":"Bangladesh","population":"162099000"},
{"id":"9","name":"Nigeria","population":"186988000"},
{"id":"10","name":"Russia","population":"146838000"},
{"id":"11","name":"Japan","population":"126830000"},
{"id":"12","name":"Mexico","population":"122273000"},
{"id":"13","name":"Philippines","population":"103738000"}]}
我们使用 curl 命令创建了一个请求。
在本教程中,我们在 Symfony 中创建了一个简单的服务。该服务从数据库获取数据,并在 Symfony 控制器中自动注入。
列出 所有 Symfony 教程。