Защищенные методы доступны для наследования классов, маршрутизатор пытается запустить действие контроллера в 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
функцию, потому что она является приватной для родительского класса
Надеюсь, это поможет