原文: http://zetcode.com/symfony/service/

Symfony 服务教程展示了如何在 Symfony 中创建服务。 该服务从数据库中获取数据。

Symfony

Symfony 是一组可重用的 PHP 组件和一个用于 Web 项目的 PHP 框架。 Symfony 于 2005 年发布为免费软件。Symfony 的原始作者是 Fabien Potencier。 Symfony 受到 Spring 框架的极大启发。

Symfony 服务

Symfony 应用的功能分为称为服务的较小块。 服务是一个 PHP 对象。 服务位于 Symfony 服务容器中。 有许多内置服务。 可以通过使用类型提示在 Symfony 应用中自动连接服务。

使用php bin/console debug:container命令生成可用服务的列表。

  1. # makes classes in src/ available to be used as services
  2. # this creates a service per class whose id is the fully-qualified class name
  3. App\:
  4. resource: '../src/*'
  5. exclude: '../src/{DependencyInjection,Entity,Migrations,Tests,Kernel.php}'

这是一个services.yaml配置文件。 src目录中的 PHP 类可以通过类型提示自动注入到我们的代码中。

Symfony 服务示例

在以下示例中,我们从 MySQL 数据库中获取数据。 数据检索委托给特定的应用组件:Symfony 服务。

  1. $ composer create-project symfony/skeleton simpleservice
  2. $ cd simpleservice

使用composer,我们创建一个新的 Symfony 骨架项目。 然后我们找到新创建的项目目录。

  1. $ composer req annot orm-pack

我们安装了三个模块:annotationsorm-pack

  1. $ composer req server maker --dev

我们安装了开发 Web 服务器和 Symfony maker

countries_mysql.sql

  1. CREATE TABLE countries(id BIGINT NOT NULL PRIMARY KEY AUTO_INCREMENT,
  2. name VARCHAR(100), population INT);
  3. INSERT INTO countries(name, population) VALUES('China', 1382050000);
  4. INSERT INTO countries(name, population) VALUES('India', 1313210000);
  5. INSERT INTO countries(name, population) VALUES('USA', 324666000);
  6. INSERT INTO countries(name, population) VALUES('Indonesia', 260581000);
  7. INSERT INTO countries(name, population) VALUES('Brazil', 207221000);
  8. INSERT INTO countries(name, population) VALUES('Pakistan', 196626000);
  9. INSERT INTO countries(name, population) VALUES('Nigeria', 186988000);
  10. INSERT INTO countries(name, population) VALUES('Bangladesh', 162099000);
  11. INSERT INTO countries(name, population) VALUES('Nigeria', 186988000);
  12. INSERT INTO countries(name, population) VALUES('Russia', 146838000);
  13. INSERT INTO countries(name, population) VALUES('Japan', 126830000);
  14. INSERT INTO countries(name, population) VALUES('Mexico', 122273000);
  15. INSERT INTO countries(name, population) VALUES('Philippines', 103738000);

这是一些测试数据。 它在 MySQL 中创建一个小表。 我们可以使用 MySQL source命令执行文件。

config/packages/doctrine.yaml

  1. ...
  2. doctrine:
  3. dbal:
  4. # configure these for your database server
  5. driver: 'pdo_mysql'
  6. server_version: '5.7'
  7. charset: utf8mb4
  8. default_table_options:
  9. charset: utf8mb4
  10. collate: utf8mb4_unicode_ci
  11. ...

默认情况下,我们有一个为 Doctrine DBAL 配置的 MySQL 数据库。 教义数据库抽象层(DBAL)是位于 PDO 之上的抽象层,并提供了直观,灵活的 API,可用于与最流行的关系数据库进行通信。

.env

  1. ...
  2. DATABASE_URL=mysql://user12:s$cret@localhost:3306/mydb

.env文件中,我们配置数据库 URL。

  1. $ php bin/console make:controller DataController

bin/console创建一个DataController

src/Controller/DataController.php

  1. <?php
  2. namespace App\Controller;
  3. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  4. use Symfony\Component\Routing\Annotation\Route;
  5. use App\Service\DataService;
  6. class DataController extends AbstractController
  7. {
  8. /**
  9. * @Route("/data", name="data")
  10. */
  11. public function index(DataService $dserv)
  12. {
  13. $countries = $dserv->findAll();
  14. return $this->json([
  15. 'data' => $countries
  16. ]);
  17. }
  18. }

DataController以 JSON 格式返回countries表中的所有行。 它使用DataService服务。

  1. public function index(DataService $dserv)
  2. {

通过参数注入创建DataService

注意:为简单起见,我们已将数据库访问代码放置在服务类中。 生产应用中还有另一层:存储库。 数据库访问代码放置在存储库类中,该存储库类从服务类中调用。

src/Service/DataService.php

  1. <?php
  2. namespace App\Service;
  3. use Doctrine\DBAL\Driver\Connection;
  4. class DataService
  5. {
  6. private $conn;
  7. public function __construct(Connection $conn)
  8. {
  9. $this->conn = $conn;
  10. }
  11. /**
  12. * Finds all countries
  13. */
  14. public function findAll() {
  15. $queryBuilder = $this->conn->createQueryBuilder();
  16. $queryBuilder->select('*')->from('countries');
  17. $data = $queryBuilder->execute()->fetchAll();
  18. return $data;
  19. }
  20. }

DataService包含一种从countries表中检索所有行的方法。 它使用 Symfony 的 DBAL 执行查询。

  1. public function __construct(Connection $conn)
  2. {
  3. $this->conn = $conn;
  4. }

该服务还使用自动装配来创建Connection对象。

  1. /**
  2. * Finds all countries
  3. */
  4. public function findAll() {
  5. $queryBuilder = $this->conn->createQueryBuilder();
  6. $queryBuilder->select('*')->from('countries');
  7. $data = $queryBuilder->execute()->fetchAll();
  8. return $data;
  9. }

我们使用 DBAL QueryBuilder从表中获取所有行。 Doctrine DBAL QueryBuilder提供了一个方便,流畅的接口来创建和运行数据库查询。

  1. $ php bin/console server:run

Web 服务器已启动。

  1. $ curl localhost:8000/data
  2. {"data":[{"id":"1","name":"China","population":"1382050000"},
  3. {"id":"2","name":"India","population":"1313210000"},
  4. {"id":"3","name":"USA","population":"324666000"},
  5. {"id":"4","name":"Indonesia","population":"260581000"},
  6. {"id":"5","name":"Brazil","population":"207221000"},
  7. {"id":"6","name":"Pakistan","population":"196626000"},
  8. {"id":"7","name":"Nigeria","population":"186988000"},
  9. {"id":"8","name":"Bangladesh","population":"162099000"},
  10. {"id":"9","name":"Nigeria","population":"186988000"},
  11. {"id":"10","name":"Russia","population":"146838000"},
  12. {"id":"11","name":"Japan","population":"126830000"},
  13. {"id":"12","name":"Mexico","population":"122273000"},
  14. {"id":"13","name":"Philippines","population":"103738000"}]}

我们使用curl命令创建一个请求。

在本教程中,我们在 Symfony 中创建了一个简单的服务。 该服务从数据库中获取数据,并在 Symfony 控制器中自动连线。

您可能也对以下相关教程感兴趣: Symfony 简介Doctrine DBAL QueryBuilder教程Symfony DBAL 教程Symfony 上传文件教程Symfony 表单教程PHP 教程或列出所有 Symfony 教程