小编sie*_*iej的帖子

Doctrine2如何在回滚后处理更新实体?("EntityManager已关闭")

我正在尝试在事务中进行一些处理并保存有关潜在故障的信息,如下所示:

$conn->beginTransaction();
try
{
    $report = $reportRepository->find($id);
    $user = $report->getUser();

    $specification = new Specification();
    $entityManager->persist($specification);

    throw new ProcessingWentWrongException();

    $entityManager->flush();
    $conn->commit();
}
catch(ProcessingWentWrongException $e)
{
    $conn->rollback();

    // Store error info:
    $report->setState('error');
    $entityManager->persist($report);
    $entityManager->flush(); // all hell breaks loose in here
}
Run Code Online (Sandbox Code Playgroud)

这看起来像一个非常常见的模式,但是Doctrine让它变得非常困难:

  1. flushcatch{}节会尽量坚持既$report$specification这显然是错误的对象,所以我可以clearentityManager,但后来......

  2. 如果我clearentityManager,$report通过它不再管理,所以我需要调用$em->merge($report),以使其再次进行管理.显然$user会保持不受管理,所以学说要么表现insert要么抱怨persist cascade.所以我可以是merge()整个图形(很糟糕)或者close是entityManager,但是...

  3. 如果我close,entityManager我只能report通过 …

php doctrine symfony doctrine-orm

8
推荐指数
1
解决办法
3880
查看次数

我应该如何处理Doctrine 2中与BusinessLogic相关的数据定义(如状态类型)?

假设我有一个Booking实体,它有一个state可以设置为几个值的一个领域-让我们把它:NEW,ACCEPTED,和REJECTED

我正在寻找实现这一目标的"正确"方式.到目前为止,我使用了这样的方法:

class Booking
{
    const STATUS_NEW = 0;
    const STATUS_ACCEPTED = 1;
    const STATUS_REJECTED = 2;

    protected $status = self::STATUS_ACTIVE;
}
Run Code Online (Sandbox Code Playgroud)

它工作正常,但我真的很好奇"正确"的做法,我也有这个方法的一些问题:

  1. 它看起来非常像隐藏在实体类中的业务逻辑 - 如果实体应该是a POJO,那为什么它会关心状态呢?所以我可以把它放在一个经理类中:

    class BookingManager
    {
        const STATUS_NEW = 0;
        const STATUS_ACCEPTED = 1;
        const STATUS_REJECTED = 2;
    
        public function setBookingStatus(Booking $b, $status) { }
    
    }
    
    Run Code Online (Sandbox Code Playgroud)

    但它仍然无法解决第二个问题:

  2. 很难在视图中重复使用这些数据,让我们以一个树枝为例 - 我必须创建一个Twig Extension才能将数字转换为实际名称:

    Status type: {{ booking.status }}
    Status name: {{ booking.status|statusName }}{# I don't like this approach …
    Run Code Online (Sandbox Code Playgroud)

php symfony doctrine-orm

7
推荐指数
2
解决办法
872
查看次数

如何在没有webpack dev服务器的情况下使用webpack进行开发?

我目前正在使用require.js开发,所以我可以快速迭代(更改文件,刷新页面,之间没有构建步骤),但我使用它webpack作为构建工具,因为它优于r.js.我想完全摆脱require.js并在开发中使用webpack作为脚本加载器.我知道这正是webpack dev server为了什么,但我特别不想使用它.

理想情况下,我只需要包含某种webpack加载器<script>,将其指向我的webpack.js构建配置,然后让它完成工作.

javascript build node.js webpack

7
推荐指数
1
解决办法
8860
查看次数

WebRTC - 如何区分通过同一连接发送的两个 MediaStreamTracks?

我想使用 WebRTC 将两个视频流从 Peer1 发送到 Peer2:让我们以前置和后置摄像头为例。

从概念上讲,Peer2 如何知道哪个流来自哪个相机?

MediaStream 文档提到 allMediaStreamMediaStreamTrack字段都是只读的,因此我无法直接向它们附加任何信息。我不能像{"stream1 id": "camera", "stream2 id": "screenshare"}通过信令通道那样发送字典,因为 Peer2 将为每个流和轨道生成自己的 id。

javascript mediastreamsource webrtc

7
推荐指数
1
解决办法
780
查看次数

Chrome 插件 - 权限 chrome-devtools://*/* 未知或 URL 模式格式错误

我正在维护 google chrome 的一个扩展程序,我收到随机用户的投诉,说它刚刚停止工作。

“扩展”部分中的错误消息是这样的:

Chrome plugin - Permission chrome-devtools://*/* is unknown or URL pattern is malformed
Run Code Online (Sandbox Code Playgroud)

似乎这不是一个非常受欢迎的问题 - 我找不到任何痕迹。我的清单文件的权限部分如下所示:

    "permissions": [
       "tabs", "http://*/*", "https://*/*", "chrome-devtools://*/*"
    ]
Run Code Online (Sandbox Code Playgroud)

它对大多数人都很好

google-chrome google-chrome-extension google-chrome-devtools

6
推荐指数
1
解决办法
4929
查看次数

如何为现有的 Symfony+Doctrine 应用程序生成初始/基础迁移?

如果我已经使用的迁移,我可以使用易于产生递增的: app/console doctrine:migrations:diff

但假设我有一个尚未使用迁移的现有应用程序。doctrine:migrations:diff只会在当前数据库模式和学说实体之间生成差异。问题是我需要对到目前为止CREATE TABLE创建的每个实体进行初始/第一次迁移。我当前的解决方法是创建一个空数据库,在 中切换凭据parameters.yml,然后运行doctrine:migrations:diff

我不喜欢这个解决方案 - 有更好的解决方案吗?

doctrine symfony doctrine-orm

6
推荐指数
1
解决办法
5953
查看次数

MySQL - ON 更新级联 +foreign_key_checks = 0

我正在开发一个工具来合并两个具有相同架构但不同数据的数据库。

其中一部分是将所有外键更改为ON UPDATE CASCADE,然后递增所有主键以避免冲突并保持外键指针正常工作。

我的问题是,有时会有一些 FK 损坏的孤立行,因此以下查询:

UPDATE table set pk = pk + 1000000
Run Code Online (Sandbox Code Playgroud)

像这样失败: ERROR 1452 (23000): Cannot add or update a child row: a foreign key constraint fails...(尽管我什至没有考虑触摸外键列!)

我想通过以下方式关闭它:

Set foreign_key_checks=0
Run Code Online (Sandbox Code Playgroud)

但随后相关的外键不会更新。我做了一个快速测试,设置foreign_key_checks = 0后级联不起作用。

有没有办法触发级联,或者在不设置的情况下执行 FK 损坏的行的更新foreign_key_checks=0UPDATE IGNORE没有解决这个问题:(

mysql database foreign-keys foreign-key-relationship sql-update

5
推荐指数
1
解决办法
1217
查看次数

AngularJS - 如何处理圆形手表?

假设我正在使用一个指令,该指令通过双向绑定以 unix 时间戳的形式给出日期,但还提供了一个日历小部件来更改选择。

日历小部件使用日期对象,我无法更改输入数据格式,并且我不想重新设计日历以支持 unix 时间戳。另外,这只是一个例子,问题是关于循环观察者的一般工作方式。

范围如下所示:

scope.selectedUnixTimestamp; // this comes from the outside
scope.selectedDate;

scope.$watch('selectedUnixTimestamp', function(newV, oldV) {
    $scope.selectedDate = new Date(newV*1000);
});
scope.$watch('selectedDate', function(newV, oldV) {
    $scope.selectedUnixTimestamp = Math.floor(newV.getTime()/1000 + 0.000001);
});
Run Code Online (Sandbox Code Playgroud)

我的问题是:我该怎么做才能避免额外调用 $watch 回调?显然,如果我选择新日期,流程将如下:

  1. 观察者 #2 被调用 - 它修改 selectedUnixTimestamp
  2. 观察者 #1 被调用 - 它修改 selectedDate
  3. 再次调用 Watcher #2(新对象引用) - 它修改 selectedUnixTimestamp

但除了第一个电话之外,我不想再打任何电话。我怎样才能实现它?


显然,一种方法是执行以下操作:

scope.selectedUnixTimestamp; 
scope.selectedDate;

var surpressWatch1 = false;
var surpressWatch2 = false;

scope.$watch('selectedUnixTimestamp', function(newV, oldV) {
    if(surpressWatch1) { surpressWatch1 = false; return; } …
Run Code Online (Sandbox Code Playgroud)

javascript angularjs

5
推荐指数
1
解决办法
1673
查看次数

如何有效地调试webpack应用程序?

我正在尝试在我的项目中采用webpack dev服务器.我知道它被广泛采用,所以我很惊讶调试应用程序似乎很难.由于webpack默认生成一个巨型包,因此源映射是必须的.我有一个很大的问题:

根据devtool模式,源映射要么很难解析(eval),要么不用于映射某些堆栈跟踪(eval-source-map),例如,整个堆栈跟踪有时会如下所示:
at eval (eval at <anonymous> http://localhost:8082/js/app.js:2004:2), <anonymous>:43:67).
此外,当您手动调用console.trace或console.error时,不会映射输出.所以你必须使用像sourcemapped-stacktrace这样的工具- 这既缓慢又容易出错.

目前我使用require.js进行开发,因为它允许我非常容易地调试应用程序 - 每个堆栈跟踪指向正确的文件和行.

如何使用webpack实现相同的结果?

编辑:
谷歌浏览器中的相关问题:https://code.google.com/p/chromium/issues/detail? id = 376409

firefox中的相关问题:https://bugzilla.mozilla.org/show_bug.cgi? id = 583083

javascript requirejs webpack

5
推荐指数
1
解决办法
2958
查看次数

如何在Django中使用唯一检查来避免竞争条件

我有一个简单的模型:

class InvitationRequest(models.Model):
    email = models.EmailField(max_length=255, unique=True)
Run Code Online (Sandbox Code Playgroud)

一个简单的模型形式:

class InvitationRequestForm(forms.ModelForm):
    class Meta:
        model = InvitationRequest
Run Code Online (Sandbox Code Playgroud)

现在,假设我尝试以标准方式处理它:

form = InvitationRequestForm(request.POST)
if form.is_valid():
    form.save()
Run Code Online (Sandbox Code Playgroud)

存在竞争条件,因为验证执行简单SELECT查询以确定是否已经存储了这样的电子邮件,并且如果一切正常,则它继续进行form.save().如果有一个并发进程在同一时刻执行相同操作,则两个表单都将验证,并且两个进程都将调用,form.save()因此一个将成功,另一个将失败导致IntegrityError.

处理这个问题的标准方法是什么?

我希望在表单对象中有一个标准错误,因此我可以将其传递给模板并通知用户该问题.

我知道:

  • 我可以使用try/except包装所有内容并手动将新错误添加到我的表单中
  • 我可以用SERIALIZABLE事务包装所有东西(在MySQL中,因为它执行下一个键锁定每次选择)
  • 我可以使用覆盖Model._perform_unique_checks并使其使用select_for_update(由于下一个键锁定,与MySQL一起使用)
  • 我可以获得表级独占锁

这些解决方案都没有吸引力,我也使用PostgreSQL,它与MySQL在这个领域不同.

python mysql django postgresql validation

4
推荐指数
2
解决办法
1617
查看次数

有没有办法获取Trello板的所有附件列表?(通过 API)

我正在寻找一种方法来列出与 Trello 板相关的所有附件,但我发现的只是获取与卡片相关的附件列表。有没有办法在不枚举每张卡片的情况下获取所有电路板附件的列表?

trello

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