Releases
v5.5.0
General
⚠️ Require PHP 7+ (06907a0 , 39809ce )
⚠️ Removed deprecated ServiceProvider::compile()
method (10da428 )
⚠️ Removed deprecated Str::quickRandom()
method (2ef257a )
Removed build
scripts (7c16b15 )
Upgraded to Symfony 3.3 components (4db7031 , 67a5367 )
Throw RuntimeException
when app key is missing (#19145 , 8adbaa7 )
Artisan Console
Added interactive prompt to vendor:publish
(#18230 )
Added migrate:fresh
command (f6511d4 , #20090 )
Added make:factory
command and added --factory
to make:model
(a6ffd8b , #19985 )
Added make:rule
command (76853fd )
⚠️ Added runningInConsole()
method Application
contract (#18658 )
Support default value(s) on command arguments (#18572 )
Improved CLI detection for phpdbg (#18781 )
⚠️ Always return array from RetryCommand::getJobIds()
(#19232 )
Support passing absolute paths to make::listener
(#19660 )
⚠️ Use handle()
method instead of fire()
(#19827 , #19839 , #20024 )
Try to guess the --create
option when generation migrations (#20032 )
Generate make:policy
with real user model namespace (#20047 )
Added Kernel::load()
to auto register a directory of commands (2e7ddca , d607b9c )
⚠️ Removed array
type hint from Command::table()
(#20120 )
Support loading multiple paths in Kernel::load()
(#20251 , #20595 )
Added CommandStarting
and CommandFinished
events (#20298 )
Show error message if a reverted migration is not found (#20499 , a895b1e )
Set correct namespace in model factories when using the app:name
command (#20766 )
⚠️ Switched the -f
shortcut from --force
to --factory
on make:model
command (#20800 )
Assets
Added frontend preset commands (463b769 , too many follow-up commits )
Authentication
⚠️ Support default user providers and pass user provider to RequestGuard
(#18856 )
Made the user provider parameter on RequestGuard
optional (d7f0b26 )
Use setRememberToken()
in ResetsPasswords
(#19189 )
Added a PasswordReset
event (#19188 )
⚠️ Support multiword models in authorizeResource()
(#19821 )
Added support for no user provider in CreatesUserProviders
(4feb847 )
Authorization
Support multiple values in Gate::has()
(#18758 )
⚠️ Prevent policies from being too greedy (#19120 )
⚠️ Added abilities()
method to Gate
contract (#19173 )
⚠️ Implement iterable
on Gate::check()
and Gate::any()
(#20084 )
Blade Templates
Added Blade::if()
method (71dfe0f , 2905364 , #20025 )
Added @switch
, @case
, @break
and @default
directives (#19758 )
⚠️ Prevent Blade from parsing PHP code inside @php
blocks (#20065 )
Broadcasting
⚠️ Use AccessDeniedHttpException
instead if HttpException
(#19611 )
⚠️ Upgraded to Pusher SDK v3 (#20016 )
Cache
⚠️ PSR-16 compliance (#20194 )
Don't encrypt database cache values (f0c72ec )
Added support cache locks (4e6b2e4 , 045e6f2 , #19669 )
Accept DatetimeInterface
and DateInterval
in cache repository (#20034 )
Added getStore()
method to cache Repository
interface (#20338 )
⚠️ Made RateLimiter
less aggressive (#20759 )
Collections
Support multiple values in Collection::has()
(#18758 )
Added Collection::mapInto()
method (2642ac7 )
Added Collection::dd()
method (f5fafad )
Added Collection::dump()
method (#19755 )
Added wrap()
and unwrap()
methods (#20055 , #20068 )
Added keys to partition()
, eachSpread()
and mapSpread
callback (#20783 , #20723 )
Configuration
Added Config::getMany()
method (#19770 )
Controllers
⚠️ Added ControllerDispatcher
(#20031 )
⚠️ Removed Controller::missingMethod()
(bf5d221 )
Database
⚠️ Added dropAllTables()
to schema builder (#18484 , d910bc8 , #19644 , #19645 , #20239 , #20536 )
Added precision to dateTime
and timestamp
column types (#18847 , f85f6db , #18962 , #20464 )
Pass page number to chunk()
callback (#19316 )
Improve memory usage in chunk()
and chunkById()
(#19345 , #19369 , #19368 )
Fixed compileColumnListing()
when using PostgreSQL with multiple schemas (#19553 )
Allow the seeder to call multiple commands at once (#19912 )
Added pgpool message to DetectsLostConnections
(#20418 )
Prevent race conditions on replicated databases (#20445 , 0ec1522 , 3824a36 )
⚠️ Support sticky database connections (#20746 )
Eloquent ORM
Added API resources (#20710 , too many follow-up commits )
⚠️ Indicate soft deleted models as existing (#17613 )
⚠️ Added $localKey
parameter to HasRelationships::belongsToMany()
and BelongsToMany
(#17903 , 7c7c3bc )
⚠️ Added $parentKey
parameter to belongsToMany()
, BelongsToMany
and MorphToMany
(#17915 , #18380 )
⚠️ Renamed $parent
property to $pivotParent
in Pivot
class (#17933 , #18150 )
⚠️ Don't add _count
suffix to column name when using withCount()
with an alias (#17871 )
⚠️ Renamed $events
to $dispatchesEvents
(#17961 , b6472bf , 3dbe12f )
⚠️ Only return query builder when the result is null for callScope()
(#18845 )
Allow setting a factory's attribute to a factory instance (#18879 )
Support null
comparison in Model::is()
(#18511 )
Added getDirty()
checks for date and castable attributes (#18400 , e180e20 )
Show method name in invalid relationship LogicException
(#18749 )
Add support for additional values in firstOrCreate()
and firstOrNew()
(#18878 )
Added a second local key to HasManyThrough
(#19114 )
Respect casts declaration on custom pivot models (#19335 )
Support creating relations without attributes (#19506 )
Added Model::only()
method (#19459 )
⚠️ Support model serialization on non default connection (#19521 , dd45f70 )
⚠️ Support updating nullable dates (#19672 )
⚠️ Make pivot model instantiable (#20179 )
Simplified BelongsToMany::allRelatedIds()
logic (#20189 )
Added Relation::get()
method (#20052 )
Added hasChanges()
, wasChanged()
, getChanges()
and syncChanges()
(#20129 , #20130 )
Better exception message when calling non existing methods on models (#20196 , 91c1f03 )
Added support for connections on model factories (#20191 )
Check for real primary key in Pivot
methods (8d82618 )
Default $attributes
on BelongsToMany::create()
to empty array (973bff4 )
Add ability to set a custom pivot accessor (#20411 )
⚠️ Call setConnection()
in Model::save()
(#20466 )
⚠️ Touch parent timestamp only if the model is dirty (#20489 )
Added Model::loadMissing()
method (#20630 , 4166c12 )
Added Model::whereKeyNot()
method (#20817 )
Encryption
Use openssl_cipher_iv_length()
in Encrypter
(#18684 )
Added Encrypter::generateKey()
method (6623996 )
Use json_last_error()
in Encrypter
(#20099 )
Errors & Logging
Added default 404, 419 and 500 error pages (#18483 , 4d8c2c1 )
⚠️ Always show custom 500 error page for all exception types when not in debug mode (#18481 , 3cb7b0f )
⚠️ Show 419 error page on TokenMismatchException
(#18728 )
Support render()
method on exceptions (ed51160 , c8a9413 )
Support report()
method on exceptions (e77f6f7 )
⚠️ Send exceptions as JSON in debug mode if the request wants JSON (5225389 , #18732 , 4fe6091 , 9ab58fd , #19333 )
⚠️ Moved exceptions from $dontReport
into $internalDontReport
(841b36c )
Added Handler::context()
method, that by default adds some default context to logs (23b7d6b )
⚠️ Don't set formatter on ErrorLogHandler
(a044f17 )
Use whoops for errors (b697272 , f6b67d4 , #19471 , #20412 )
Changed how exceptions are logged (#19698 , f1971c2 )
⚠️ Return HttpException
with code 413
from PostTooLargeException
(#19773 )
Support custom logger channel names (#20133 )
⚠️ Unify exception formatting (#20173 , #20067 , #20167 , too many follow-up commits, sorry )
Added default Handler::unauthenticated()
method (11b0de0 )
Events
Filesystem
⚠️ Made Storage::files()
work like Storage::allFiles()
(#18874 , 7073457 )
⚠️ Fixed compatibility between FilesystemAdapter
and the Filesystem
interface (#19389 )
Helpers
Added report()
helper (2b67619 )
Added throw_if()
and throw_unless()
helpers (18bb4df , #19166 , #19255 )
Added dispatch_now()
helper (#18668 , 61f2e7b )
Added $language
parameter to str_slug()
helper (#19011 )
Added str_before()
helper (#19940 , #20049 )
Added now()
and today()
helpers (3c888b6 , #20716 )
Added blank()
, filled()
, optional()
and transform()
helpers (06de9b2 , 31308e3 )
Handle lower case words better in as Str::snake()
(#18764 )
Removed usages of the with()
helper (#17888 )
Support multiple patterns in Str::is()
(#20108 )
Speed up Arr::get()
calls without dot notations (#20139 )
Use report()
helper in mix()
(#20603 , bf0cb82 )
Localization
⚠️ Moved LoaderInterface
to contracts (#20460 )
⚠️ Support loading JSON translation for packages (#20599 , 573f85c )
Support language specific characters in Str
(#18974 , #19694 )
Mail
Allow mailables to be rendered directly to views (d9a6dfa )
Allow for per-mailable theme configuration (b2c35ca )
⚠️ Removed $data
and $callback
parameters from Mailer
and MailQueue
⚠️ Made Markdown
a dependency of MailChannel
(#19349 )
⚠️ Upgraded to SwiftMailer 6 (#19356 )
⚠️ Added to()
and bcc()
to Mailer
contract (#19955 )
Notifications
Added methods for Slack's thumb_url
and unfurl_*
options (#19150 , #19200 )
Support sending notifications via AnonymousNotifiable
(#19998 , ba82579 )
Accept other types on SlackAttachment::timestamp()
(#20671 )
Queues
Added support for chainable jobs (81bcb03 , too many follow-up commits, sorry )
⚠️ Removed redundant $queue
parameter from Queue::createPayload()
(#17948 )
Made all getQueue()
methods public
(#18501 )
Pass connection and queue to Looping
event (#19081 )
⚠️ Clone Job specific properties (#19123 )
⚠️ Declare missing abstract Job::getRawBody()
method (#19677 )
⚠️ Fail (or optionally silently delete) job when model is missing during deserialization (44b1f85 , bceded6 )
Added CallQueuedListener::__clone()
method (#20022 )
Accept DatetimeInterface
and DateInterval
in queue (#20102 , 92e2aff )
⚠️ Use dispatch()
instead of fire()
(#20446 )
Removed reserved_at
index from jobs table stub (#20702 )
Support job expiration (#20776 , 1592b9b )
Redis
Requests
⚠️ Made Request::has()
work like Collection::has()
(#18715 )
Added Request::filled()
(#18715 )
⚠️ Made Request::only()
work like Collection::only()
(#18695 )
Aliased Request::exists()
to Request::has()
(183bf16 )
Allow passing keys to Request::all()
to behave like old Request::only()
(#18754 )
⚠️ Removed Request::intersect()
(#18695 )
Return request data from ValidatesRequests
calls (#19033 )
Added a validate()
macro onto Request
(#19063 )
Added FormRequest::validated()
method (#19112 )
⚠️ Made request()
helper and Request::__get()
consistent (a6ff272 )
Made Request::routeIs()
work like Request()::fullUrlIs()
(#19267 , bfc5321 , #19334 )
Added Request::hasAny()
method (#19367 )
⚠️ Throw validation exception from ValidatesRequests
without formatting response (#19929 , 6d33675 , ec88362 , c264807 )
Added Request::post()
method (#20238 )
Added Request::keys()
method (#20611 )
Routing
Support fluent resource options (#18767 , bb02fb2 )
Support multiple values in Router::has()
(#18758 )
⚠️ Bind empty optional route parameter to null
instead of empty model instance (#17521 )
Accept patterns on Route::named()
, Router::is()
and Router::currentRouteNamed()
(#19267 , bfc5321 )
Added domain()
setter/getter to Route
(#19245 , bba04a1 )
Added Route::redirect()
method (#19794 )
Added Route::view()
method (#19835 )
⚠️ Improved ThrottleRequests
middleware (#19807 , #19860 )
⚠️ Return proper 304 responses (#19867 )
Return the resource from Router::apiResource()
(#20029 )
⚠️ Moved route model binding resolution logic to model (#20521 , 370e626 , #20542 , #20618 , d911fa8 )
Accept string on parameters()
and names()
methods (#20531 , #20529 )
Handle HEAD
requests in Router::view()
(#20672 )
Added ThrottleRequestsWithRedis
middleware (#20761 , 0a10f9a )
Responses
⚠️ Ensure Arrayable
and Jsonable
return a JsonResponse
(#17875 )
⚠️ Ensure Arrayable
objects are also morphed by Response
(#17868 )
Added SameSite
support to CookieJar
(#18040 , #18059 , e69d722 )
Accept HeaderBag
in ResponseTrait::withHeaders()
(#18161 )
⚠️ Reset response content-type in Response::setContent()
(#18314 , #20313 )
⚠️ Always retrieve the real original content (#20002 )
Service Container
⚠️ Refactored Container
(#19201 )
⚠️ Made container PSR-11 compliant (#19822 , a6068b0 , 66325c2 )
Return the bound instance from Container::instance()
(#19442 )
⚠️ Use instance instead of deferred service provider (#20714 )
Session
⚠️ Default value to true
in Store::flash()
(#18136 )
⚠️ Store the user password hash when logging in (#19843 )
⚠️ Throw UnauthorizedHttpException
from failedBasicResponse
(#20673 )
Support
Autoload package providers (#19420 , a5a0f3e , 2954091 , #19455 , #19561 , #19646 )
Added support for Responsable
objects (c0c89fd , 1229b7f , #19614 , ef0e37d )
Made Carbon
macroable and serializeable (#19771 , #20568 , 6a18209 )
Support registering macros using classes (#19782 , 353adbd )
⚠️ Moved InteractsWithTime
to Illuminate\Support
(#20119 , #20206 )
Support callable/invokable objects in Pipeline
(#18264 )
⚠️ Prevent access to protected properties using array access on Model
and Fluent
(#18403 )
⚠️ Extend MessageBag
interface from Arrayable
and add getMessages()
method (#19768 , #20334 )
Handle Arrayable
items in MessageBag
(6f1f4d8 )
Added isNotEmpty()
method to message bags and paginators (#19944 )
Return the collection iterator from AbstractPaginator::getIterator()
(#20098 )
⚠️ Fixed minimum value of paginator last_page
field (#20335 )
Task Scheduling
Fire before callbacks on closure-based scheduling events (#18861 )
Run after-callbacks even if a callback event failed (#19573 )
⚠️ Fixed bug in quarterly()
method (#19600 )
⚠️ Support passing boolean into when()
and skip()
(1d1a96e )
Testing
⚠️ Switched to PHPUnit 6 (#17755 , #17864 )
⚠️ Renamed authentication assertion methods (#17924 , 494a177 )
⚠️ Unify database testing traits into RefreshDatabase
trait (79c6f67 , 0322e32 , #20308 )
⚠️ Changed Blade tests namespace to Illuminate\Tests\View\Blade
(#19675 )
Added integration tests for the framework itself (182027d , #18438 , #18780 , #19001 , #20073 )
Allow disabling of specific middleware (#18673 )
Added withoutExceptionHandling()
method (a171f44 )
Support inline eloquent factory states (#19060 )
Allow assertSessionHasErrors()
to look into different error bags (#19172 , 4287ebc )
Ensure Redis is available in cache lock tests (#19791 )
Skip tests if Memcached is not found (#20018 )
⚠️ Clear Carbon
mock during tear down (#19934 )
Added debug info to NotFoundHttpException
in InteractsWithExceptionHandling
(#20000 )
Added MailFake::assertSentTimes()
, QueueFake::assertPushedTimes()
and BusFake::assertDispatchedTimes()
methods (#20485 , e657f6e )
Added queue assertions to MailFake
(#20454 , #20701 )
Added assertNothingSent()
and assertSentTimes()
methods to NotificationFake
(#20651 )
Added Mockery expectations to the assertion count (#20606 )
Fake the default storage disk by default (#20625 )
Support sending default headers with requests (#20590 , c32418e )
Support disabling of exception handling for specified exceptions (#20729 , 2db9716 )
Validation
Added support for custom validation rule objects (#19155 , 2aa5ea8 )
Validate against DateTimeInterface
instead of DateTime
(#20110 )
⚠️ Made several method in ValidatesAttributes
public (#20200 )
⚠️ Added errors()
method to Validator
interface (#20337 )
Extend Exists
and Unique
rule from DatabaseRule
class (#20563 )
Added whereIn()
and whereNotIn()
constraints to DatabaseRule
(#20691 , #20739 , 52d28e3 )
Added date_equals
rule (#20646 )
Views
⚠️ Camel case variables names passed to views (#18083 )
Added pagination template for Semantic UI (#18463 )
Allow easier ViewFactory
overriding (#20205 , 56f103c )
Added View::first()
(#20695 , f18318b )
You can’t perform that action at this time.