Função de chamada em outro controlador em Yii
Pergunta
Criei 2 controladores no meu aplicativo YII: FirstController.php e SecondController.php no caminho do controlador padrão.
FirstController.php:
<?php
class FirstController extends Controller {
public static function returnFunc() { return 'OK'; }
}
SecondController.php:
<?php
class SecondController extends Controller {
public function exampleFunc() {
$var = First::returnFunc();
}
}
Quando tento executar exampleFunc()
No segundo concorrente, yii joga o erro:
YiiBase::include(FirstController.php) [<a href='function.YiiBase-include'>function.YiiBase-include</a>]: failed to open stream: No such file or directory
Chamando FirstController::returnFunc()
Da mesma forma, não funcione.
Eu sou novato na estrutura OOP e YII. Qual é o problema?
Solução
Eu resolvi esse problema. O Autoloader não carrega controladores.
Estava dentro config/main.php
:
'import' => array(
'application.models.*',
'application.components.*',
),
Tudo funciona com isso:
'import' => array(
'application.models.*',
'application.components.*',
'application.controllers.*',
),
Outras dicas
class ServiceController extends Controller
{
public function actionIndex()
{
Yii::import('application.controllers.back.ConsolidateController'); // ConsolidateController is another controller in back controller folder
echo ConsolidateController::test(); // test is action in ConsolidateController
class ServiceController extends Controller
{
public function actionIndex()
{
Yii::import('application.controllers.back.CservicesController');
$obj =new CservicesController(); // preparing object
echo $obj->test(); exit; // calling method of CservicesController
Quando você cria um projeto YII, cada um dos seus controladores estende a classe do controlador, e essa classe estende o CController de classe YII incorporado.
Isso é bom porque o controlador é uma classe dentro do seu aplicativo (ele pode ser encontrado na pasta Componentes).
Se você deseja que um método seja acessível pelos dois controladores, coloque esse método na classe do controlador e, como os dois o estendem. Ambos terão acesso. Apenas certifique -se de declará -lo público ou protegido.