Вход Регистрация
Файл: vendor/laravel/framework/src/Illuminate/Collections/Traits/TransformsToResourceCollection.php
Строк: 136
<?php

namespace IlluminateSupportTraits;

use 
IlluminateDatabaseEloquentAttributesUseResource;
use 
IlluminateDatabaseEloquentAttributesUseResourceCollection;
use 
IlluminateDatabaseEloquentModel;
use 
IlluminateHttpResourcesJsonResourceCollection;
use 
LogicException;
use 
ReflectionClass;

trait 
TransformsToResourceCollection
{
    
/**
     * Create a new resource collection instance for the given resource.
     *
     * @param  class-string<IlluminateHttpResourcesJsonJsonResource>|null  $resourceClass
     * @return IlluminateHttpResourcesJsonResourceCollection
     *
     * @throws Throwable
     */
    
public function toResourceCollection(?string $resourceClass null): ResourceCollection
    
{
        if (
$resourceClass === null) {
            return 
$this->guessResourceCollection();
        }

        return 
$resourceClass::collection($this);
    }

    
/**
     * Guess the resource collection for the items.
     *
     * @return IlluminateHttpResourcesJsonResourceCollection
     *
     * @throws Throwable
     */
    
protected function guessResourceCollection(): ResourceCollection
    
{
        if (
$this->isEmpty()) {
            return new 
ResourceCollection($this);
        }

        
$model $this->items[0] ?? null;

        
throw_unless(is_object($model), LogicException::class, 'Resource collection guesser expects the collection to contain objects.');

        
/** @var class-string<Model> $className */
        
$className get_class($model);

        
throw_unless(method_exists($className'guessResourceName'), LogicException::class, sprintf('Expected class %s to implement guessResourceName method. Make sure the model uses the TransformsToResource trait.'$className));

        
$useResourceCollection $this->resolveResourceCollectionFromAttribute($className);

        if (
$useResourceCollection !== null && class_exists($useResourceCollection)) {
            return new 
$useResourceCollection($this);
        }

        
$useResource $this->resolveResourceFromAttribute($className);

        if (
$useResource !== null && class_exists($useResource)) {
            return 
$useResource::collection($this);
        }

        
$resourceClasses $className::guessResourceName();

        foreach (
$resourceClasses as $resourceClass) {
            
$resourceCollection $resourceClass.'Collection';

            if (
is_string($resourceCollection) && class_exists($resourceCollection)) {
                return new 
$resourceCollection($this);
            }
        }

        foreach (
$resourceClasses as $resourceClass) {
            if (
is_string($resourceClass) && class_exists($resourceClass)) {
                return 
$resourceClass::collection($this);
            }
        }

        throw new 
LogicException(sprintf('Failed to find resource class for model [%s].'$className));
    }

    
/**
     * Get the resource class from the class attribute.
     *
     * @param  class-string<IlluminateHttpResourcesJsonJsonResource>  $class
     * @return class-string<*>|null
     */
    
protected function resolveResourceFromAttribute(string $class): ?string
    
{
        if (! 
class_exists($class)) {
            return 
null;
        }

        
$attributes = (new ReflectionClass($class))->getAttributes(UseResource::class);

        return 
$attributes !== []
            ? 
$attributes[0]->newInstance()->class
            
null;
    }

    
/**
     * Get the resource collection class from the class attribute.
     *
     * @param  class-string<IlluminateHttpResourcesJsonResourceCollection>  $class
     * @return class-string<*>|null
     */
    
protected function resolveResourceCollectionFromAttribute(string $class): ?string
    
{
        if (! 
class_exists($class)) {
            return 
null;
        }

        
$attributes = (new ReflectionClass($class))->getAttributes(UseResourceCollection::class);

        return 
$attributes !== []
            ? 
$attributes[0]->newInstance()->class
            
null;
    }
}
Онлайн: 3
Реклама