mirror of
https://github.com/yiisoft/yii2.git
synced 2025-11-03 22:32:40 +08:00
Merge branch 'master' into inflextor_fixes
This commit is contained in:
@ -30,12 +30,10 @@ Yii – це універсальний фреймворк і може бути
|
||||
Завдяки надійній архітектурі розширень Yii, досить легко використовувати або розробляти поширюванні розширення.
|
||||
- Висока швидкодія завжди є головною ціллю Yii.
|
||||
|
||||
Yii — не проект однієї людини. Він підтримується і розвивається [сильною командою][about_yii] і великою спільнотою розробників,
|
||||
Yii — не проект однієї людини. Він підтримується і розвивається [сильною командою](https://www.yiiframework.com/team/) і великою спільнотою розробників,
|
||||
які їй допомагають. Команда розробників фреймворку Yii стежать за тенденціями веб-розробки і розвитком інших проектів.
|
||||
Найбільш значимі можливості та кращі практики регулярно впроваджуються у фреймворк у вигляді простих й елегантних інтерфейсів.
|
||||
|
||||
[about_yii]: http://www.yiiframework.com/about/
|
||||
|
||||
Версії Yii
|
||||
----------
|
||||
|
||||
|
||||
@ -49,7 +49,9 @@ the following methods:
|
||||
|
||||
If a particular method is not needed, you may implement it with an empty body. For example, if your application
|
||||
is a pure stateless RESTful application, you would only need to implement [[yii\web\IdentityInterface::findIdentityByAccessToken()|findIdentityByAccessToken()]]
|
||||
and [[yii\web\IdentityInterface::getId()|getId()]] while leaving all other methods with an empty body.
|
||||
and [[yii\web\IdentityInterface::getId()|getId()]] while leaving all other methods with an empty body. Or if your
|
||||
application uses session only authentication, you would need to implement all the methods except
|
||||
[[yii\web\IdentityInterface::findIdentityByAccessToken()|findIdentityByAccessToken()]].
|
||||
|
||||
In the following example, an [[yii\web\User::identityClass|identity class]] is implemented as
|
||||
an [Active Record](db-active-record.md) class associated with the `user` database table.
|
||||
@ -98,7 +100,7 @@ class User extends ActiveRecord implements IdentityInterface
|
||||
}
|
||||
|
||||
/**
|
||||
* @return string current user auth key
|
||||
* @return string|null current user auth key
|
||||
*/
|
||||
public function getAuthKey()
|
||||
{
|
||||
@ -107,7 +109,7 @@ class User extends ActiveRecord implements IdentityInterface
|
||||
|
||||
/**
|
||||
* @param string $authKey
|
||||
* @return bool if auth key is valid for current user
|
||||
* @return bool|null if auth key is valid for current user
|
||||
*/
|
||||
public function validateAuthKey($authKey)
|
||||
{
|
||||
@ -117,7 +119,7 @@ class User extends ActiveRecord implements IdentityInterface
|
||||
```
|
||||
|
||||
You may use the following code to generate an auth key for each
|
||||
user and store it in the `user` table:
|
||||
user and then store it in the `user` table:
|
||||
|
||||
```php
|
||||
class User extends ActiveRecord implements IdentityInterface
|
||||
|
||||
@ -93,7 +93,7 @@ class BaseYii
|
||||
*/
|
||||
public static function getVersion()
|
||||
{
|
||||
return '2.0.42-dev';
|
||||
return '2.0.43-dev';
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@ -1,31 +1,38 @@
|
||||
Yii Framework 2 Change Log
|
||||
==========================
|
||||
|
||||
2.0.42 under development
|
||||
2.0.43 under development
|
||||
------------------------
|
||||
|
||||
- Bug #18323: Fix client validation of RadioList when there are disabled items (toir427)
|
||||
- Enh #18534: Added `prepareSearchQuery` property in `yii\rest\IndexAction` (programmis)
|
||||
- Enh #18566: Throw the original exception when `yii\web\Controller::bindInjectedParams()` catches HttpException (pigochu)
|
||||
- Bug #18585: Fix `yii\validators\EmailValidator` to handle an edge case where `IDN` is enabled, but fails ascii conversion for valid email addresses (ihitbuttons)
|
||||
- Bug #18574: Fix `yii\web\DbSession` to use the correct db if strict mode is used (Mignar)
|
||||
- no changes in this release.
|
||||
|
||||
|
||||
2.0.42 May 05, 2021
|
||||
-------------------
|
||||
|
||||
- Bug #14343: Fix `yii\test\ActiveFixture` to use model's DB connection instead of the default one (margori, bizley)
|
||||
- Bug #17174: Fix `yii\db\BaseActiveRecord::unlink()` to not ignore `on` conditions in `via` relations (bizley)
|
||||
- Bug #17203: Fix `yii\db\Connection` to persist customized `queryBuilder` configuration after the `close()` → `open()` cycle (silverfire)
|
||||
- Bug #17479: Fix `yii\grid\ActionColumn` to render icons when no glyphicons are available (simialbi)
|
||||
- Bug #17631: Fix `yii\widgets\BaseListView` to properly render custom summary (sjaakp, bizley)
|
||||
- Bug #18323: Fix client validation of RadioList when there are disabled items (toir427)
|
||||
- Bug #18325: Fix `yii\db\pgsql\Schema` to respect non-default PgSQL schema name for data types (theonedemon, silverfire)
|
||||
- Bug #18526: Fix `yii\caching\DbCache` to work with MSSQL, add `normalizeTableRowData()` to `yii\db\mssql\QueryBuilder::upsert()` (darkdef)
|
||||
- Bug #18544: Fix `yii\validators\NumberValidator` to disallow values with whitespaces (bizley)
|
||||
- Bug #18552: Fix `yii\data\SqlDataProvider` to properly handle SQL with `ORDER BY` clause (bizley)
|
||||
- Bug #17174: Fix `yii\db\BaseActiveRecord::unlink()` to not ignore `on` conditions in `via` relations (bizley)
|
||||
- Bug #18557: Fix `yii\data\ActiveDataProvider` to handle DB connection configuration of different type than just `yii\db\Connection` (bizley)
|
||||
- Bug #18526: Fix `yii\caching\DbCache` to work with MSSQL, add `normalizeTableRowData()` to `yii\db\mssql\QueryBuilder::upsert()` (darkdef)
|
||||
- Bug #14343: Fix `yii\test\ActiveFixture` to use model's DB connection instead of the default one (margori, bizley)
|
||||
- Bug #17631: Fix `yii\widgets\BaseListView` to properly render custom summary (sjaakp, bizley)
|
||||
- Bug #17203: Fix `yii\db\Connection` to persist customized `queryBuilder` configuration after the `close()` → `open()` cycle (silverfire)
|
||||
- Bug #18325: Fix `yii\db\pgsql\Schema` to respect non-default PgSQL schema name for data types (theonedemon, silverfire)
|
||||
- Bug #18593: Fix setting the `maxlength` attribute for `Html::activeInput()` and `Html::activeTextArea()` based on `length` parameter of validator (BSCheshir)
|
||||
- Bug #18592: Fix `yii\db\Command::getRawSql()` to not replace query params in invalid places (sartor)
|
||||
- Bug #18574: Fix `yii\web\DbSession` to use the correct db if strict mode is used (Mignar)
|
||||
- Bug #18585: Fix `yii\validators\EmailValidator` to handle an edge case where `IDN` is enabled, but fails ascii conversion for valid email addresses (ihitbuttons)
|
||||
- Bug #18590: Fix `yii\web\UrlManager` to instantiate cache only when it's actually needed (bizley)
|
||||
- Enh #18569: Add `NumberValidator::$allowArray` (raidkon)
|
||||
- Bug #18592: Fix `yii\db\Command::getRawSql()` to not replace query params in invalid places (sartor)
|
||||
- Bug #18593: Fix setting the `maxlength` attribute for `Html::activeInput()` and `Html::activeTextArea()` based on `length` parameter of validator (BSCheshir)
|
||||
- Bug #18604: Function alterColumn for MSSQL build incorrect query with default values `NULL` and other expressions (darkdef)
|
||||
- Bug #18613: Do not call static methods non-statically in `BaseActiveRecord` (samdark)
|
||||
- Bug #18619: Do not modify `yii\web\Cookie::$path` on `yii\web\Response::sendCookies()` (mikk150)
|
||||
- Bug #18604: Function alterColumn for MSSQL build incorrect query with default values `NULL` and other expressions (darkdef)
|
||||
- Bug #18624: Fix `yii\di\Container` to properly resolve dependencies in case of PHP 8 union types (bizley)
|
||||
- Enh #18534: Add `prepareSearchQuery` property in `yii\rest\IndexAction` (programmis)
|
||||
- Enh #18566: Throw the original exception when `yii\web\Controller::bindInjectedParams()` catches HttpException (pigochu)
|
||||
- Enh #18569: Add `NumberValidator::$allowArray` (raidkon)
|
||||
|
||||
|
||||
2.0.41.1 March 04, 2021
|
||||
|
||||
@ -86,6 +86,7 @@ class DbCache extends Cache
|
||||
|
||||
protected $isVarbinaryDataField;
|
||||
|
||||
|
||||
/**
|
||||
* Initializes the DbCache component.
|
||||
* This method will initialize the [[db]] property to make sure it refers to a valid DB connection.
|
||||
@ -297,9 +298,8 @@ class DbCache extends Cache
|
||||
}
|
||||
|
||||
/**
|
||||
* @return bool
|
||||
*
|
||||
* Checking Mssql: if field is varbinary - return true
|
||||
* @return bool whether field is MSSQL varbinary
|
||||
* @since 2.0.42
|
||||
*/
|
||||
protected function isVarbinaryDataField()
|
||||
{
|
||||
@ -311,8 +311,8 @@ class DbCache extends Cache
|
||||
}
|
||||
|
||||
/**
|
||||
* @return string
|
||||
* Returning `data` field name with converting for usage in MSSQL (if needs)
|
||||
* @return string `data` field name converted for usage in MSSQL (if needed)
|
||||
* @since 2.0.42
|
||||
*/
|
||||
protected function getDataFieldName()
|
||||
{
|
||||
@ -320,10 +320,8 @@ class DbCache extends Cache
|
||||
}
|
||||
|
||||
/**
|
||||
* @param $value
|
||||
* @return PdoValue
|
||||
*
|
||||
* Return PdoValue or direct $value for usage in MSSQL
|
||||
* @return PdoValue PdoValue or direct $value for usage in MSSQL
|
||||
* @since 2.0.42
|
||||
*/
|
||||
protected function getDataFieldValue($value)
|
||||
{
|
||||
|
||||
@ -174,6 +174,7 @@ return [
|
||||
'yii\db\cubrid\Schema' => YII2_PATH . '/db/cubrid/Schema.php',
|
||||
'yii\db\cubrid\conditions\LikeConditionBuilder' => YII2_PATH . '/db/cubrid/conditions/LikeConditionBuilder.php',
|
||||
'yii\db\mssql\ColumnSchema' => YII2_PATH . '/db/mssql/ColumnSchema.php',
|
||||
'yii\db\mssql\ColumnSchemaBuilder' => YII2_PATH . '/db/mssql/ColumnSchemaBuilder.php',
|
||||
'yii\db\mssql\DBLibPDO' => YII2_PATH . '/db/mssql/DBLibPDO.php',
|
||||
'yii\db\mssql\PDO' => YII2_PATH . '/db/mssql/PDO.php',
|
||||
'yii\db\mssql\QueryBuilder' => YII2_PATH . '/db/mssql/QueryBuilder.php',
|
||||
|
||||
@ -429,10 +429,8 @@ class Connection extends Component
|
||||
* Is used to restore a QueryBuilder configuration after the connection close/open cycle.
|
||||
*
|
||||
* @see restoreQueryBuilderConfiguration()
|
||||
* @since 2.0.42
|
||||
*/
|
||||
private $_queryBuilderConfigurations = [];
|
||||
|
||||
/**
|
||||
* @var Transaction the currently active transaction
|
||||
*/
|
||||
@ -892,8 +890,6 @@ class Connection extends Component
|
||||
|
||||
/**
|
||||
* Restores custom QueryBuilder configuration after the connection close/open cycle
|
||||
*
|
||||
* @since 2.0.42
|
||||
*/
|
||||
private function restoreQueryBuilderConfiguration()
|
||||
{
|
||||
|
||||
@ -13,6 +13,10 @@ use yii\db\Expression;
|
||||
/**
|
||||
* ColumnSchemaBuilder is the schema builder for MSSQL databases.
|
||||
*
|
||||
* @property-read string|null $checkValue The `CHECK` constraint for the column. This property is read-only.
|
||||
* @property-read string|Expression|null $defaultValue Default value of the column. This property is
|
||||
* read-only.
|
||||
*
|
||||
* @author Valerii Gorbachev <darkdef@gmail.com>
|
||||
* @since 2.0.42
|
||||
*/
|
||||
@ -20,6 +24,7 @@ class ColumnSchemaBuilder extends AbstractColumnSchemaBuilder
|
||||
{
|
||||
protected $format = '{type}{length}{notnull}{unique}{default}{check}{append}';
|
||||
|
||||
|
||||
/**
|
||||
* Builds the full string for the column's schema.
|
||||
* @return string
|
||||
@ -36,7 +41,7 @@ class ColumnSchemaBuilder extends AbstractColumnSchemaBuilder
|
||||
}
|
||||
|
||||
/**
|
||||
* Changes default format string to MSSQL ALTER COMMAND
|
||||
* Changes default format string to MSSQL ALTER COMMAND.
|
||||
*/
|
||||
public function setAlterColumnFormat()
|
||||
{
|
||||
@ -45,7 +50,7 @@ class ColumnSchemaBuilder extends AbstractColumnSchemaBuilder
|
||||
|
||||
/**
|
||||
* Getting the `Default` value for constraint
|
||||
* @return string|Expression|null
|
||||
* @return string|Expression|null default value of the column.
|
||||
*/
|
||||
public function getDefaultValue()
|
||||
{
|
||||
@ -58,7 +63,7 @@ class ColumnSchemaBuilder extends AbstractColumnSchemaBuilder
|
||||
|
||||
/**
|
||||
* Get the `Check` value for constraint
|
||||
* @return string|null
|
||||
* @return string|null the `CHECK` constraint for the column.
|
||||
*/
|
||||
public function getCheckValue()
|
||||
{
|
||||
@ -66,7 +71,7 @@ class ColumnSchemaBuilder extends AbstractColumnSchemaBuilder
|
||||
}
|
||||
|
||||
/**
|
||||
* @return bool
|
||||
* @return bool whether the column values should be unique. If this is `true`, a `UNIQUE` constraint will be added.
|
||||
*/
|
||||
public function isUnique()
|
||||
{
|
||||
|
||||
@ -524,7 +524,10 @@ class Container extends Component
|
||||
|
||||
if (PHP_VERSION_ID >= 80000) {
|
||||
$c = $param->getType();
|
||||
$isClass = $c !== null && !$param->getType()->isBuiltin();
|
||||
$isClass = false;
|
||||
if ($c instanceof ReflectionNamedType) {
|
||||
$isClass = !$c->isBuiltin();
|
||||
}
|
||||
} else {
|
||||
try {
|
||||
$c = $param->getClass();
|
||||
|
||||
@ -29,7 +29,6 @@ class NumberValidator extends Validator
|
||||
* @since 2.0.42
|
||||
*/
|
||||
public $allowArray = false;
|
||||
|
||||
/**
|
||||
* @var bool whether the attribute value can only be an integer. Defaults to false.
|
||||
*/
|
||||
|
||||
@ -43,6 +43,13 @@ namespace yii\web;
|
||||
* }
|
||||
* ```
|
||||
*
|
||||
* In some situations not all of these methods are required to be implemented.
|
||||
* For example, if your application is a pure stateless RESTful application,
|
||||
* you would only need to implement [[yii\web\IdentityInterface::findIdentityByAccessToken()|findIdentityByAccessToken()]]
|
||||
* and [[yii\web\IdentityInterface::getId()|getId()]] while leaving all other methods with an empty body.
|
||||
* Or if your application uses session only authentication, you would need to implement all the methods
|
||||
* except [[yii\web\IdentityInterface::findIdentityByAccessToken()|findIdentityByAccessToken()]].
|
||||
*
|
||||
* @author Qiang Xue <qiang.xue@gmail.com>
|
||||
* @since 2.0
|
||||
*/
|
||||
@ -87,7 +94,7 @@ interface IdentityInterface
|
||||
* Make sure to invalidate earlier issued authKeys when you implement force user logout, password change and
|
||||
* other scenarios, that require forceful access revocation for old sessions.
|
||||
*
|
||||
* @return string a key that is used to check the validity of a given identity ID.
|
||||
* @return string|null a key that is used to check the validity of a given identity ID.
|
||||
* @see validateAuthKey()
|
||||
*/
|
||||
public function getAuthKey();
|
||||
@ -96,7 +103,7 @@ interface IdentityInterface
|
||||
* Validates the given auth key.
|
||||
*
|
||||
* @param string $authKey the given auth key
|
||||
* @return bool whether the given auth key is valid.
|
||||
* @return bool|null whether the given auth key is valid.
|
||||
* @see getAuthKey()
|
||||
*/
|
||||
public function validateAuthKey($authKey);
|
||||
|
||||
@ -36,7 +36,7 @@ use yii\validators\IpValidator;
|
||||
* is not given. This property is read-only.
|
||||
* @property-read string|null $authUser The username sent via HTTP authentication, `null` if the username is
|
||||
* not given. This property is read-only.
|
||||
* @property string $baseUrl The relative URL for the application (usually with a leading slash).
|
||||
* @property string $baseUrl The relative URL for the application.
|
||||
* @property array $bodyParams The request parameters given in the request body.
|
||||
* @property-read string $contentType Request content-type. Null is returned if this information is not
|
||||
* available. This property is read-only.
|
||||
|
||||
@ -26,6 +26,9 @@ use yiiunit\framework\di\stubs\Kappa;
|
||||
use yiiunit\framework\di\stubs\Qux;
|
||||
use yiiunit\framework\di\stubs\QuxInterface;
|
||||
use yiiunit\framework\di\stubs\QuxFactory;
|
||||
use yiiunit\framework\di\stubs\UnionTypeNotNull;
|
||||
use yiiunit\framework\di\stubs\UnionTypeNull;
|
||||
use yiiunit\framework\di\stubs\UnionTypeWithClass;
|
||||
use yiiunit\framework\di\stubs\Zeta;
|
||||
use yiiunit\TestCase;
|
||||
|
||||
@ -621,4 +624,53 @@ class ContainerTest extends TestCase
|
||||
$this->assertNull($zeta->unknown);
|
||||
$this->assertNull($zeta->unknownNull);
|
||||
}
|
||||
|
||||
public function testUnionTypeWithNullConstructorParameters()
|
||||
{
|
||||
if (PHP_VERSION_ID < 80000) {
|
||||
$this->markTestSkipped('Can not be tested on PHP < 8.0');
|
||||
return;
|
||||
}
|
||||
|
||||
$unionType = (new Container())->get(UnionTypeNull::className());
|
||||
$this->assertInstanceOf(UnionTypeNull::className(), $unionType);
|
||||
}
|
||||
|
||||
public function testUnionTypeWithoutNullConstructorParameters()
|
||||
{
|
||||
if (PHP_VERSION_ID < 80000) {
|
||||
$this->markTestSkipped('Can not be tested on PHP < 8.0');
|
||||
return;
|
||||
}
|
||||
|
||||
$unionType = (new Container())->get(UnionTypeNotNull::className(), ['value' => 'a']);
|
||||
$this->assertInstanceOf(UnionTypeNotNull::className(), $unionType);
|
||||
|
||||
$unionType = (new Container())->get(UnionTypeNotNull::className(), ['value' => 1]);
|
||||
$this->assertInstanceOf(UnionTypeNotNull::className(), $unionType);
|
||||
|
||||
$unionType = (new Container())->get(UnionTypeNotNull::className(), ['value' => 2.3]);
|
||||
$this->assertInstanceOf(UnionTypeNotNull::className(), $unionType);
|
||||
|
||||
$unionType = (new Container())->get(UnionTypeNotNull::className(), ['value' => true]);
|
||||
$this->assertInstanceOf(UnionTypeNotNull::className(), $unionType);
|
||||
|
||||
$this->expectException('TypeError');
|
||||
(new Container())->get(UnionTypeNotNull::className());
|
||||
}
|
||||
|
||||
public function testUnionTypeWithClassConstructorParameters()
|
||||
{
|
||||
if (PHP_VERSION_ID < 80000) {
|
||||
$this->markTestSkipped('Can not be tested on PHP < 8.0');
|
||||
return;
|
||||
}
|
||||
|
||||
$unionType = (new Container())->get(UnionTypeWithClass::className(), ['value' => new Beta()]);
|
||||
$this->assertInstanceOf(UnionTypeWithClass::className(), $unionType);
|
||||
$this->assertInstanceOf(Beta::className(), $unionType->value);
|
||||
|
||||
$this->expectException('TypeError');
|
||||
(new Container())->get(UnionTypeNotNull::className());
|
||||
}
|
||||
}
|
||||
|
||||
12
tests/framework/di/stubs/UnionTypeNotNull.php
Normal file
12
tests/framework/di/stubs/UnionTypeNotNull.php
Normal file
@ -0,0 +1,12 @@
|
||||
<?php
|
||||
|
||||
namespace yiiunit\framework\di\stubs;
|
||||
|
||||
use yii\base\BaseObject;
|
||||
|
||||
class UnionTypeNotNull extends BaseObject
|
||||
{
|
||||
public function __construct(protected string|int|float|bool $value)
|
||||
{
|
||||
}
|
||||
}
|
||||
12
tests/framework/di/stubs/UnionTypeNull.php
Normal file
12
tests/framework/di/stubs/UnionTypeNull.php
Normal file
@ -0,0 +1,12 @@
|
||||
<?php
|
||||
|
||||
namespace yiiunit\framework\di\stubs;
|
||||
|
||||
use yii\base\BaseObject;
|
||||
|
||||
class UnionTypeNull extends BaseObject
|
||||
{
|
||||
public function __construct(protected string|int|float|bool|null $value)
|
||||
{
|
||||
}
|
||||
}
|
||||
12
tests/framework/di/stubs/UnionTypeWithClass.php
Normal file
12
tests/framework/di/stubs/UnionTypeWithClass.php
Normal file
@ -0,0 +1,12 @@
|
||||
<?php
|
||||
|
||||
namespace yiiunit\framework\di\stubs;
|
||||
|
||||
use yii\base\BaseObject;
|
||||
|
||||
class UnionTypeWithClass extends BaseObject
|
||||
{
|
||||
public function __construct(public string|Beta $value)
|
||||
{
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user