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

namespace IlluminateRouting;

use 
IlluminateHttpRequest;
use 
IlluminateSupportCollection;
use 
IlluminateContainerContainer;

class 
ControllerDispatcher
{
    use 
RouteDependencyResolverTrait;

    
/**
     * The router instance.
     *
     * @var IlluminateRoutingRouter
     */
    
protected $router;

    
/**
     * The IoC container instance.
     *
     * @var IlluminateContainerContainer
     */
    
protected $container;

    
/**
     * Create a new controller dispatcher instance.
     *
     * @param  IlluminateRoutingRouter  $router
     * @param  IlluminateContainerContainer  $container
     * @return void
     */
    
public function __construct(Router $router,
                                
Container $container = null)
    {
        
$this->router = $router;
        
$this->container = $container;
    }

    
/**
     * Dispatch a request to a given controller and method.
     *
     * @param  IlluminateRoutingRoute  $route
     * @param  IlluminateHttpRequest  $request
     * @param  string  $controller
     * @param  string  $method
     * @return mixed
     */
    
public function dispatch(Route $route, Request $request, $controller, $method)
    {
        
$instance = $this->makeController($controller);

        return 
$this->callWithinStack($instance, $route, $request, $method);
    }

    
/**
     * Make a controller instance via the IoC container.
     *
     * @param  string  $controller
     * @return mixed
     */
    
protected function makeController($controller)
    {
        
Controller::setRouter($this->router);

        return 
$this->container->make($controller);
    }

    
/**
     * Call the given controller instance method.
     *
     * @param  IlluminateRoutingController  $instance
     * @param  IlluminateRoutingRoute  $route
     * @param  IlluminateHttpRequest  $request
     * @param  string  $method
     * @return mixed
     */
    
protected function callWithinStack($instance, $route, $request, $method)
    {
        
$shouldSkipMiddleware = $this->container->bound('middleware.disable') &&
                                
$this->container->make('middleware.disable') === true;

        
$middleware = $shouldSkipMiddleware ? [] : $this->getMiddleware($instance, $method);

        
// Here we will make a stack onion instance to execute this request in, which gives
        // us the ability to define middlewares on controllers. We will return the given
        // response back out so that "after" filters can be run after the middlewares.
        
return (new Pipeline($this->container))
                    ->
send($request)
                    ->
through($middleware)
                    ->
then(function ($request) use ($instance, $route, $method) {
                        return 
$this->router->prepareResponse(
                            
$request, $this->call($instance, $route, $method)
                        );
                    });
    }

    
/**
     * Get the middleware for the controller instance.
     *
     * @param  IlluminateRoutingController  $instance
     * @param  string  $method
     * @return array
     */
    
protected function getMiddleware($instance, $method)
    {
        
$results = new Collection;

        foreach (
$instance->getMiddleware() as $name => $options) {
            if (! 
$this->methodExcludedByOptions($method, $options)) {
                
$results[] = $this->router->resolveMiddlewareClassName($name);
            }
        }

        return 
$results->flatten()->all();
    }

    
/**
     * Determine if the given options exclude a particular method.
     *
     * @param  string  $method
     * @param  array  $options
     * @return bool
     */
    
public function methodExcludedByOptions($method, array $options)
    {
        return (isset(
$options['only']) && ! in_array($method, (array) $options['only'])) ||
            (! empty(
$options['except']) && in_array($method, (array) $options['except']));
    }

    
/**
     * Call the given controller instance method.
     *
     * @param  IlluminateRoutingController  $instance
     * @param  IlluminateRoutingRoute  $route
     * @param  string  $method
     * @return mixed
     */
    
protected function call($instance, $route, $method)
    {
        
$parameters = $this->resolveClassMethodDependencies(
            
$route->parametersWithoutNulls(), $instance, $method
        
);

        return 
$instance->callAction($method, $parameters);
    }
}
Онлайн: 2
Реклама