我有一个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')
试了一下,仍然没有发生任何事情。我在扩展控制器中的构造函数不起作用。
请帮助,我做错了什么?
答案 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
}
}