Почему Защищенные методы в контроллере могут быть вызваны как обработчик маршрута - PullRequest
0 голосов
/ 27 октября 2019

Каким образом защищенная функция видна маршрутизатору в инфраструктуре laravel?

// I have a route like this
Route::get('/bar', 'FooController@bar');

// Methods like this both work fine
public function bar() {...}
protected function bar() {...}

// But this fails 
private function bar() {...}

Создание экземпляра контроллера и затем защищенный вызванный методчерез заднюю дверь не кажется правильным. !!!!

1 Ответ

0 голосов
/ 27 октября 2019

Защищенные методы доступны для наследования классов, маршрутизатор пытается запустить действие контроллера в vendor/laravel/framework/src/Illuminate/Routing/Route.php Строка 219

protected function runController()
{
    return $this->controllerDispatcher()->dispatch(
        $this,
        $this->getController(),
        $this->getControllerMethod()
    );
}

И получает экземпляр, используя getController метод

public function getController()
{
    if (!$this->controller) {
        $class = $this->parseControllerCallback()[0];

        $this->controller = $this->container->make(ltrim($class, '\\'));
    }

    return $this->controller;
}

И установите для этого класса PUBLIC свойство

/**
 * The controller instance.
 *
 * @var mixed
 */
public $controller;

Таким образом, любые открытые или защищенные методы доступны для маршрутизатора по логике наследования

FooController extends App\Http\Controllers\Controller, расширяющий абстрактный класс Illuminate\Routing\Controller, вызывающий здесь действие

public function callAction($method, $parameters)
{
    return call_user_func_array([$this, $method], $parameters);
}

Дочерний класс может вызывать защищенные методы родительского класса, но не частные

Вот простой базовыйпример

<?php

class parenting
{
  private function hello()
  {
    echo "private";
  }
  protected function secret()
  {
    echo "protected";
  }
}

class child extends parenting
{
  public function foo()
  {
    // $this->hello(); // <--- Uncomment to get undefined method error 
    $this->secret();
  }
}

$child = new child();
$child->foo();

Вы не можете вызвать hello функцию, потому что она является приватной для родительского класса

Надеюсь, это поможет

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...