ICanBoogie/Routing 2.5.x
  • Namespace
  • Class

Namespaces

  • ICanBoogie
    • Routing
      • Controller
      • Route
      • RouteDispatcher

Classes

  • ActionEvent
  • BeforeActionEvent

Traits

  • ActionTrait
  • ResourceTrait
  1   2   3   4   5   6   7   8   9  10  11  12  13  14  15  16  17  18  19  20  21  22  23  24  25  26  27  28  29  30  31  32  33  34  35  36  37  38  39  40  41  42  43  44  45  46  47  48  49  50  51  52  53  54  55  56  57  58  59  60  61  62  63  64  65  66  67  68  69  70  71  72  73  74  75  76  77  78  79  80  81  82  83  84  85  86  87  88  89  90  91  92  93  94  95  96  97  98  99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 
<?php

/*
 * This file is part of the ICanBoogie package.
 *
 * (c) Olivier Laviale <olivier.laviale@gmail.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace ICanBoogie\Routing\Controller;

use ICanBoogie\HTTP\Request;
use ICanBoogie\Routing\ActionNotDefined;
use ICanBoogie\Routing\Route;

/**
 * Action controller implementation.
 *
 * @property-read Route $route
 * @property-read string $action The action being executed.
 */
trait ActionTrait
{
    /**
     * Returns the action being executed.
     *
     * @return string
     */
    protected function get_action()
    {
        return $this->route->action;
    }

    /**
     * Dispatch the request to the appropriate method.
     *
     * The {@link $request} property is initialized.
     *
     * @param Request $request
     *
     * @return \ICanBoogie\HTTP\Response|mixed
     */
    protected function action(Request $request)
    {
        $callable = $this->resolve_action($request);

        return $callable();
    }

    /**
     * Whether the action has a direct method match.
     *
     * @param string $action
     *
     * @return bool `true` if the action has a direct method match, `false` otherwise.
     */
    protected function is_action_method($action)
    {
        return false;
    }

    /**
     * Resolves the action into a callable.
     *
     * @param Request $request
     *
     * @return callable
     */
    protected function resolve_action(Request $request)
    {
        $action = $this->action;

        if (!$action)
        {
            throw new ActionNotDefined("Action not defined in route {$this->route->id}.");
        }

        $method = $this->resolve_action_method($action, $request);
        $args = $this->resolve_action_args($action, $request);

        return function() use ($method, $args)
        {
            return call_user_func_array([ $this, $method ], $args);
        };
    }

    /**
     * Resolves the method associated with the action.
     *
     * @param string $action Action name.
     * @param Request $request
     *
     * @return string The method name.
     */
    protected function resolve_action_method($action, Request $request)
    {
        $action = strtr($action, '-', '_');

        if ($this->is_action_method($action))
        {
            return $action;
        }

        $method = 'action_' . strtolower($request->method) . '_' . $action;

        if (method_exists($this, $method))
        {
            return $method;
        }

        $method = 'action_any_' . $action;

        if (method_exists($this, $method))
        {
            return $method;
        }

        return $method = 'action_' . $action;
    }

    /**
     * Resolves the arguments associated with the action.
     *
     * @param string $action Action name.
     * @param Request $request
     *
     * @return array The arguments for the action.
     */
    protected function resolve_action_args($action, Request $request)
    {
        return $request->path_params;
    }
}
ICanBoogie/Routing 2.5.x API documentation generated by ApiGen