小编yiv*_*ivi的帖子

在 PHP 中扩展 DateTime 和 DateTimeImmutable

我有一堆DateTime以各种方式进行操作的小程序函数,我突然想到,如果我扩展类DateTime并将这些函数转换为类的方法,那么使用起来可能会更容易。

好吧,很简单,我可以这样做:

namespace My\Project;

class DateTime extends \DateTime {
    ... various new methods etc...
}
Run Code Online (Sandbox Code Playgroud)

但是...我也使用DateTimeImmutable对象,并且也希望在该类中添加这些内容。

有没有某种方法可以扩展这两个类以包含我的新功能而无需重复代码?(是的,我知道我可以将新方法复制/粘贴到两个新类中。这里尽量保持干燥。)

PHP 没有某种方法可以将代码“旁加载”到类中吗?或者一种扩展但也包含特定于和 的DateTimeInterface代码的方法?DateTimeDateTimeImmutable

像这样扩展公共类是不好的做法吗?(它会在路上咬我的屁股吗?)

php oop datetime extend

3
推荐指数
1
解决办法
1211
查看次数

如何在 Symfony 4 中使用事件处理异常?

现在我正在尝试捕获这样的异常事件:

try {
    echo 1 / 0;
} catch (\Exception $e){
    $subs = new ExceptionSubscriber();
    $this->dispatcher->addSubscriber($subs);
};
Run Code Online (Sandbox Code Playgroud)

我定义了 ExceptionSubscriber ,如下所示:

class ExceptionSubscriber implements EventSubscriberInterface
{

    public static function getSubscribedEvents()
    {
        return [
            KernelEvents::EXCEPTION => [
                ['processException', 10],
                ['exception', -10],
            ],
        ];
    }

    public function exception(ExceptionEvent $event)
    {
        echo 'test321';
    }

    public function processException(ExceptionEvent $event)
    {
        echo 'test123';
    }
}
Run Code Online (Sandbox Code Playgroud)

这是我的 services.yaml

App\EventSubscriber\ExceptionSubscriber:
    tags:
        - { name: kernel.event_subscriber, event: kernel.exception }
Run Code Online (Sandbox Code Playgroud)

我知道我捕获的常规 PHP 异常不是内核异常事件之一,在这种情况下我必须创建自定义异常事件,对吧?

我使用而不是侦听器调度事件的方式EventSubscriber很好

我是否必须分派这些事件,或者它们以某种神奇的方式传递给订阅者?

php exception symfony symfony4

3
推荐指数
1
解决办法
9333
查看次数

为什么在Symfony 4中使用相同的盐和密码调用encodePassword()会产生不同的哈希值?

UserPassword 编码器中

public function encodePassword(UserInterface $user, string $plainPassword)
{
    $encoder = $this->encoderFactory->getEncoder($user);
    return $encoder->encodePassword($plainPassword, $user->getSalt());
}
Run Code Online (Sandbox Code Playgroud)

编码器从用户实体获取帮助。

我为getSalt()in User实体设置了一个静态变量:

public function getSalt()
{
    return 'my-static-salt';
}
Run Code Online (Sandbox Code Playgroud)

但是当我编码时:

$password  = $encoder->encodePassword($user, "my-password");
$password2 = $encoder->encodePassword($user, "my-password");
Run Code Online (Sandbox Code Playgroud)

$password$password2彼此不同的,因为如果该encodePassword()方法使用随机盐。

我想念什么?

php password-hash symfony symfony4

3
推荐指数
1
解决办法
93
查看次数

忽略自动装配目录中的类

我的服务/文件夹中的某个地方有一个异常,Symfony 正在尝试自动装配它:

无法自动装配服务“App\Service\Order\Exception\StripeRequiresActionException”:方法“__construct()”的参数“$secretKey”是类型提示的“string”,您应该明确配置其值。

这是我的课:

class StripeRequiresActionException extends \Exception
{
    /**
     * @var string
     */
    protected $secretKey;

    public function __construct(string $secretKey)
    {
        parent::__construct();

        $this->secretKey = $secretKey;
    }

    /**
     * @return string
     */
    public function getSecretKey(): string
    {
        return $this->secretKey;
    }
}
Run Code Online (Sandbox Code Playgroud)

我不希望它被自动装配。有没有一种简单的方法来防止这个类被 DI 加载,例如带有注释?我知道我可以在我的 yaml 配置中排除这个类,但我不想这样做,因为我觉得这很丑陋且难以维护。

php autowired symfony

3
推荐指数
2
解决办法
2808
查看次数

Symfony 4、Doctrine 和 AWS RDS 只读副本使用

我即将开始使用具有主读/写和从只读设置的 RDS。

我已经阅读了 Doctrine MasterSlaveConnection 类型。

但是,我会创建一些我想使用只读副本的端点(我的大多数 GET 端点),有些需要写入数据(PUT、PATCH、DELETE 端点)。

我也在使用 API 平台。

在 Symfony 4 和 Doctrine 2 中实现这一目标的最佳方法是什么?

php doctrine symfony doctrine-orm

3
推荐指数
2
解决办法
1725
查看次数

创建 Symfony 5 骨架实体 - 制造商包不起作用

我正在努力奔跑

make:entity
Run Code Online (Sandbox Code Playgroud)

但我收到一个错误:

“make”命名空间中没有定义命令

您可能正在寻找当前未安装的“MakerBundle”提供的命令。尝试运行“composer require symfony/maker-bundle --dev”

我遵循该建议并通过执行以下操作安装捆绑包:

composer require symfony/maker-bundle --dev
Run Code Online (Sandbox Code Playgroud)

它安装成功: 在此处输入图片说明

然而,当我尝试运行时,make:entity我得到了完全相同的错误:

在此处输入图片说明

“make”命名空间中没有定义命令

您可能正在寻找当前未安装的“MakerBundle”提供的命令。尝试运行“composer require symfony/maker-bundle --dev”

我错过了什么?

php symfony composer-php

3
推荐指数
1
解决办法
1373
查看次数

为什么在 dockerfile 中运行的 composer install 命令中看不到卷目录中的 composer.json 文件?

docker-compose.yml:

version: '3.3'
services:
    web:
        image: nginx:latest
        ports:
            - "8080:80"
        volumes:
            - ./api:/var/www/html/api
            - ./site.conf:/etc/nginx/conf.d/default.conf
        links:
            - php
    php:
        build:
            context: ./docker
            dockerfile: php.Dockerfile
        volumes:
        - ./api:/var/www/html/api
        links:
            - db
    db:
       image: mysql:5.7 
       environment:
         MYSQL_ROOT_PASSWORD: password
         MYSQL_DATABASE: symfony
         MYSQL_USER: symfony
         MYSQL_PASSWORD: symfony
       ports:
         - "9906:3306"
Run Code Online (Sandbox Code Playgroud)

php.Docker 文件:

FROM php:7-fpm
WORKDIR /var/www/html/api
COPY --from=composer /usr/bin/composer /usr/bin/composer
RUN apt-get update && apt-get upgrade -y \
    && apt-get install -y git libzip-dev unzip \
    && docker-php-ext-install \
        pdo_mysql zip \
    && docker-php-ext-enable \ …
Run Code Online (Sandbox Code Playgroud)

php composer-php docker

3
推荐指数
1
解决办法
1067
查看次数

Symfony MessageHandler 计算消息已发送的次数

我正在使用 Symfony Messenger,我想继续在处理程序中发送消息,直到它被发送多次。

我怎样才能跟踪它?

这是到目前为止我的处理程序类的代码:

class RetryTestHandler implements MessageHandlerInterface
{
    /**
    * @var EntityManagerInterface
    */
    private $entityManager;
    /**
     * @var MessageBusInterface
     */
    private $bus;

    public function __construct(MessageBusInterface $bus, EntityManagerInterface $entityManager)
    {
        $this->entityManager = $entityManager;
        $this->bus = $bus;
    }

    public function __invoke(RetryTest $message)
    {
        // TODO: Keep dispatching message until it has been dispatched 10 times?
        $this->bus->dispatch(new RetryTest("This is a test!"), [
            new DelayStamp(5000)
        ]);
    }
}

Run Code Online (Sandbox Code Playgroud)

php symfony symfony4 symfony-messenger

3
推荐指数
1
解决办法
3381
查看次数

为什么 Symfony 5.1 不能识别“routes.php”文件中配置的路由?

我在尝试使用config/routes.phpSymfony 5.1 中的文件配置我的路由时遇到了困难。

根据Symfony 路由文档,我应该能够在 PHP 文件中配置我的路由:

您可以在单独的 YAML、XML 或PHP文件中定义它们,而不是在控制器类中定义路由。主要优点是它们不需要任何额外的依赖。

但实际上,Symfony 仅在我将路由放入文件时才识别路由routes.yaml

在文件routes.php 中配置的路由会导致错误“找不到用于“GET /something”的路由(404 Not Found)”。运行时debug:router,不会列出这些路由。

routes.yaml.

在另一个使用 的项目中Symfony 5.0.8,路由配置 viaroutes.php就像一个魅力。

这是我测试它的方式:

  1. 创建了一个控制器(省略,因为它不相关,任何控制器都可以)

  2. 创建了一个routes.php文件:

//config/routes.php example

use App\Controller;
use Symfony\Component\Routing\Loader\Configurator\RoutingConfigurator;

return function(RoutingConfigurator $routes)
{
    $routes->add('schools_list', '/schools')
        ->controller([Controller\SchoolController::class, 'list'])
        ->methods(['GET']);
};
Run Code Online (Sandbox Code Playgroud)
  1. 运行debug:router将导致:
 ---------------- -------- -------- ------ -------------------------- 
  Name             Method   Scheme   Host   Path                      
 ---------------- -------- -------- ------ -------------------------- 
  _preview_error …
Run Code Online (Sandbox Code Playgroud)

php symfony symfony-routing symfony5

3
推荐指数
1
解决办法
1681
查看次数

使用 Symfony Messenger 异步发送电子邮件时如何翻译电子邮件?

我将 Symfony 邮件程序配置为使用 Messenger 发送电子邮件。

https://symfony.com/doc/current/mailer.html#sending-messages-async

我有两种语言的电子邮件,我依靠请求来检测语言,但现在电子邮件没有翻译。

我如何才能将消息翻译成请求中检测到的语言?

在我的控制器中:

$mailer->send(
            $user->email,
            $this->translator->trans('mails.recover.subject'),
            'email/client/password-recovery.html.twig',
            compact('user', 'hash', 'target')
        );
Run Code Online (Sandbox Code Playgroud)

模板:

{% extends 'email/base.html.twig' %}

{% block content %}
    <h2>{{ 'mails.recover.header' | trans({'%name%': user.name}) }}</h2>

    <p style="margin: 25px 0;">
        {{ 'mails.recover.text1' | trans({'%url%': url('default')}) | raw }}
    </p>

// More code
Run Code Online (Sandbox Code Playgroud)

信使配置:

framework:
    messenger:
        # Uncomment this (and the failed transport below) to send failed messages to this transport for later handling.
        # failure_transport: failed

        transports:
            # https://symfony.com/doc/current/messenger.html#transport-configuration
            async: '%env(MESSENGER_TRANSPORT_DSN)%'
            # failed: 'doctrine://default?queue_name=failed' …
Run Code Online (Sandbox Code Playgroud)

php symfony symfony-mailer

3
推荐指数
1
解决办法
664
查看次数