我已经阅读了许多消息来源,暗示laravel facade最终是为了方便而存在,而且应该注入这些类以允许松散耦合.甚至Taylor Otwell也有一篇文章解释了如何做到这一点.似乎我不是唯一一个想到这一点的人.
use Redirect;
class Example class
{
public function example()
{
return Redirect::route("route.name");
}
}
Run Code Online (Sandbox Code Playgroud)
会成为
use Illuminate\Routing\Redirector as Redirect;
class Example class
{
protected $redirect;
public function __constructor(Redirect $redirect)
{
$this->redirect = $redirect
}
public function example()
{
return $this->redirect->route("route.name");
}
}
Run Code Online (Sandbox Code Playgroud)
这很好,除了我开始发现一些构造函数和方法开始采用四个+参数.
由于Laravel IoC 似乎只注入类构造函数和某些方法(控制器),即使我有相当精益的函数和类,我发现类的构造函数正在填充所需的类,然后将其注入到需要的方法.
现在我发现如果我继续这种方法,我将需要自己的IoC容器,如果我使用像laravel这样的框架,感觉就像重新发明轮子一样?
例如,我使用服务来控制业务/视图逻辑而不是处理它们的控制器 - 它们只是路由视图.所以控制器首先取其对应的service
,然后是parameter
其url.一个服务功能还需要检查表单中的值,因此我需要Request
和Validator
.就像那样,我有四个参数.
// MyServiceInterface is binded using the laravel container
use Interfaces\MyServiceInterface;
use Illuminate\Http\Request; …
Run Code Online (Sandbox Code Playgroud) 基于Input Facade API和Request Facade API,Input :: get()方法似乎是唯一的区别.我在这里错过了什么吗?
我知道验证可以应用于请求,但我不确定输入外观是否也是如此.
什么,我之前已经做是注射使用构造只有我的模型,并使用外墙为Laravel的提供的类,即Session
,Auth
,Validator
等等,例如.如果我通过构造注入每个类(我的或Laravel的)并通过$this->..
语法使用它或者我应该使用构造函数注入我自己的类并使用Facade来完成Laravel提供的任何事情,这是一个好主意吗?
更具体地说,这是我的控制器通常的样子:
class MyController extends BaseController
{
public function __construct( User $user, Bookmark $bookmark ) {
$this->user = $user;
$this->bookmark = $bookmark
}
public function foobar ( ) {
$user_id = Input::get('bar');
...
Session::get('someInfo');
...
return Redirect::to('/');
}
...
}
Run Code Online (Sandbox Code Playgroud)
我应该像控制器那样构建我的方法,而不是吗?
class MyController extends BaseController
{
public function __construct( User $user, Bookmark $bookmark, Input $input, Session $session, Redirect $redirect ) …
Run Code Online (Sandbox Code Playgroud) 我想覆盖Laravels的Mail的类Facade方法发送(只是拦截它强制一些检查然后如果它通过触发parent :: send())
做这个的最好方式是什么?
我想知道在laravel 5.1中使用Facades和helper方法之间是否存在性能差异.
我首先要删除,use View;
或者View::make()
尽可能地删除,认为这view()
会更简单,也可能更快.但我不知道.
与Redirect::to()
- > redirect()
,Redirect::back()
- > back()
等相同..
是否存在差异或无关紧要?
我在我的应用程序中使用Laravel Log Facade。我有几个服务,如 Mandrill、Twilio、Stripe 等,需要记录在单独的文件中。但是当我使用 Log::useFiles() 为服务包装类之一设置单独的文件时,如下所示:
Class Mailer
{
static function init()
{
Log::useFiles(storage_path('logs/mandrill-'.date("Y-m-d").'.log'));
}
static function send()
{
// some code here...
Log::error("Email not sent");
}
}
Run Code Online (Sandbox Code Playgroud)
我最终将日志写入 Laravel 日志文件和 Mandrill 日志文件中。
有没有办法告诉Log只将日志写入一个文件?
它这样做通常很奇怪,因为当我直接使用Monolog时,它只写入一个文件,正如它应该的那样。据我所知 Log Facade 使用的是 Monolog。
我发现理解 Facades 有点困难。特别是如何从外观名称中找到底层类名称/位置。我已经阅读了文档,但仍然不清楚。比如在使用的时候Auth::login()
,发现Auth Facade里面没有login()
方法。
class Auth extends Facade
{
/**
* Get the registered name of the component.
*
* @return string
*/
protected static function getFacadeAccessor()
{
return 'auth';
}
/**
* Register the typical authentication routes for an application.
*
* @return void
*/
public static function routes()
{
static::$app->make('router')->auth();
}
}
Run Code Online (Sandbox Code Playgroud)
该验证外墙getFacadeAccessor()
方法返回一个字符串权威性。但是auth
我应该看哪个班级?如何解析实际的类?
谢谢,
在 Laravel 中使用实时门面时,VSCode 似乎不提供智能感知或自动完成。即使使用像 PHP Intelliphense 这样的流行插件,我也无法让它工作。但是,当我正常导入类时,它工作得很好。
例如,这没有智能感知/自动完成功能:
use Facades\App\User;
User::auth();
Run Code Online (Sandbox Code Playgroud)
但这确实:
use App\User;
User::auth();
Run Code Online (Sandbox Code Playgroud)
我觉得这一定是一个常见问题,因为 Facades 是 Laravel 的核心概念。有谁知道这个问题的解决方法或解决方案?
我查看了针对类似问题提出的几个答案,但对我的案例没有任何作用。仅供参考,这是我在 Laravel 7 中的第一个项目,在我的 Mac 上运行良好。我已按照本文在我的服务器上部署了该项目。在网络上运行该项目时,出现以下错误:
致命错误:未捕获运行时异常:尚未设置外观根。在 /usr/www/users/utopiqwvpw/vendor/laravel/framework/src/Illuminate/Support/Facades/Facade.php:258
堆栈跟踪:#0 /usr/www/users/utopiqwvpw/vendor/laravel/framework/src/Illuminate/Foundation/Exceptions/Handler.php(425): Illuminate\Support\Facades\Facade::__callStatic('replaceNamespac.. .', 数组) #1 /usr/www/users/utopiqwvpw/vendor/laravel/framework/src/Illuminate/Foundation/Exceptions/Handler.php(402): Illuminate\Foundation\Exceptions\Handler->registerErrorViewPaths() # 2 /usr/www/users/utopiqwvpw/vendor/laravel/framework/src/Illuminate/Foundation/Exceptions/Handler.php(313): Illuminate\Foundation\Exceptions\Handler->renderHttpException(Object(Symfony\Component\HttpKernel\)异常\HttpException))#3 /usr/www/users/utopiqwvpw/vendor/laravel/framework/src/Illuminate/Foundation/Exceptions/Handler.php(210):照亮\Foundation\Exceptions\Handler->prepareResponse(对象( Illuminate\Http\Request), Object(Symfony\Component\HttpKernel\Exception\HttpExcepti in /usr/www/users/utopiqwvpw/vendor/laravel/framework/src/Illuminate/Support/Facades/Facade.php 第 258 行
我该如何修复它?
deployment runtimeexception composer-php laravel-facade laravel-7
laravel-facade ×10
laravel ×7
php ×6
laravel-5 ×2
autocomplete ×1
composer-php ×1
deployment ×1
laravel-7 ×1
logging ×1
monolog ×1
performance ×1
phpstorm ×1