[翻译]Phalcon 3.1.1更新了!

Phalcon   2017-03-26 22:41:35   550


原文地址:https://blog.phalconphp.com/post/phalcon-3-1-1-released

发布时间:2017-03-25

大家好.

我们今天发布了一个修复程序3.1.1, 以便于解决框架中的一些紧急问题. 我们强烈建议您将Phalcon版本升级到最新版本3.1.1.

和任何软件一样, 我们这儿会有 you broke it 的场景. 非常感谢社区的快速报告, 我们速度解决了这些出现的问题, 然后今天发布了修复程序.

下载版本可以从这里找到: 3.1.1

模型中未定义索引

升级到3.1.0之后, 所有的模型均会发出以下警告:

Undefined index: keepSnapshots in Users.php on line 61
Undefined index: keepSnapshots in Groups.php on line 57

清除查询缓存之后, 这个问题将会得到修复, 但是这并不是一种完美的解决方案. 我们修复了 PR-12737.

doLowUpdate() - 首个参数不是数组

升级以后,我们遇到了以下问题:

$robot = Robots::findFirst();

$robot2 = new Robot($robot->toArray(), $di, $modelsManager);
$robot2->setNewValueForField(100);

try {
    $robot2->setDirtyState($robot2::DIRTY_STATE_PERSISTENT); 
    $robot2->save();
} catch (\Exception $exception) {
   echo "ERROR: " . $exception->getMessage();
}
Results in:
ERROR: First argument is not an array

它报告于 #12742 修复于 PR-12739.

3.1.0 版本亮点

新增 Phalcon\Validation\Validator\Callback, Phalcon\Validation::getData [NEW]

我们增加了新的验证器 Phalcon\Validation\Validator\Callback 你可以在其中执行任何所需的逻辑. 它应该返回true, false 或者应该用于验证你的字段的新验证器.

<?php

use Phalcon\Validation;
use Phalcon\Validation\Validator\Callback;
use Phalcon\Validation\Validator\PresenceOf;

$validation = new Validation();
$validation->add(
  "amount",
  new Callback(
      [
          'callback' => function($data) {
              return $data['amount'] % 2 == 0;
          },
          'message'  => 'Only even number of products are accepted',
      ]
  )
);

$messages = $validation->validate(['amount' => 1]); // 将会从首个验证器中返回一个消息

请参阅我们的文档获取更多信息.

  • 新增 Phalcon\Mvc\Model\Binder, 在dispatcher, micro中类用于绑定模型参数
  • 新增 Phalcon\Dispatcher::getBoundModelsPhalcon\Mvc\Micro::getBoundModels来获取绑定模型
  • 新增 Phalcon\Mvc\Micro\Collection\LazyLoader::callMethod

在Phalcon3中, 我们在控制器方法中引入了绑定模型实例. 在Phalcon 3.1中, 我们决定将代码移动到一个单独的类, 优化它并提供了一种在 Phalcon\Mvc\Micro中使用相同功能的方法. 由于它使用了Reflection(反射) API, 我们还添加缓存它的方法. 除了这个 Phalcon\Dispatcher::setModelBinding()将会被弃用, 并且将会在Phalcon4中删除. 从Phalcon 3.2起这个方法的使用将会触发E_DEPRECATED.

<?php

use Phalcon\Di\FactoryDefault;
use Phalcon\Mvc\Dispatcher;
use Phalcon\Mvc\Model\Binder;

$di = new FactoryDefault();
$di->set(
    'dispatcher', 
    function() {
        $dispatcher = new Dispatcher();
        $dispatcher->setModelBinder(new Binder(), 'cache');

        return $dispatcher;
    }
);

你可以使用类名提示你的操作参数. 请阅读文档在micro中使用, 在调度器中使用获取更多信息.

  • Phalcon\DispatcherPhalcon\Mvc\Micro中新增afterBinding事件, 新增Phalcon\Mvc\Micro::afterBinding [NEW]

我们在调度器和微应用中新增新的事件. afterBinding事件(或micro中间件)将会通过Phalcon\Mvc\Model\Binder组件在绑定模型实例之后执行操作之前触发.

  • 新增通过find()返回设置的自定义Resultset类的功能 #12166 [NEW]

使用这个功能你可以拥有你自己逻辑的自定义Resultset类.

<?php

use Phalcon\Mvc\Model;
use Phalcon\Mvc\Model\Resultset\Simple;

class AgeStats extends Model
{
  public function getSource()
  {
      return 'stats';
  }

  public function getResultsetClass()
  {
      return 'MyResultset';
  }
}

class MyResultset extends Simple 
{
 // 在这里实现您的自定义逻辑
}

$stats = AgeStats::find(); // 它将返回MyResultset实例
  • 清除追加和前置的标题元素(Phalcon\Tag::appendTitle, Phalcon\Tag::prependTitle) [NEW]

你可以在 Phalcon\Tag 中使用appendTitleprependTitle清除和添加多个元素.

<?php

\Phalcon\Tag::setTitleSeparator(' - ');
\Phalcon\Tag::setTitle('Title');

// Somewhere in controller
\Phalcon\Tag::prependTitle('Category');
\Phalcon\Tag::prependTitle('Article');

// 相同的情况 - 清除并放置一个前置元素
// (将比清除所有值更快)
\Phalcon\Tag::prependTitle(['Just article']);

// Or other - 清除并放置几个元素
\Phalcon\Tag::prependTitle(['Other category', 'Other article']);
  • 新增指定验证器的'allowEmpty'选项指定为空的功能. 它现在也接受一个指定为的数组, 例如 ['', false] [NEW]

以前的验证器中的allowEmpty选项仅允许接受真实的值, 意味着它允许空值. 现在你可以为你的验证器提供一个被视为 empty的值的数组.

<?php

use Phalcon\Validation;
use Phalcon\Validation\Validator\PresenceOf;

$validation = new Validation();
$validation->add(
    'description', 
    new PresenceOf(
        [
            'message'    => 'Description is required',
            'allowEmpty' => [null],
        ]
    )
);

$messages = $validation->validate(['description' => null]); // empty messages
$messages = $validation->validate(['description' => '']);   // will return message from validator
  • 新增 Phalcon\ValidationPhalcon\Mvc\Collection 一起使用的功能, 已弃用 Phalcon\Mvc\Model\Validator 类 [NEW]

在Phalcon3中我们改变了模型验证器以便于和表单验证器使用相同的类. 从 Phalcon\Mvc\Collection 中缺少相同的功能. 我们已经解决了这个问题, 您现在可以对Mongo集合使用 Phalcon\Validation 组件. The required changes were also made in phlacon/incubator and PHP7 related classes. 我们鼓励您尽快切换到新的验证, 从Phalcon4中我们将会移除老的 Phalcon\Mvc\Model\Validator命名空间. 从Phalcon 3.2开始, 使用老的类将会触发 E_DEPRECATED

<?php

use Phalcon\Mvc\Collection;
use Phalcon\Validation;
use Phalcon\Validation\Validator\PresenceOf;

class Robots extends Collection
{
  public function validation()
  {
      $validation = new Validation();
      $validation->add('name', new PresenceOf());

      return $this->validate($validation);
  }
}

$robots = new Robots();
$robots->create(); // 返回 false
$robots->name = 'Some Robot';
$robots->create(); // 返回 true

可以在我们的文档找到更多信息: validating collections, validation

请注意, Phalcon3.1与PHP7.1并不兼容. 如果你项使用PHP 7, 你需要使用PHP 7.0进行编译. 我们将会在下一个版本对PHP7.1进行全面支持.

社区

再一次大大的感谢在社区中中找出修复程序的bug进行解决并且 @jurigag 来帮助这篇博客.

更新/升级

Phalcon 3.1.1可以从 master 分支中安装, 如果你没有安装Zephir, 请按照以下说明进行操作:

git clone http://github.com/phalcon/cphalcon
cd cphalcon/build
sudo ./install

请注意运行安装脚本将会替换之前安装的任何版本的Phalcon.

PackageCloud.io已经更新以便允许您的包管理器(对于Linux机器)无缝升级到新版本.

Windows版DLL文件在此处下载.

我们鼓励现在使用Phalcon3的用户更新到此版本.

<3 Phalcon团队


本文链接: [翻译]Phalcon 3.1.1更新了!, 转载请注明来源!