我正在使用Symfony2表单生成器来制作表单.一切都运作良好,但表现很糟糕.一个简单的表单(只是几个文本字段)在大约1000毫秒内呈现,但是对于实体或集合字段,它会减慢到大约7500-10000毫秒.
我正在使用query_builder(with createQueryBuilder())选项,就像文档中的这个例子一样.添加集合或实体字段会使应用程序变得非常缓慢,但我不知道为什么.
Controller占用大部分时间,因此Doctrine部分(192个查询)或Twig部分似乎不是问题.剥离树枝模板没有帮助.我已经尝试了一些改进(缓存),但这也没有帮助.
如何改进(或者:确切地说明问题的确切位置)这段代码的性能?
我想给一个实体(发票,订单,预订等)一个唯一的序列号,但在那一年内只是唯一的.因此,每年(或其他字段,如客户)启动的第一张发票的ID为1.这意味着可以有复合主键(年份,ID)或一个主键(即invoice_id)和另外两个列.独特的.
我的问题:使用Doctrine2和Symfony2为对象提供自动生成的ID和其他值的唯一组合的最佳方法是什么?
复合键的学说限制
Doctrine不能将自动生成的ID分配给具有复合主键的实体(http://docs.doctrine-project.org/projects/doctrine-orm/en/latest/tutorials/composite-primary-keys.html) :
具有复合键的每个实体都不能使用除"ASSIGNED"之外的id生成器.这意味着ID字段必须在调用之前设置其值
EntityManager#persist($entity).
手动设置序列号
所以我必须手动分配ID.为了做到这一点,我试图在某一年寻找最高的ID并给新ID + 1的实体.我怀疑这是最好的方式,即使它是,我还没有找到最好的( DRY)这样做的方法.由于我认为这是一个通用问题,我想防止XY问题,我已经开始提出这个问题了.
香草选择:仅限MyISAM
我基于这个答案找到了'vanilla'MySQL/MyISAM解决方案:
CREATE TABLE IF NOT EXISTS `invoice` (
`year` int(1) NOT NULL,
`id` mediumint(9) NOT NULL AUTO_INCREMENT,
PRIMARY KEY (`year`,`id`)
) ENGINE=MyISAM;
Run Code Online (Sandbox Code Playgroud)
由于Doctrine2的局限性,这是行不通的,所以我正在寻找一个类似于这个vanilla MySQL解决方案的Doctrine ORM.
其他方案
InnoDB也有一个解决方案:在MySQL中使用自动增量定义复合键
我正在寻找一种方法(regex、snippet、plugin 等)来使用 sublimeText 使用新的 php 语法转换旧数组。
// Old synthax
$var = array(
'foo' => 'bar'
);
// New synthax
$var = [
'foo' => 'bar'
];
Run Code Online (Sandbox Code Playgroud)
有人有想法吗?
php sublimetext sublimetext2 sublimetext3 sublime-text-plugin
我是新手.我想知道版本中的hive-site.xml和hive-default.xml文件位置hive-0.13.1.
我hive0.13.1-bin从以下位置下载了版本.
http://apache.mirrors.pair.com/hive/hive-0.13.1/
提取并配置hive环境变量.
我能够运行命令(create table, show, load data, query table..).
但在conf(/hive/hive-0.13-1/conf)目录中,我没有看到hive-site.xml 和hive-default.xml文件.
这些文件位于hive-0.13.1版本中的哪个位置?
我正在为我的应用程序编写单元测试。我编写了一个函数来登录不同的用户(以测试用户级别)和一个函数来生成有效或无效的表单数据(以测试我的表单处理)。
当测试提交表单时,会抛出异常:
Uncaught PHP Exception LogicException: "Cannot set session ID after the session has started."
Run Code Online (Sandbox Code Playgroud)
我正在使用 Symfony 2.6.4。我找不到有关此错误消息的任何有用信息。不久前,该测试运行良好。
class ControllerTest extends WebTestCase
{
public $client = null;
public $route = 'home/';
/**
* @var \Doctrine\ORM\EntityManager
*/
public $em;
public function setUp()
{
self::bootKernel();
$this->client = static::createClient();
$this->em = static::$kernel->getContainer()
->get('doctrine')
->getManager()
;
}
public function logIn($role = 'admin')
{
if ($role === 'admin') {
$userId = 20;
} elseif ($role === 'user') {
$userId = 29;
}
$user = $this->em->getRepository('Acme\DemoBundle\Entity\User')->find($userId); …Run Code Online (Sandbox Code Playgroud) 我有一个集合类型:
->add('tipi', CollectionType::class, array(
'entry_type' => TipiType::class,
'allow_add' => true,
'prototype' => true,
'mapped' => false,
'entry_options' => array(
'required' => true,
'label' => false,
)
))
Run Code Online (Sandbox Code Playgroud)
扩展此表单类型:
->add('tipi', EntityType::class, array(
'label' => 'Tipo',
'class' => 'AppBundle:Tipi',
'attr' => array('class' => 'form-control'),
'query_builder' => function (EntityRepository $er) {
return $er->createQueryBuilder('t')
->innerJoin('t.requests', 'r')
;
},
));
Run Code Online (Sandbox Code Playgroud)
在第一种表单类型中,我有一个从控制器发送的选项,如下所示:
$idRequest = $request->get('id');
$form = $this->createForm(RequestsType::class, $requests, array(
'id_request' => $idRequest
));
Run Code Online (Sandbox Code Playgroud)
在第一个中我可以使用它,但在子 FormType 中则不能。我会在集合类型中传递这个变量。我怎样才能做到这一点?
$form = $this->createForm(new YourForm($options), $class);
Run Code Online (Sandbox Code Playgroud) 在我的应用程序中,我有几个表单字段有很多选项.我遇到的问题类似于这个问题:在每个页面加载时获取和解析所有选项都很昂贵(Twig一遍又一遍地渲染所有选项,而没有客户端缓存可能).这个问题让我创建了一种通过AJAX将选项发送到浏览器的方法.相当简单的方法:
为了防止Symfony查询所有选项(不必要:它们通过AJAX加载)我添加setMaxResults(0)到QueryBuilder表单加载时(通过控制器添加选项).是的,这是kludge.提交表单时,它仍将执行查询,因为它必须验证所选选项是否存在(并检查约束).
我想创建一个自定义表单字段类型,将此功能添加到当前EntityType:不要在呈现表单时加载选项,但仍检查所选选项是否存在.我发现了许多 与动态修改表单相关的示例,但是我没有找到与仅修改一个表单字段相关的示例,而与其父表单无关.
如何创建这样的表单字段类型?什么是一个很好的起点?扩展EntityType,ChoiceType或其他的方法呢?
我已经在使用Symfony 3.1了,所以使用延迟加载表单选项(Symfony 3.2中的新功能)不会有问题.不确定这个新功能是否与我的问题有关.
我正在尝试优化我的 Symfony 应用程序性能,我关注了这些帖子:
我“担心”这些行:
doctrine:
orm:
entity_managers:
default:
metadata_cache_driver: apc
query_cache_driver: apc
result_cache_driver: apc
Run Code Online (Sandbox Code Playgroud)
它们是否可以安全使用,或者在部署后我必须小心处理它们?我正在清除缓存php app/console cache:clear --env=prod --no-debug,是否也需要清除 APC 缓存?
我已经实现了全新的 Symfony 身份验证系统:https : //symfony.com/doc/current/security/experimental_authenticators.html
我添加了新的登录限制:https : //symfony.com/blog/new-in-symfony-5-2-login-throttling
一切都已正确配置。
我还安装了 RateLimiter 组件,它创建了一个环境变量:
LOCK_DSN=semaphore
Run Code Online (Sandbox Code Playgroud)
但我有一个问题。首先,登录限制似乎被忽略了一半。一旦超出限制,我就没有错误消息。另一方面,如果我尝试使用良好的凭据进行连接,则会出现以下错误:
需要信号量扩展 (sysvsem)。
我尝试安装信号量组件(https://symfony.com/doc/current/components/semaphore.html)
但同样的问题。
这是我的security.yaml
LOCK_DSN=semaphore
Run Code Online (Sandbox Code Playgroud)
我搜索了是否有要添加到 PHP 的扩展,但找不到任何内容。所以我不知道该怎么办。我在 Windows 10 上
我在Cucumber中运行功能时遇到问题,这个功能非常基础,因为它来自教程.
它没有定义,如下:
Feature: Proof that my concept works
Scenario: My first test
Given this is my first step
When this is my second step
Then this is my final step
Run Code Online (Sandbox Code Playgroud)
我的Cucumber跑步者课程如下:
package cucumber;
import org.junit.runner.RunWith;
import cucumber.api.junit.Cucumber;
@RunWith(Cucumber.class)
@Cucumber.Options(
format = {"pretty", "json:target/"},
features = {"src/cucumber/"}
)
public class CucumberRunner {
}
Run Code Online (Sandbox Code Playgroud)
.jar我在项目中的外部文件如下:

我得到的例外是:
线程"main"中的异常cucumber.runtime.CucumberException:无法使用[cucumber.runtime.io.MultiLoader@75d837b6]实例化公共cucumber.runtime.java.JavaBackend(cucumber.runtime.io.ResourceLoader)
我试图在网上寻找解决这个问题的方法,但没有运气.
我也讨论了教程的OP,我还在等待反馈,但已经有一段时间了.
php ×7
symfony ×7
doctrine-orm ×3
ajax ×1
apc ×1
caching ×1
components ×1
cucumber ×1
cucumber-jvm ×1
exception ×1
forms ×1
hive ×1
hiveql ×1
java ×1
mysql ×1
performance ×1
phpunit ×1
profiling ×1
sql ×1
sublimetext ×1
sublimetext2 ×1
sublimetext3 ×1
unit-testing ×1