您的位置:澳门新葡萄京娱乐网站 > 编程知识 > laravel中的一些简单实用功能_php实例_脚本之家

laravel中的一些简单实用功能_php实例_脚本之家

2019-12-22 01:38
DB::table;

更多关于Laravel相关内容感兴趣的读者可查看本站专题:《Laravel框架入门与进阶教程》、《php优秀开发框架总结》、《smarty模板入门基础教程》、《php日期与时间用法总结》、《php面向对象程序设计入门教程》、《php字符串用法总结》、《php mysql数据库操作入门教程》及《php常见数据库操作技巧汇总》

通过源码解析Laravel的依赖注入,源码解析laravel

前言

众所周知,php的框架数不胜数,近几年,一个以优雅著称的框架,渐渐被国内phper所知道,并且开始使用,但是larave有一个很明显的缺点就是,他的文档内容少的可怜。

本文将给大家详细介绍关于Laravel依赖注入的相关内容,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍吧。

在 Laravel 的控制器的构造方法或者成员方法,都可以通过类型约束的方式使用依赖注入,如:

public function store(Request $request)
{
 //TODO
}

这里 $request 参数就使用了类型约束,Request 是一个类:IlluminateHttpRequest,表示参数必须是这个类或子类。

本文通过分析 Laravel 的源码,看为什么方法中不需要传入实例就可以直接使用 Request 呢?只是框架自动帮我们实例化并传参了。

1.路由定义

从源头开始看起,在路由定义文件中定义了这么一个路由:

Route::resource('/role', 'AdminRoleController');

这是一个资源型的路由,Laravel 会自动生成增删改查的路由入口。

图片 1

本文开头的 store 方法就是一个控制器的方法,图中可见路由定义的 Action 也是:AppHttpControllersAdmin[email protected]

路由方法解析

根据路由定义找到控制器和方法,执行具体的方法在 dispatch 方法中实现。

(文件:vendor/laravel/framework/src/Illuminate/Routing/ControllerDispatcher.php)

public function dispatch(Route $route, $controller, $method)
{
 $parameters = $this->resolveClassMethodDependencies(
  $route->parametersWithoutNulls(), $controller, $method
 );

 if (method_exists($controller, 'callAction')) {
  return $controller->callAction($method, $parameters);
 }

 return $controller->{$method}(...array_values($parameters));
}

首先 resolveClassMethodDependencies 方法,“顾名思义”是根据类的方法参数获取依赖对象,然后再调用类的方法并把对象参数注入。

如果有多个依赖对象,也会 foreach 依次解析出来作为参数注入。

获取依赖对象示例的代码:

protected function resolveClassMethodDependencies(array $parameters, $instance, $method)
{
 if (! method_exists($instance, $method)) {
  return $parameters;
 }

 return $this->resolveMethodDependencies(
  $parameters, new ReflectionMethod($instance, $method)
 );
}

这里重点就是用到了 PHP 的反射,注意 RelectionMethod 方法,它获取到类的方法参数列表,可以知道参数的类型约束,参数名称等等。

这里的 $instance 参数就是 RoleController 控制器类,$method 参数就是方法名称 strore.

2.获取依赖对象的示例

从方法的参数中获取了依赖对象的约束类型,就可以实例化这个依赖的对象。

protected function transformDependency(ReflectionParameter $parameter, $parameters)
{
 $class = $parameter->getClass(); 
 // If the parameter has a type-hinted class, we will check to see if it is already in
 // the list of parameters. If it is we will just skip it as it is probably a model
 // binding and we do not want to mess with those; otherwise, we resolve it here.
 if ($class && ! $this->alreadyInParameters($class->name, $parameters)) {
  return $parameter->isDefaultValueAvailable()
   ? $parameter->getDefaultValue()
   : $this->container->make($class->name);
 }
}

根据类名从容器中获取对象,这个绑定对象实例的过程在服务提供者中先定义和了。

然后把实例化的对象传入到 store 方法中,就可以使用依赖的对象了。

3.关于 PHP 反射

举个使用 ReflectionMethod 的例子。

class Demo
{
 private $request;
 public function store(Request $request)
 {
 }
}

打印出 new ReflectionMethod(Demo::class, ‘store') 的内容如图:

图片 2

可以得出这个方法的参数列表,参数的约束类型,如 typeHint,IlluminateHttpRequest.

根据类名可以从容器中获取一开始通过服务提供者绑定的实例。

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对帮客之家的支持。

前言 众所周知,php的框架数不胜数,近几年,一个以优雅著称的框架,渐渐被国内phper所知...

可查看sql where参数等

这个需求很普遍的,比如调用订单的日志,需要记录到order.log,获取店铺信息的记录需要记录到shop.log中去。可以这么做:

让lumen的dd像laravel一样优雅

日志

composer require symfony/var-dumper 

同样在start/global.php中

sql, $query->bindings, $query->time ); }); } /** * Register any application services. * * @return void */ public function register() { // }}

如果不要实时记录,那么laravel有个DB::getQueryLog可以获取一个app请求获取出来的sql请求:

Laravel 如何在模型事件中获取某字段修改前的值

如果你是需要实时记录的(也就是你在任何地方die出来的时候,之前的页面的sql请求也有记录)的话,你就需要监听illuminate.query事件了

查询sql记录

所以应该默认把laravel的默认日志记录改成有分割的。

如果,你想要将日志文件保存在 storage/logs 目录中。需要更新: app/Providers/AppServiceProvider.php 里的 boot() 函数

## 在filters.php中App::after(function{ // 数据库查询进行日志 $queries = DB::getQueryLog(); if (Config::get { BLogger::getLogger->info; }}

获取执行的sql语句

laravel的错误日志堆栈太长了,怎么办?

N年前 Laravel 刚面世时,的确让很多人眼前一亮,众人惊呼原来 PHP 代码还可以写得这么简洁优雅。

// 数据库实时请求的日志if (Config::get('database.log', false)){ Event::listen('illuminate.query', function($query, $bindings, $time, $name) { $data = compact('query','bindings', 'time', 'name'); BLogger::getLogger(BLogger::LOG_QUERY_REAL_TIME)->info;}
 public function index->enableQueryLog(); // 开启查询日志 DB::table; //要查看的sql $queries = DB::getQueryLog(); // 获取查询日志 dd; // 即可查看执行的sql,执行的时间,传入的参数等等 }
App::missing{ $response = [ 'status' => 0, 'error' => "请求路径错误", ]; return Response::json;

总结

// 错误日志信息App::error(function(Exception $exception, $code){ Log::error; $err = [ 'message' => $exception->getMessage(), 'file' => $exception->getFile(), 'line' => $exception->getLine(), 'code' => $exception->getCode(), 'url' => Request::url(), 'input' => Input::all(), ]; BLogger::getLogger->error;

本文主要介绍的是关于laravel中的一些简单实用功能,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍吧

所以比如你设计的是接口,希望即使有error出现也返回json数据,则可以这么做:

Issue::saving(function{ if ($issue->isDirty { $user = Auth::user()->username; $oldTitle = $issue->getOriginal; // 原始值 $newTitle = $issue->title; // 新值 ActionLog::log("$user 把标题 $oldTitle 修改为 $newTitle"); }});

laravel的所有错误会全部过global的App::error再出来

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对脚本之家的支持。

① 把monolog中的addInfo等函数简化成为了info这样的函数

只能查看简单的sql不能看到传入的参数

useDailyFiles.'/logs/'. $type .'.log', $day); } $log = self::$loggers[$type]; return $log; }}

前言

好了,看下下面几个需求怎么实现:

laravel中的日志是基于monolog而封装的。laravel在它上面做了几个事情:

③ 如果要调用monolog的方法需要调用callMonolog函数

② 增加了useFiles和useDailyFiles两个参数,使得做日志管理和切割变的容易了

laravel默认的日志没有使用分割

Log::useDailyFiles.'/logs/laravel.log', 30);

希望本文所述对大家基于Laravel框架的PHP程序设计有所帮助。

将不同的日志信息存放到不同的日志中去

// 错误日志信息App::error(function(Exception $exception, $code){ // 如果没有路径就直接跳转到登录页面 if ($exception instanceof NotFoundHttpException) { return Redirect::route; } Log::error; $err = [ 'message' => $exception->getMessage(), 'file' => $exception->getFile(), 'line' => $exception->getLine(), 'code' => $exception->getCode(), 'url' => Request::url(), 'input' => Input::all(), ]; BLogger::getLogger->error; $response = [ 'status' => 0, 'error' => "服务器内部错误", ]; return Response::json;

本文实例讲述了laravel中的错误与日志用法。分享给大家供大家参考,具体如下:

这样不同的日志数据会被存储到不同的日志文件中去。还能记录日志数据信息。

使用上面的BLogger类,在start/global.php记录下必要的错误信息

这个应该再细化问,你是不是要实时记录?

错误

如何记录一个请求的sql日志

如果你还希望将404错误也hold住:

本文由澳门新葡萄京娱乐网站发布于编程知识,转载请注明出处:laravel中的一些简单实用功能_php实例_脚本之家

关键词: