简体   繁体   中英

Call function in another controller in Yii

I've created 2 controllers in my Yii application: FirstController.php and SecondController.php in default controller path.

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();
  }
}

When I try to execute exampleFunc() in SecondController, Yii throw the error:

YiiBase::include(FirstController.php) [<a href='function.YiiBase-include'>function.YiiBase-include</a>]: failed to open stream: No such file or directory

Calling FirstController::returnFunc() similarly don't work.

I'm newbee in OOP and Yii framework. What's the problem?

I've solved this problem. The autoloader doesn't load controllers.

It was in config/main.php :

'import' => array(
    'application.models.*',
    'application.components.*',
),

All work with this:

'import' => array(
    'application.models.*',
    'application.components.*',
    'application.controllers.*',
),
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

When you create a Yii project, each of your controllers extend the Controller class, and that class extends the built in Yii class CController.

This is nice because Controller is a class within your application (it can be found in the components folder).

If you want a method to be accessible by both of your controllers, put that method in the Controller class, and since they both extend it. They'll both have access. Just make sure to declare it either public or protected.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM