Phalcon 3.4: внедрение компонента в действие контроллера без использования событий диспетчера - PullRequest
0 голосов
/ 18 марта 2020

Я пытаюсь использовать laravel способ внедрения компонента в действие контроллера, см. Этот пример из laravel:

class UserController extends Controller {

    /**
     * Store a new user.
     *
     * @param  Request  $request
     * @return Response
     */
    public function store(Request $request)
    {
        $name = $request->input('name');

        //
    }
}

Они используют что-то, называемое «контейнером службы», для разрешения параметров действия. , это применимо в Phalcon?

Я пытался сделать это вручную, но безуспешно!

Мне нужна эта функциональность, чтобы не определять каждый компонент как службу в Phalcon DI.

1 Ответ

0 голосов
/ 20 марта 2020

Я пришел с решением, описанным в документации Phalcon, но с некоторыми изменениями, чтобы соответствовать моим потребностям.

Решение, с которым я пришел, заключается в добавлении нового слушателя диспетчерских событий в контейнер обслуживания для обработки зависимостей действий, пример:

$di->setShared('dispatcher', function() {
    $evManager->attach("dispatch:beforeDispatch", function (Event $event, Dispatcher $dispatcher) {
        try {
            $methodReflection = new ReflectionMethod(
                $dispatcher->getControllerClass(),
                $dispatcher->getActiveMethod()
            );
            foreach ($methodReflection->getParameters() as $parameter) {
                $parameterClass = $parameter->getClass();
                if ($parameterClass instanceof ReflectionClass) {
                    $dispatcher->setParam($parameter->name, new $parameterClass->name);
                }
            }
        } catch (Exception $exception) {
            throw new \Exception('', Dispatcher::EXCEPTION_HANDLER_NOT_FOUND);
        }
    });
    $dispatcher = new Dispatcher();
    $dispatcher->setEventsManager($evManager);
    return $dispatcher;
}

Каждый фреймворк имеет свой собственный механизм, поэтому, если вам нужно сделать что-то особенное, вы должны сделать это вручную.

...