7

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?

1

3 Answers 3

12

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.*',
),
Sign up to request clarification or add additional context in comments.

3 Comments

The idea of sharing static functions across controllers in a controller is evil. That's what components are for.
Yes, I would use a component, or have both controllers extend a base class that has the function you want both of them to call. You could even attach this function with a Behavior: yiiframework.com/doc/guide/1.1/en/…
can you please tell me which version of codeignitor you are using?
4
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

1 Comment

i get the following error Missing argument 1 for CController::__construct(), called in
2

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.

1 Comment

Yes, I think this or a variation (creating another controller class with this function, and extending that one) is the way to go. Also, a behavior might do what you need, by attaching the function: Yes, I would use a component, or have both controllers extend a base class that has the function you want both of them to call. You could even attach this function with a Behavior: yiiframework.com/doc/guide/1.1/en/…

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.