Instructions de mise à niveau


Aiders réplamés avec des classes sur les chaînes et les tableaux

Représentant le fournisseur de services différés
  • Composant avec une spécification PSR-16 les modèles ajoutent des attributs d'identification à incrémentation automatique
Supporte la bibliothèque Pheanstalk 4.0

Mise à jour de Laravel 5.7 vers 5.8

Durée de mise à niveau estimée : 1 heure

Remarque : Nous essayons de documenter chaque changement possible. Étant donné que la plupart des modifications majeures sont internes au framework, seul un sous-ensemble de ces modifications peut affecter votre application.

Mettre à jour les dépendances

Dans composer.json, mettez à jour la dépendance laravel/framework vers 5.8.*. composer.json 中,将 laravel/framework 依赖项更新为 5.8.*

接下来,检查应用程序中已安装的第三方包是否支持 Laravel 5.8,并检查已安装的版本是否正确。

应用契约

environment 方法

影响可能性:非常低

Illuminate/Contracts/Foundation/Application  类 environment 方法的签名已修改。如果在您的应用程序中重写了这个方法,您应该更新此方法的签名:

/**
 * 获取或检查当前应用程序的环境
 *
 * @param  string|array  $environments
 * @return string|bool
 */public function environment(...$environments);

新添加的方法

影响可能性:非常低

以下新添加方法 bootstrapPath, configPath, databasePath, environmentPath, resourcePath, storagePath, resolveProvider, bootstrapWith, configurationIsCached, detectEnvironment, environmentFile, environmentFilePath, getCachedConfigPath, getCachedRoutesPath, getLocale, getNamespace, getProviders, hasBeenBootstrapped, loadDeferredProviders, loadEnvironmentFrom, routesAreCached, setLocale, shouldSkipMiddleware, terminate 将会被添加到 Illuminate/Contracts/Foundation/Application 中.

如果你实现了这个接口,你应该将这些方法添加到实现类中。

认证

重置密码通知路由参数

影响可能性:低

当用户点击重置密码链接时,Laravel 使用 route 助手生成 URL ,以创建指向以 password.reset 命名的路由,当使用 Laravel 5.7 的时候,token 将会被传递到不带显式名称的 route 助手,比如:

route('password.reset', $token);

当你使用 Laravel 5.8 时,token 作为显式参数传递给 route 助手:

route('password.reset', ['token' => $token]);

因此,如果你要定义自己的 password.reset

Ensuite, vérifiez si les packages tiers installés dans l'application prennent en charge Laravel 5.8 et vérifiez si la version installée est correcte.

Application Contract

Méthode environnement

Possibilité d'impact : très faible

Illuminate/Contrats/Fondation/Application Classe environnement La signature de la méthode a été modifiée. Si cette méthode est remplacée dans votre application, vous devez mettre à jour la signature de cette méthode :

// Laravel 5.7 - 存储数据30分钟
Cache::put('foo', 'bar', 30);// Laravel 5.8 - 存储数据30秒
Cache::put('foo', 'bar', 30);// Laravel 5.7 / 5.8 - 存储数据30秒
Cache::put('foo', 'bar', now()->addSeconds(30));

Méthode nouvellement ajoutée

Probabilité d'impact : très faible

🎜🎜La méthode nouvellement ajoutée suivante bootstrapPath, < code>configPath, databasePath, environmentPath, resourcePath, storagePath, resolveProvider, bootstrapWith, configurationIsCached, detectEnvironment, environmentFile, environmentFilePath, getCachedConfigPath, getCachedRoutesPath, getLocale, getNamespace, getProviders, hasBeenBootstrapped, loadDeferredProviders, loadEnvironmentFrom, routesAreCached, setLocale, shouldSkipMiddleware , terminate sera ajouté à Illuminate/Contracts/Foundation/Application 🎜🎜Si vous implémentez cette interface, vous devez ajouter ces méthodes à la classe d'implémentation. 🎜🎜Authentification🎜🎜Réinitialiser les paramètres de la route de notification de mot de passe 🎜🎜🎜Probabilité d'impact : faible 🎜🎜🎜Lorsque l'utilisateur clique sur le lien de réinitialisation du mot de passe, Laravel utilise l'assistant route pour générer l'URL permettant de créer un lien vers < code>password.reset nommé route, lors de l'utilisation de Laravel 5.7, le jeton sera transmis à l'assistant route sans nom explicite, tel que : 🎜
Cache::lock('foo', 10)->get(function () {    // 锁将会被安全的自动释放});
🎜Lorsque vous utilisez In Laravel 5.8, le jeton est passé en paramètre explicite à l'assistant route : 🎜
if (($lock = Cache::lock('foo', 10))->get()) {    // 执行任务…    $lock->release();}
🎜 Par conséquent, si vous souhaitez définir votre propre route password.reset, son uri doit To inclure un paramètre de jeton. 🎜🎜Changement de la longueur du mot de passe par défaut🎜🎜🎜Impact potentiel : faible 🎜🎜🎜La longueur du mot de passe requise lors de la sélection ou de la réinitialisation d'un mot de passe est modifiée à au moins huit caractères. 🎜🎜Cache🎜🎜TTL en secondes🎜🎜🎜Impact potentiel : très élevé🎜🎜

Pour permettre des délais d'expiration plus précis lors du stockage des données, la durée de vie des données mises en cache a été modifiée de quelques minutes à quelques secondes. put , putMany , add , remember pour la classe IlluminateCacheRepository et ses classes d'extension Cette mise à jour est complétée par la méthode setDefaultCacheTime et la méthode put de toutes les mémoires cache. Veuillez consulter le PR associé pour plus de détails. IlluminateCacheRepository 类和它的扩展类的 put ,  putMany ,  add ,  remembersetDefaultCacheTime 方法,以及所有缓存存储器的 put 方法都完成了此更新。详情请看 相关的 PR  。

如果要向这些方法中的任何一个传递整数,请更新代码以确保保留在缓存中的数据传递的数值是秒。另外,你可以传递一个 DateTime 实例指示数据何时到期:

// 在控制器中…$podcast = Podcast::find(1);
if (($lock = Cache::lock('foo', 120))->get()) {
    ProcessPodcast::dispatch($podcast, $lock->owner());}// 在进程广播队列中…
Cache::restoreLock('foo', $this->owner)->release();

{提示} 此更改使 Laravel 缓存系统完全符合 PSR-16 缓存库标准 。

遵循 PSR-16

影响可能性:中等

除了以上返回值有变化之外,本次升级还更新了 IlluminateCacheRepository 类中的 putputManyadd 方法的 TTL 参数,使之更符合 PSR-16 规范。新特性提供了一个默认的 null ,所以如果不指定 TTL 值,那么缓存将会永久存储不会过期。此外,如果缓存项的 TTL 为 0 或者更小,那么将会被清除。参阅 相关的 PR 获取更多信息。

KeyWritten 事件基于这些变动 也进行了更新 。

锁安全性改善

影响可能性:高

在 Laravel 5.7 以及 Laravel 更早的版本的中,一些缓存驱动提供的 “原子锁” 特性,可能由于一些意外行为导致锁被提前释放。

例如: 客户端 A 获取了一个 10 秒过期的锁 foo客户端 A 实际上需要耗费 20 秒来完成它的任务。在客户端 A 任务执行期间,锁被缓存系统自动释放。之后 客户端 B 获取到锁 foo。最终 客户端 A 完成了它的任务并释放掉锁 foo,但是无意中释放了 客户端 B 所持有的锁。这时候 客户端 C 又可以获取到锁。

为了缓解这种情况,现在使用嵌入的「范围令牌」生成锁,这样可以确保在正常情况下,只有锁的持有者才能释放锁。

如果你正在使用 Cache::lock()->get(Closure) 方法使用锁,则不需要进行任何更改:

Cache::lock('foo')->forceRelease();

但是,如果要手动调用, Cache::lock()->release() ,则必须更新代码以维护锁的实例。然后,在完成任务后,可以在同一个锁实例上调用 release

Si vous transmettez un entier à l'une de ces méthodes, veuillez mettre à jour votre code pour vous assurer que les données conservées dans le cache sont transmises en quelques secondes. De plus, vous pouvez transmettre une instance DateTime pour indiquer quand les données expirent : 🎜
/**
 * Get the first item by the given key value pair.
 *
 * @param  string  $key
 * @param  mixed  $operator
 * @param  mixed  $value
 * @return mixed
 */public function firstWhere($key, $operator = null, $value = null);
🎜{Tip} Ce changement rend le système de cache Laravel entièrement conforme à la norme de bibliothèque de cache PSR-16. 🎜

Conforme au PSR-16

🎜Possibilité d'impact : Moyen🎜🎜En plus des changements dans les valeurs de retour ci-dessus, cette mise à jour met également à jour le Paramètres TTL IlluminateCacheRepository pour les méthodes put, putMany et add dans la classe pour les rendre plus conformes au PSR-16 spécification. La nouvelle fonctionnalité fournit un null par défaut, donc si aucune valeur TTL n'est spécifiée, le cache sera stocké de manière permanente et n'expirera pas. De plus, les entrées du cache seront effacées si leur durée de vie est égale ou inférieure à 0. Voir le PR associé pour plus d'informations. 🎜🎜L'événement KeyWritten a également été mis à jour en fonction de ces modifications. 🎜

Améliorations de la sécurité du verrouillage

🎜Possibilité d'impact : Élevée🎜🎜Dans Laravel 5.7 et les versions antérieures de Laravel, la fonctionnalité "verrouillage atomique" fournie par certains pilotes de cache, le verrou peut être libéré prématurément en raison d'un comportement inattendu. 🎜🎜Par exemple : le Client A acquiert un verrou foo qui expire dans 10 secondes. Le Client A met en réalité 20 secondes pour terminer sa tâche. Lors de l'exécution de la tâche Client A, le verrou est automatiquement libéré par le système de cache. Ensuite, le Client B acquiert le verrou foo. Finalement, le Client A termine sa tâche et libère le verrou foo, mais libère par inadvertance le verrou détenu par le Client B. À ce moment, le Client C peut à nouveau obtenir le verrou. 🎜🎜Pour remédier à cette situation, le verrou est désormais généré à l'aide d'un « jeton de portée » intégré, qui garantit que dans des circonstances normales, seul le détenteur du verrou peut déverrouiller le verrou. 🎜🎜Si vous utilisez le verrou à l'aide de la méthode Cache::lock()->get(Closure), aucune modification n'est requise : 🎜
$value = DB::table('users')->value('options->language');
dump($value);
// Laravel 5.7...
'"en"'
// Laravel 5.8...
'en'
🎜 Cependant, si vous souhaitez l'appeler manuellement, Cache::lock()->release() , vous devez mettre à jour le code pour conserver l'instance de verrouillage. Ensuite, une fois la tâche terminée, la méthode release peut être appelée sur la même instance de verrou. Par exemple : 🎜
// Laravel 5.7...
App\Feedback.php -> feedback (正确的复数形式)
App\UserFeedback.php -> user_feedbacks (错误的复数形式)
// Laravel 5.8
App\Feedback.php -> feedback (正确的复数形式)
App\UserFeedback.php -> user_feedback (正确的复数形式)

Parfois, vous souhaiterez peut-être acquérir un verrou dans un processus et le libérer dans un autre processus. Par exemple, vous pouvez acquérir un verrou lors d'une requête Web et vouloir le libérer à la fin de la tâche en file d'attente déclenchée par cette requête. Dans ce cas, vous devez transmettre le « jeton de propriétaire » de la portée du verrou au travail en file d'attente afin que le travail puisse ré-instancier le verrou avec le jeton donné :

/**
 * 与模型关联的数据表名称。
 *
 * @var string
 */protected $table = 'user_feedbacks';

Si vous souhaitez faire cela sans respecter son propriétaire actuel Pour libérer le lock, vous pouvez utiliser les méthodes forceRelease suivantes : forceRelease 方法:

/**
 * 标识 ID 是否自增
 *
 * @var bool
 */public $incrementing = true;

RepositoryStore 契约

影响可能性:非常低

为了完全符合 PSR-16 的要求,IlluminateContractsCacheRepository 契约的 putforever 方法的返回值以及 IlluminateContractsCacheStore 契约的 put, putManyforever 方法 已更改 从 voidbool

集合

firstWhere  方法

影响可能性:非常低

firstWhere 方法参数 已更改 匹配 where 方法的签名。如果要重写此方法,则应更新方法的参数来匹配其父级:

protected $casts = ['deleted_at' => 'string'];

终端

Kernel 契约

影响可能性:非常低

terminate 方法 已经添加到 Illuminate/Contracts/Console/Kernel 契约中。如果你实现了这个接口,则应该将这个方法添加到实现类中。

容器

生成器 & 标记服务

影响可能性:中等

容器的 tagged 方法使用 PHP 生成器通过给定的标记惰性地实例化服务。由于这种改变,tagged 方法返回  iterable 类型,而不是 数组。如果你这个方法使用了类型提示的返回值,则应确保将类型提示也更改为 iterable 类型。

另外,不能再通过数组偏移值直接访问标记服务 ,比如 $container->tagged('foo')[0]

resolve 方法

影响可能性:非常低

resolve 方法 接收一个新布尔参数,该参数指示事件在对象实例化期间是否应触发 / 执行(解析回调)。如果你重写了这个方法,你必须更新方法签名以匹配父方法。

addContextualBinding 方法

影响可能性:非常低

IlluminateContractsContainerContainer 契约增加了 addContextualBinding

/**
 * 将给定的 Http 异常转换为 Http 响应。
 *
 * @参数 \Symfony\Component\HttpKernel\Exception\HttpExceptionInterface  $e
 * @返回 \Symfony\Component\HttpFoundation\Response
 */protected function renderHttpException(HttpExceptionInterface $e);

Repository et Store Contract

Impact potentiel : Très faible🎜🎜Afin de respecter pleinement les exigences du PSR-16, le put et le du contrat IlluminateContractsCacheRepository La valeur de retour de la méthode >forever et des méthodes put, putMany et forever du IlluminateContractsCacheStore Le contrat est passé de void à bool. 🎜

Collection

méthode firstWhere

🎜Possibilité d'impact : très faible🎜🎜 Méthode firstWhere Les paramètres ont été modifiés pour correspondre à la signature de la méthode where. Si vous souhaitez remplacer cette méthode, vous devez mettre à jour les paramètres de la méthode pour qu'ils correspondent à son parent : 🎜
'employee' => [    'name' => 'Taylor Otwell',],/**
    * 转换给定的值.
    *
    * @param  string  $key
    * @param  mixed  $value
    * @return mixed
    */protected function transform($key, $value){    dump($key); // 'employee.name' (Laravel 5.8)    dump($key); // 'name' (Laravel 5.7)}

Terminal

Kernel Contract

🎜Effets Probabilité : Très faible🎜🎜La méthode terminate a été ajoutée au contrat Illuminate/Contracts/Console/Kernel. Si vous implémentez cette interface, vous devez ajouter cette méthode à la classe d'implémentation. 🎜

Container

Générateur et service de balises

🎜Probabilité d'impact : moyen🎜🎜La méthode tagged de Container est générée à l'aide de PHP. Le fournisseur instancie paresseusement le service avec la balise donnée. En raison de ce changement, la méthode tagged renvoie un type iterable au lieu d'un array. Si votre méthode utilise une valeur de retour indiquée par un type, veillez également à modifier l'indication de type en un type iterable. 🎜🎜De plus, le service de balises n'est plus accessible directement via la valeur de décalage du tableau, telle que $container->tagged('foo')(0]. 🎜

méthode resolve

🎜Impact potentiel : très faible🎜🎜 La méthode resolve reçoit un nouveau paramètre booléen qui indique si le l'événement doit se déclencher/s'exécuter pendant l'instanciation de l'objet (rappel de résolution). Si vous remplacez cette méthode, vous devez mettre à jour la signature de la méthode pour qu'elle corresponde à la méthode parent. 🎜

Méthode addContextualBinding

🎜Possibilité d'impact : Très faible🎜🎜IlluminateContractsContainerContainer Le contrat ajoute addContextualBinding méthode. Si vous souhaitez implémenter cette interface, vous devez ajouter cette méthode à votre implémentation. 🎜

Méthode tagged tagged 方法

影响可能性:低
tagged 方法现在 改为 返回 iterable 类型而不是 array 类型。如果你的代码参数有类型提示,找到所有 tagged 方法提示  array 类型的地方,将类型提示改为 iterable 类型。

flush 方法

影响可能性:非常低

IlluminateContractsContainerContainer 契约增加了 flush 方法。如果要实现此接口,则应将此方法加到你的实现中。

数据库

未被引号包围的 MySQL JSON 值

影响可能性:低

在使用 MySQL 和 MariaDB 的时候,Query 构造器返回的 JSON 值将不会使用引号包围。其他数据库将和这里的行为保持一致:

protected function setUp(): voidprotected function tearDown(): void

因此,不再支持或不再需要 ->> 操作符了。

SQLite

影响可能性:中等

从 Laravel 5.8 开始, 最早版本 SQLite 支持 一直到 SQLite 3.7.11。如果你使用的是更早之前的 SQLite 版本,你应该升级 (推荐升级到 SQLite 3.8.8+)。

Eloquent

模型命名中的不规则复数结尾

影响可能性:中等

从 Laravel 5.8 起,含有不规则复数形式结尾的复合名称模型命名 现在可以正确的进行复数化.

/**
 * 获取已验证的属性和值。
 *
 * @return array
 */public function validated();

如果你的模型名称没有正确的使用复数名称,你在模型中定义 $table 属性之后还是可以继续使用它的:

composer require laravel/nexmo-notification-channel
composer require laravel/slack-notification-channel

带有递增 ID 的自定义中继模型

如果你用一个自定义的中继模型定义了多对多的关系,而且这个中继模型拥有一个自增的主键,你应当确保这个自定义中继模型类中定义了一个 incrementing 属性其值为 true

rrreee

loadCount 方法

影响可能性:低

基础类 IlluminateDatabaseEloquentModel 中添加了 loadCount 方法。如果你的应用中也定义了 loadCount 方法,可能会和 Eloquent 中的相冲突。

originalIsEquivalent 方法

影响可能性:非常低

IlluminateDatabaseEloquentConcernsHasAttributes trait 中的 originalIsEquivalent 成员方法从 protected  改变为 public

deleted_at

Probabilité d'impact : faibleLa méthode
tagged renvoie désormais un type itérable au lieu d'un tableau < /code> tapez. Si vos paramètres de code ont des indices de type, recherchez tous les indices de méthode tagged de type array et modifiez l'indice de type en type iterable.

Méthode flush 🎜🎜🎜Probabilité d'impact : très faible 🎜🎜🎜Le contrat IlluminateContractsContainerContainer ajoute une méthode flush. Si vous souhaitez implémenter cette interface, vous devez ajouter cette méthode à votre implémentation. 🎜

Base de données

🎜Valeurs JSON MySQL non entourées de guillemets🎜🎜🎜Possibilité d'impact : Faible🎜🎜🎜Lors de l'utilisation de MySQL et MariaDB, la valeur JSON renvoyée par le constructeur Query ne sera pas entourée de guillemets . D'autres bases de données se comporteront de manière cohérente avec ceci : 🎜rrreee🎜 Par conséquent, l'opérateur ->> n'est plus pris en charge ni requis. 🎜🎜SQLite🎜🎜🎜Probabilité d'impact : Modérée 🎜🎜🎜 À partir de Laravel 5.8, la première version de SQLite est prise en charge jusqu'à SQLite 3.7.11. Si vous utilisez une version antérieure de SQLite, vous devez effectuer une mise à niveau (il est recommandé de passer à SQLite 3.8.8+). 🎜

Éloquent

🎜Finitions plurielles irrégulières dans les noms de modèles🎜🎜🎜Probabilité d'impact : moyenne🎜🎜🎜Depuis Laravel 5.8, la dénomination modèle des noms composés avec des terminaisons plurielles irrégulières fonctionne désormais correctement Pluralisation.🎜rrreee🎜Si votre Le nom du modèle n'utilise pas correctement le nom au pluriel, vous pouvez toujours continuer à l'utiliser après avoir défini l'attribut $table dans le modèle : 🎜rrreee🎜Automatique avec ID incrémentiel Définir le modèle de relais🎜🎜Si vous définissez un relation plusieurs-à-plusieurs avec un modèle de relais personnalisé et que le modèle de relais possède une clé primaire auto-incrémentée, vous devez vous assurer que la classe du modèle de relais personnalisé définit un attribut incrémentation dont la valeur est true : 🎜rrreee🎜Méthode loadCount 🎜🎜🎜Possibilité d'impact : faible 🎜🎜🎜Classe Base IlluminateDatabaseEloquentModel Ajout de la méthode loadCount dans . Si votre application définit également la méthode loadCount, elle peut entrer en conflit avec celle d'Eloquent. 🎜🎜Méthode originalIsEquivalent 🎜🎜🎜Impact potentiel : très faible 🎜🎜🎜La méthode membre IlluminateDatabaseEloquentConcernsHasAttributes dans le trait IlluminateDatabaseEloquentConcernsHasAttributes est supprimée de protected est remplacé par public. 🎜🎜Conversion automatique par suppression logicielle des attributs deleted_at🎜🎜🎜Impact potentiel : faible🎜🎜

Lorsque votre modèle Eloquent utilise le trait IlluminateDatabaseEloquentSoftDeletes, la propriété membre deleted_at sera désormais automatiquement convertie en une instance Carbon. Vous pouvez remplacer ce comportement en écrivant votre accesseur personnalisé pour la propriété du membre ou en l'ajoutant manuellement à l'attribut casts : IlluminateDatabaseEloquentSoftDeletes trait 时 deleted_at 成员属性 现将会自动转换 成为一个 Carbon 实例。你可以重写这个行为,通过为该成员属性编写你的自定义 accessor 或者手动将它添加到 casts 属性中:

rrreee

BelongsTogetForeignKey 方法

影响可能性:低

BelongsTo 关联关系中的 getForeignKeygetQualifiedForeignKey 方法已分别重命名为 getForeignKeyNamegetQualifiedForeignKeyName,使得方法名和在 Laravel 提供的其他关联关系中保持一致。

事件

fire 方法

影响可能性:低

Illuminate/Events/Dispatcher 类中的 fire 方法 (在 Larevel 5.4 中不赞成使用)  已经被 移除 了。
你应当使用它的替代方法 dispatch

异常处理器

ExceptionHandler 契约

影响可能性:低

IlluminateContractsDebugExceptionHandler 契约中新增了 shouldReport 方法。 现在当你实现异常处理器的接口时,你需要同时实现此方法。

renderHttpException 方法

影响可能性:低

IlluminateFoundationExceptionsHandler 类中 renderHttpException 方法的签名 有改动 。现在如果你在异常处理器中重写此方法,应当修改方法的签名以和其父类保持一致:

rrreee

Facades

Facade 服务解析

影响可能性:低

getFacadeAccessor 方法现在可以 只返回代表服务容器标识的字符串 ,之前该方法会返回一个对象实例。

邮件

Markdown 文件路径更改

影响可能性:高

如果你已经使用 vendor:publish 命令发布了 Laravel 的 Markdown 邮件组件,你需要将 /resources/views/vendor/mail/markdown 路径重命名为 text

并且 markdownComponentPaths 方法 已被重命名 为 textComponentPaths 。如果你要重写这个方法,你应该更新方法名,使之与其父类一致。

PendingMailrrreee

BelongsTo's code>getForeignKey

Possibilité d'impact : Faible

🎜BelongsTo Les méthodes getForeignKey et getQualifiedForeignKey dans la relation ont été renommées en getForeignKeyName et getQualifiedForeignKeyName respectivement pour rendre le nom de la méthode cohérent avec les autres relations fournies par Laravel.
🎜Méthode

Event

fire 🎜🎜🎜Probabilité d'impact : faible🎜🎜🎜Classe Illuminate/Events/Dispatcher La < La méthode code>fire (obsolète dans Larevel 5.4) a été supprimée.
Vous devez utiliser son alternative dispatch . 🎜Contrat

Exception Handler

ExceptionHandler 🎜🎜🎜Impact potentiel : faible🎜🎜🎜IlluminateContractsDebugExceptionHandler Nouveau ajouté au contrat ShouldReport< /code> méthode. Désormais, lorsque vous implémentez l’interface du gestionnaire d’exceptions, vous devez également implémenter cette méthode. 🎜

méthode renderHttpException 🎜🎜🎜Possibilité d'impact : Faible🎜🎜🎜IlluminateFoundationExceptionsHandler La signature de la méthode renderHttpException dans le La classe IlluminateFoundationExceptionsHandler a changé. Maintenant, si vous remplacez cette méthode dans un gestionnaire d'exceptions, vous devez modifier la signature de la méthode pour qu'elle soit cohérente avec sa classe parent : 🎜rrreee

Façades

Résolution du service de façade 🎜🎜🎜Impact potentiel : Faible 🎜🎜🎜La méthode getFacadeAccessor peut désormais simplement renvoyer une chaîne représentant l'ID du conteneur de service, au lieu de renvoyer une instance d'objet. 🎜

Mail

Changement du chemin du fichier Markdown

🎜🎜Possibilité d'impact : Élevé🎜🎜🎜Si vous avez publié en utilisant le vendor:publish commande Pour utiliser le composant de messagerie Markdown de Laravel, vous devez renommer le chemin /resources/views/vendor/mail/markdown en text. 🎜🎜Et la méthode markdownComponentPaths a été renommée en textComponentPaths . Si vous remplacez cette méthode, vous devez mettre à jour le nom de la méthode pour qu'il corresponde à sa classe parent. 🎜Changement des paramètres de la méthode de classe

PendingMail🎜🎜🎜Possibilité d'impact : très faible🎜🎜

send, sendNow, queue, later et dans IlluminateMailPendingMail class La méthode >fill a été modifiée pour accepter une instance IlluminateContractsMailMailable comme paramètre au lieu d'une instance IlluminateMailMailable. Si vous souhaitez remplacer une méthode, vous devez mettre à jour ses paramètres pour qu'ils soient cohérents avec sa classe parent. IlluminateMailPendingMail 类中的 sendsendNowqueuelaterfill 方法 已被更改 为需接收一个 IlluminateContractsMailMailable 实例作为参数,而不是 IlluminateMailMailable 实例。如果你要重写其中的方法,你需要更新其形参,和其父类保持一致。

队列

Pheanstalk 4.0

影响可能性:中

Laravel 5.8 提供了支持 ~4.0 发布版本的 Pheanstalk 队列。如果你正在应用中使用 Pheanstalk 库,请通过 Composer 升级你的库到 ~4.0 发布版本。

Job 契约

影响可能性:非常低

isReleasedhasFailedmarkAsFailed 方法 已被加入到 IlluminateContractsQueueJob 契约中 。如果你正在实现这个 interface ,你应该添加这些方法到你的实现代码中。

Job::failed & FailingJob

影响可能性:非常低

在 Laravel 5.7 中,当一个队列任务失败后,队列 worker 将执行 FailingJob::handle 方法。在 Laravel 5.8 中,FailingJob 类中的逻辑已被迁移到了 fail 方法中,该方法就定义在这个任务类中。正因如此, fail 方法被纳入了 IlluminateContractsQueueJob 契约。

IlluminateQueueJobsJob 基类包含了 fail 的实现,在常规的应用里不需要改任何代码。然而,如果你正在搭建自定义的队列驱动,起了一个任务类,该任务类 没有 继承由 Laravel 提供的任务基类,你应该在你自定义的任务类中手动实现 fail 方法。作为实现的参考,你可以查阅 Laravel 的任务基类。

这个改变允许定制队列驱动,从而在对任务删除过程获得更多的控制。

Redis Blocking Pop

影响可能性:非常低

现在使用 Redis 队列驱动的 「blocking pop」特性是安全的。在之前,如果 Redis 服务或者 worker 掉线的同时取出任务,可能造成队列中的任务丢失(小概率事件)。 为了让 blocking pops 变得安全,将给每一个 Laravel 队列创建一个新的带有 :notify 后缀的 Redis list 。

请求

TransformsRequest 中间件

影响可能性:低

现在,当请求输入是一个数组时,  IlluminateFoundationHttpMiddlewareTransformsRequest 中间件的 transform 方法将接收到「全限定」 请求输入的 key :

rrreee

路由

UrlGenerator

File d'attente

Pheanstalk 4.0

Possibilité d'impact : Medium

🎜Laravel 5.8 fournit des files d'attente Pheanstalk qui prennent en charge la version ~4.0. Si vous utilisez la bibliothèque Pheanstalk dans votre application, veuillez mettre à niveau votre bibliothèque vers la version ~4.0 via Composer. 🎜

Job 🎜🎜🎜Possibilité d'impact : très faible🎜🎜🎜isReleased, hasFailed et markAsFailed La méthode a été ajoutée au contrat IlluminateContractsQueueJob. Si vous implémentez cette interface, vous devez ajouter ces méthodes à votre code d'implémentation. 🎜Classes

Job::failed & FailingJob 🎜🎜🎜Possibilité d'impact : très faible🎜🎜🎜Dans Laravel 5.7, lorsqu'une tâche de file d'attente échoue, la file d'attente Le travailleur exécutera la méthode FailingJob::handle. Dans Laravel 5.8, la logique de la classe FailingJob a été migrée vers la méthode fail, qui est définie dans cette classe de tâches. Pour cette raison, la méthode fail est incluse dans le contrat IlluminateContractsQueueJob. 🎜🎜IlluminateQueueJobsJob La classe de base contient l'implémentation de fail, et il n'est pas nécessaire de modifier le code dans les applications classiques. Cependant, si vous créez un pilote de file d'attente personnalisé et créez une classe de tâches qui n'hérite pas de la classe de base de tâches fournie par Laravel, vous devez implémenter manuellement fail< dans votre méthode de classe de tâches personnalisée /code>. Comme référence pour l'implémentation, vous pouvez consulter la classe de base de tâches de Laravel. 🎜🎜Ce changement permet de personnaliser le pilote de file d'attente pour mieux contrôler le processus de suppression des tâches. 🎜

Redis Blocking Pop🎜🎜🎜Possibilité d'impact : Très faible🎜🎜🎜Il est désormais sûr d'utiliser la fonctionnalité "blocking pop" du pilote de file d'attente Redis. Auparavant, si le service ou le travailleur Redis était déconnecté et que des tâches étaient supprimées en même temps, les tâches dans la file d'attente pouvaient être perdues (un événement peu probable). Pour sécuriser le blocage des pops, une nouvelle liste Redis avec le suffixe :notify sera créée pour chaque file d'attente Laravel. 🎜

Request

TransformsRequest Middleware 🎜🎜🎜Probabilité d'impact : faible 🎜🎜🎜Maintenant, lorsque l'entrée de la requête est un tableau, IlluminateFoundationHttpMiddlewareTransformsRequest Le La méthode transform du middleware recevra la clé de saisie de requête "pleinement qualifiée" : 🎜rrreee

Route

UrlGenerator protocol🎜🎜🎜 Probabilité de impact : Très faible🎜🎜

La méthode previous a été ajoutée au contrat IlluminateContractsRoutingUrlGenerator. Si vous souhaitez appeler cette interface, vous devez ajouter cette méthode à votre implémentation. previous 方法 已经添加到 IlluminateContractsRoutingUrlGenerator contract 中。如果要调用这个接口,你应该将这个方法添加到你的实现中。

Illuminate/Routing/UrlGenerator 中的  cachedSchema 特性

影响可能性:非常低

Illuminate/Routing/UrlGenerator 中的 $cachedSchema 属性 (在 Laravel 5.7 中已被弃用) 已更改为 $cachedScheme

Sessions

StartSession 中间件

影响可能性:非常低

Session 的持久性逻辑已 从 terminate() 方法移动到 handle() 方法。 如果你要重写其中的方法, 则应该更新它们以反映这些更改。

Support

优先使用字符串和数组类而不是辅助函数

影响可能性:中等

所有的 array_* and str_* 全局辅助函数 都被废弃。你需要直接使用 IlluminateSupportArrIlluminateSupportStr 提供的方法。

这个调整的影响被标记为中等,因为这些辅助函数被转移到新的 laravel/helpers 扩展包中,以便更好地向后兼容。

延迟的服务提供者

影响可能性:中等

服务提供程序的用于指示是否延迟提供程序的 defer 布尔属性已经被废弃。现在如果要将服务提供者标记为延迟的需要通过实现 IlluminateContractsSupportDeferrableProvider 契约来完成。

测试

PHPUnit 8

影响可能性:可选

默认情况下, Laravel 5.8 使用 PHPUnit 7.。不过, 你可以升级到 PHPUnit 8,但是这需要 PHP >= 7.2。更多细节请阅读 PHPUnit 8 版本声明。

setUptearDown 方法现在要求返回 void 类型:

rrreee

验证

Validator 契约

影响可能性:非常低

IlluminateContractsValidationValidator 中 新增了 validated 方法:

rrreee

如果你调用了这个接口,需要添加此方法的实现。

ValidatesAttributes 特性

影响可能性:非常低

IlluminateValidationConcernsValidatesAttributes 特性中的 parseTablegetQueryColumnrequireParameterCount 方法可见性从 protected 调整为了 public

DatabasePresenceVerifier

影响可能性:非常低

IlluminateValidationDatabasePresenceVerifier 类的 table 方法可见性从 protected 调整为了 public

cachedSchema fonctionnalité dans Illuminate/Routing/UrlGenerator

Impact potentiel : très faible🎜🎜 Le < La propriété code>$cachedSchema dans Illuminate/Routing/UrlGenerator
(obsolète dans Laravel 5.7) a été remplacée par $cachedScheme. 🎜

Sessions

Démarrer la session Middleware

🎜Impact potentiel : Très faible🎜🎜La logique de persistance de la session a été modifiée de< Le code La méthode >terminate()
est déplacée vers la méthode handle(). Si vous remplacez les méthodes qu'elles contiennent, vous devez les mettre à jour pour refléter les modifications. 🎜

Support

Préférer les classes de chaînes et de tableaux aux fonctions d'assistance

🎜Impact potentiel : moyen🎜🎜Tous les array_*< /code> et < Les fonctions d'assistance globales code>str_* sont obsolètes. Vous devez utiliser directement les méthodes fournies par IlluminateSupportArr et IlluminateSupportStr. 🎜🎜L'impact de cet ajustement est marqué comme moyen car ces fonctions d'assistance sont déplacées vers le nouveau package d'extension laravel/helpers pour une meilleure compatibilité ascendante. 🎜

Fournisseur de services différé

🎜Probabilité d'impact : moyen🎜🎜La propriété booléenne defer du fournisseur de services indiquant s'il faut différer le fournisseur déjà abandonné. Désormais, le marquage d'un fournisseur de services comme différé doit être effectué en implémentant le contrat IlluminateContractsSupportDeferrableProvider. 🎜

Test

PHPUnit 8

🎜Possibilité d'impact : Facultatif🎜🎜Par défaut, Laravel 5.8 utilise PHPUnit 7. Cependant, vous pouvez passer à PHPUnit 8, mais cela nécessite PHP >= 7.2. Veuillez lire l'annonce de la sortie de PHPUnit 8 pour plus de détails. 🎜🎜Les méthodes setUp et tearDown nécessitent désormais le type de retour void : 🎜rrreee

Validation

Validator Contrat< /code> h4>🎜Possibilité d'impact : très faible🎜🎜IlluminateContractsValidationValidator Ajout de la méthode validated : 🎜rrreee🎜Si vous appelez cette interface, An la mise en œuvre de cette méthode doit être ajoutée. 🎜

Attribut ValidatesAttributes

🎜Impact potentiel : très faible🎜🎜Attribut IlluminateValidationConcernsValidatesAttributes dans parseTable, les méthodes getQueryColumn et requireParameterCount ont été ajustées de protected à public. 🎜

Classe DatabasePresenceVerifier

🎜Impact potentiel : très faible🎜🎜 Méthode IlluminateValidationDatabasePresenceVerifier de la classe visibilité ajustée de protected à public. 🎜

Classe Validator

Impact potentiel : très faibleValidator

影响可能性:非常低

IlluminateValidationValidator 类的 getPresenceVerifierFor 方法可见性从 protected 调整为了 public

邮箱验证

影响可能性:非常低

邮箱验证规则现在回检测邮箱地址是否兼容 RFC5630, 使验证逻辑和 SwiftMailer 保持一致。在 Laravel 5.7, email 规则只验证邮箱地址是否兼容 RFC822。

因此 当使用 Laravel 5.8 时,之前认为无效的邮箱地址现在将被视为有效,如 (e.g hej@bär.se)。 通常,这被看做一个 bug 修复; 不过, 我们还是将其列到这里给你一个提醒。如果您遇到有关此更改的任何问题,请通知我们。

视图

getData 方法

影响可能性:非常低

IlluminateContractsViewView 契约中新增了 getData 方法。如果你调用了这个接口, 则需要添加该方法的实现。

通知

Nexmo / Slack 通知频道

影响可能性:高

Nexmo 和 Slack 通知频道已经被提前到官方扩展中。要在自己的应用中使用这些频道,需要安装以下扩展包:

rrreee

其他

我们还鼓励你查看 laravel/laravel

IlluminateValidationValidator de la classe getPresenceVerifierFor la visibilité de la méthode est ajustée de protected à public.

Vérification des e-mails

Possibilité d'impact : très faible

Les règles de vérification des e-mails vérifient désormais si l'adresse e-mail est compatible avec la RFC5630, rendant la logique de vérification cohérente avec SwiftMailer. Dans Laravel 5.7, la règle email vérifie uniquement que les adresses e-mail sont conformes à la RFC822.

Ainsi, lors de l'utilisation de Laravel 5.8, les adresses e-mail qui étaient auparavant considérées comme invalides seront désormais considérées comme valides, comme (par exemple hej@bär.se). Normalement, cela est considéré comme une correction de bug, mais nous l'incluons ici à titre de rappel. Si vous rencontrez des problèmes avec ce changement, veuillez nous en informer.

View

Méthode getData

Possibilité d'impact : très faible🎜

Nouvellement ajouté dans le contrat IlluminateContractsViewView< méthode code>getData. Si vous appelez cette interface, vous devez ajouter l'implémentation de cette méthode. 🎜

Notifications

🎜Canaux de notification Nexmo/Slack

Impact potentiel : élevé🎜

Les canaux de notification Nexmo et Slack ont ​​été avancés dans l'extension officielle . Pour utiliser ces chaînes dans votre propre application, vous devez installer les extensions suivantes : 🎜rrreee

Autre

Nous vous encourageons également à consulter le journal des modifications de laravel/laravel dépôt de code. Bien que bon nombre de ces mises à jour ne soient pas requises, vous pouvez synchroniser ces fichiers dans votre application avec le référentiel de code. Certaines de ces mises à jour sont déjà mentionnées dans ce guide de mise à niveau, mais de nombreuses autres mises à jour mineures (telles que des modifications apportées aux fichiers de configuration ou aux annotations) ne sont pas répertoriées. Vous pouvez voir quelles mises à jour sont les plus importantes pour vous grâce à l'outil de comparaison GitHub. 🎜🎜Cet article a été publié pour la première fois sur le site 🎜LearnKu.com🎜. 🎜🎜