Subversion-Projekte lars-tiefland.laravel_shop

Revision

Details | Letzte Änderung | Log anzeigen | RSS feed

Revision Autor Zeilennr. Zeile
148 lars 1
<?php
2
 
3
namespace Illuminate\Routing;
4
 
5
use Illuminate\Contracts\Routing\UrlRoutable;
6
use Illuminate\Database\Eloquent\ModelNotFoundException;
7
use Illuminate\Database\Eloquent\SoftDeletes;
8
use Illuminate\Routing\Exceptions\BackedEnumCaseNotFoundException;
9
use Illuminate\Support\Reflector;
10
use Illuminate\Support\Str;
11
 
12
class ImplicitRouteBinding
13
{
14
    /**
15
     * Resolve the implicit route bindings for the given route.
16
     *
17
     * @param  \Illuminate\Container\Container  $container
18
     * @param  \Illuminate\Routing\Route  $route
19
     * @return void
20
     *
21
     * @throws \Illuminate\Database\Eloquent\ModelNotFoundException<\Illuminate\Database\Eloquent\Model>
22
     * @throws \Illuminate\Routing\Exceptions\BackedEnumCaseNotFoundException
23
     */
24
    public static function resolveForRoute($container, $route)
25
    {
26
        $parameters = $route->parameters();
27
 
28
        $route = static::resolveBackedEnumsForRoute($route, $parameters);
29
 
30
        foreach ($route->signatureParameters(['subClass' => UrlRoutable::class]) as $parameter) {
31
            if (! $parameterName = static::getParameterName($parameter->getName(), $parameters)) {
32
                continue;
33
            }
34
 
35
            $parameterValue = $parameters[$parameterName];
36
 
37
            if ($parameterValue instanceof UrlRoutable) {
38
                continue;
39
            }
40
 
41
            $instance = $container->make(Reflector::getParameterClassName($parameter));
42
 
43
            $parent = $route->parentOfParameter($parameterName);
44
 
45
            $routeBindingMethod = $route->allowsTrashedBindings() && in_array(SoftDeletes::class, class_uses_recursive($instance))
46
                        ? 'resolveSoftDeletableRouteBinding'
47
                        : 'resolveRouteBinding';
48
 
49
            if ($parent instanceof UrlRoutable &&
50
                ! $route->preventsScopedBindings() &&
51
                ($route->enforcesScopedBindings() || array_key_exists($parameterName, $route->bindingFields()))) {
52
                $childRouteBindingMethod = $route->allowsTrashedBindings() && in_array(SoftDeletes::class, class_uses_recursive($instance))
53
                            ? 'resolveSoftDeletableChildRouteBinding'
54
                            : 'resolveChildRouteBinding';
55
 
56
                if (! $model = $parent->{$childRouteBindingMethod}(
57
                    $parameterName, $parameterValue, $route->bindingFieldFor($parameterName)
58
                )) {
59
                    throw (new ModelNotFoundException)->setModel(get_class($instance), [$parameterValue]);
60
                }
61
            } elseif (! $model = $instance->{$routeBindingMethod}($parameterValue, $route->bindingFieldFor($parameterName))) {
62
                throw (new ModelNotFoundException)->setModel(get_class($instance), [$parameterValue]);
63
            }
64
 
65
            $route->setParameter($parameterName, $model);
66
        }
67
    }
68
 
69
    /**
70
     * Resolve the Backed Enums route bindings for the route.
71
     *
72
     * @param  \Illuminate\Routing\Route  $route
73
     * @param  array  $parameters
74
     * @return \Illuminate\Routing\Route
75
     *
76
     * @throws \Illuminate\Routing\Exceptions\BackedEnumCaseNotFoundException
77
     */
78
    protected static function resolveBackedEnumsForRoute($route, $parameters)
79
    {
80
        foreach ($route->signatureParameters(['backedEnum' => true]) as $parameter) {
81
            if (! $parameterName = static::getParameterName($parameter->getName(), $parameters)) {
82
                continue;
83
            }
84
 
85
            $parameterValue = $parameters[$parameterName];
86
 
87
            $backedEnumClass = (string) $parameter->getType();
88
 
89
            $backedEnum = $backedEnumClass::tryFrom((string) $parameterValue);
90
 
91
            if (is_null($backedEnum)) {
92
                throw new BackedEnumCaseNotFoundException($backedEnumClass, $parameterValue);
93
            }
94
 
95
            $route->setParameter($parameterName, $backedEnum);
96
        }
97
 
98
        return $route;
99
    }
100
 
101
    /**
102
     * Return the parameter name if it exists in the given parameters.
103
     *
104
     * @param  string  $name
105
     * @param  array  $parameters
106
     * @return string|null
107
     */
108
    protected static function getParameterName($name, $parameters)
109
    {
110
        if (array_key_exists($name, $parameters)) {
111
            return $name;
112
        }
113
 
114
        if (array_key_exists($snakedName = Str::snake($name), $parameters)) {
115
            return $snakedName;
116
        }
117
    }
118
}