Laravel Controller的构造函数不运行

时间:2018-04-05 08:00:44

标签: php laravel constructor

我有一个Laravel网络应用程序,其中我的每个其他控制器都有一个“父”控制器。我以这种方式构建逻辑,因为数据库由在线SOAP服务提供支持。

我的父控制器的构造函数如下所示:

<?php
namespace App\Http\Controllers;

use Illuminate\Http\Request;
use Illuminate\Support\Facades\Lang;
use SoapClient;
use Session;

class SoapCtrl extends Controller
{
    public $client;
    public function __construct(Request $request) {
        // SoapClient
        $wsdl = '******';
        $args = [
            'trace' => true,
            'exceptions' => true,
            'soap_version' => SOAP_1_2,
            'cache_wsdl' => WSDL_CACHE_NONE,
        ];
        $this->client = new SoapClient($wsdl, $args);
    }
}

我有很多其他控制器扩展这个SoapCtrl,例如这个:

<?php
namespace App\Http\Controllers;

use Illuminate\Http\Request;
use Illuminate\Support\Facades\Lang;
use SoapClient;
use Session;

class MagistralCtrl extends SoapCtrl {

    public function __construct(Request $request) {
        parent::__construct($request);
        if(!parent::loggedin()) {
            return '';
        }
        if(!parent::have_right('magisztralis')) {
            return view('nopermission', $this->args);
        }
    }
}

他们都可以在视图的函数中使用$this->client->anySoapMethod,因此看起来client是继承的并且有效。但__construct函数不运行。我用die('hello')试了一下,仍然没有发生任何事情。我在扩展控制器中的构造函数不起作用。

请帮助,我做错了什么?

2 个答案:

答案 0 :(得分:0)

Laravel控制器构造函数在任何中间件之前执行,所以还没有用户。

另一件事是扩展控制器是不好的做法,你正在创造上帝的对象。在我看来,你应该为SOAP请求创建一个服务,而不是添加到父控制器并扩展它。

<?php

class SoapCtrl
{
    /**
     * @var SoapClient
     */
    private $client;

    public function __construct()
    {
        $wsdl = '******';
        $args = [
            'trace' => true,
            'exceptions' => true,
            'soap_version' => SOAP_1_2,
            'cache_wsdl' => WSDL_CACHE_NONE,
        ];
        $this->client = new SoapClient($wsdl, $args);
    }

    /**
     * @return SoapClient
     */
    public function getClient()
    {
        return $this->client;
    }
}



class MagistralCtrl extends Controller
{
    public function myMethod(SoapCtrl $soapCtrl)
    {
        $soapClient = $soapCtrl->getClient();

    }
}

答案 1 :(得分:0)

感谢shivanshu我找到了解决方案。默认情况下,Laravel使用Controller类作为控制器,在正常情况下,你总是将它与你的一起扩展。

但是,如果你想扩展另一个控制器,你仍然需要这个控制器来让你的构造函数(可能还有其他东西)正确执行。我需要始终use这个默认控制器。

所以解决方案很简单,将use App\Http\Controllers\Controller;放在文件的顶部:

<?php
namespace App\Http\Controllers;

use Illuminate\Http\Request;
use Illuminate\Support\Facades\Lang;
use SoapClient;
use Session;
use App\Http\Controllers\Controller; // You need to add this line to get it work

class MagistralCtrl extends SoapCtrl {

    public function __construct(Request $request) {
        parent::__construct($request);
        die('hello'); // Now prints hello
    }
}