laravel作为后端API使用的时候,前端ajax请求的时候 遇到跨域的问题
barryvdh/laravel-cors
使用方法很简单
安装:
composer require barryvdh/laravel-cors
app/Http/Kernel.php
在 protected $middleware
数组里添加 \Barryvdh\Cors\HandleCors::class
查看效果:这时候ajax 访问就可以没有跨域的问题了
Laravel User Agent 轻松识别客户端信息 —— jenssegers/agent,客户端会通过这个请求向访问网站提供浏览器类型、操作系统及版本,浏览器渲染引擎,浏览器语言等标识的信息
https://github.com/jenssegers/agent
安装: composer require jenssegers/agent
$this->agent = new Agent();
//判断是否手机
$this->agent->isMobile()
//判断是否平板
$this->agent->isTablet()
//其余请自行查看手册
……
需要快速开发,一键生成所有增删改查,集成了控制器,验证器,模型,仓库,呈现器和转换器等
https://github.com/andersao/l5-repository
composer require prettus/l5-repository
Prettus\Repository\Providers\RepositoryServiceProvider::class
providers => [
...
Prettus\Repository\Providers\RepositoryServiceProvider::class,
],
config
下生成repository.php
文件)php artisan vendor:publish
controller
、验证器Validator
、模型Model
、仓库Repository
、呈现器Presenter
和转换器Transform
的类文件。
php artisan make:entity name
其余的使用请自行查看手册
软件需要上传大量的文件或图片,或者是为了方便处理图片,都可以使用阿里云OSS方便我们开发。
https://github.com/johnlui/AliyunOSS
composer require johnlui/aliyun-oss:~2.0
新建 app/services/OSS.php
内容可参考:OSS.php
namespace App\Services;
use JohnLui\AliyunOSS\AliyunOSS;
use Config;
class OSS {
private $ossClient;
public function __construct($isInternal = false)
{
$serverAddress = $isInternal ? Config::get('oss.ossServerInternal') : Config::get('oss.ossServer');
$this->ossClient = AliyunOSS::boot(
$serverAddress,
Config::get('oss.AccessKeyId'),
Config::get('oss.AccessKeySecret')
);
}
// 默认上传文件使用内网,免流量费
public static function upload($ossKey, $filePath, $isInternal = true)
{
$oss = new OSS($isInternal);
$oss->ossClient->setBucket('你的Bucket名字');
$oss->ossClient->uploadFile($ossKey, $filePath);
}
/**
* 直接把变量内容上传到oss
* @param $osskey
* @param $content
*/
public static function uploadContent($osskey,$content)
{
$oss = new OSS(true); // 上传文件使用内网,免流量费
$oss->ossClient->setBucket('你的Bucket名字');
$oss->ossClient->uploadContent($osskey,$content);
}
/**
* 删除存储在oss中的文件
*
* @param string $ossKey 存储的key(文件路径和文件名)
* @return
*/
public static function deleteObject($ossKey)
{
$oss = new OSS(true); // 上传文件使用内网,免流量费
return $oss->ossClient->deleteObject('你的Bucket名字', $ossKey);
}
/**
* 复制存储在阿里云OSS中的Object
*
* @param string $sourceBuckt 复制的源Bucket
* @param string $sourceKey - 复制的的源Object的Key
* @param string $destBucket - 复制的目的Bucket
* @param string $destKey - 复制的目的Object的Key
* @return Models\CopyObjectResult
*/
public function copyObject($sourceBuckt, $sourceKey, $destBucket, $destKey)
{
$oss = new OSS(true); // 上传文件使用内网,免流量费
return $oss->ossClient->copyObject($sourceBuckt, $sourceKey, $destBucket, $destKey);
}
/**
* 移动存储在阿里云OSS中的Object
*
* @param string $sourceBuckt 复制的源Bucket
* @param string $sourceKey - 复制的的源Object的Key
* @param string $destBucket - 复制的目的Bucket
* @param string $destKey - 复制的目的Object的Key
* @return Models\CopyObjectResult
*/
public function moveObject($sourceBuckt, $sourceKey, $destBucket, $destKey)
{
$oss = new OSS(true); // 上传文件使用内网,免流量费
return $oss->ossClient->moveObject($sourceBuckt, $sourceKey, $destBucket, $destKey);
}
public static function getUrl($ossKey)
{
$oss = new OSS();
$oss->ossClient->setBucket('你的Bucket名字');
return $oss->ossClient->getUrl($ossKey, new \DateTime("+1 day"));
}
public static function createBucket($bucketName)
{
$oss = new OSS();
return $oss->ossClient->createBucket($bucketName);
}
public static function getAllObjectKey($bucketName)
{
$oss = new OSS();
return $oss->ossClient->getAllObjectKey($bucketName);
}
/**
* 获取指定Object的元信息
*
* @param string $bucketName 源Bucket名称
* @param string $key 存储的key(文件路径和文件名)
* @return object 元信息
*/
public static function getObjectMeta($bucketName, $osskey)
{
$oss = new OSS();
return $oss->ossClient->getObjectMeta($bucketName, $osskey);
}
}
在app/config/oss.php
中增加以下配置
return [
'useInternal' => false,//是否使用OSS内网传输来省流量
'ossServer' => '服务器外网地址', //青岛为 http://oss-cn-qingdao.aliyuncs.com
'ossServerInternal' => '服务器内网地址', //青岛为 http://oss-cn-qingdao-internal.aliyuncs.com
'AccessKeyId' => '阿里云给的AccessKeyId',
'AccessKeySecret' => '阿里云给的AccessKeySecret',
];
use App\Services\OSS;
OSS::upload('文件名', '本地路径'); // 上传一个文件
echo OSS::getUrl('某个文件的名称'); // 打印出某个文件的外网链接
OSS::createBucket('一个字符串'); // 新增一个 Bucket。注意,Bucket 名称具有全局唯一性,也就是说跟其他人的 Bucket 名称也不能相同。
OSS::getAllObjectKey('某个 Bucket 名称'); // 获取该 Bucket 中所有文件的文件名,返回 Array。
问题1:运行时出现
Undefined index: host
原因:配置文件中 ossServer 的值未加
http://
问题2:运行时出现
The specified bucket is not valid.
原因:内外地址填写时加了
BucketName
例如http://BucketName.oss-cn-beijing.aliyuncs.com
拼接起来就变成了http://bucketName.bucketName.oss-cn...com
解决方案:在配置文件里面
ALIOSS_SERVER=http://oss-cn-beijing.aliyuncs.com
这个外网地址前面不要加上Bucket
名字
如果你前端需要处理图片(如:缩放,裁剪,旋转,加水印等),用OSS是非常方便的。详情查看Oss文档
发送短信验证码,短信通知等
https://github.com/toplan/laravel-sms
composer require toplan/laravel-sms:~2.6
详细使用可以参照之前我写过的一篇博客Laravel下的短信验证码注册
需要可视化的查看服务器上的错误日志,以便于调试Bug
https://github.com/rap2hpoutre/laravel-log-viewer
composer require rap2hpoutre/laravel-log-viewer
config/app.php
中的provider
里添加Rap2hpoutre\LaravelLogViewer\LaravelLogViewerServiceProvider::class,
Route::get('logs', '\Rap2hpoutre\LaravelLogViewer\LogViewerController@index');
需要根据链接地址生成二维码图片
https://github.com/SimpleSoftwareIO/simple-qrcode
composer require simplesoftwareio/simple-qrcode 1.3.*
config/app.php
中的provider
里注册服务提供者SimpleSoftwareIO\QrCode\QrCodeServiceProvider::class
config/app.php
中的aliases
里 添加 QrCode
门面'QrCode' => SimpleSoftwareIO\QrCode\Facades\QrCode::class
a. 使用QrCode::generate('Hello,World!');
可以生成一个Hello,World!
的二维码
b.使用QrCode::format('png')->size(150)->merge('/public/images/logo.png')->errorCorrection('H')->generate('Hello,World!','../public/images/'.$image_name);
讲解:format()为要生成的图片格式,size()为生成的图片大小,merge()为添加二维码中间logo图片,errorCorrection()定义容错级别,为了让二维码保持高可识别度一般定义为errorCorrection(‘H’),generate()为生成二维码,第一个参数为需要生成二维码的字符串,第二个参数为保存的图片地址。
需要注意的是所有的方法都支持连贯操作,但是
generate
方法必须在最后,format
必须在第一个
具体的操作可以查看博客
在做后台管理时我们经常会用到权限,限制用户的操作范围
https://github.com/Zizaco/entrust
composer require zizaco/entrust 5.2.x-dev
config/app.php
中的provider
里注册服务提供者Zizaco\Entrust\EntrustServiceProvider::class,
config/app.php
中的aliases
里 添加 Entrust
门面‘Entrust’ => Zizaco\Entrust\EntrustFacade::class,
php artisan vendor:publish
config/auth.php
配置,将你的用户表进行关联'providers' => [
'users' => [
'driver' => 'eloquent',
'model' => Namespace\Of\Your\User\Model\User::class,
'table' => 'users',
],
'admins' => [
'driver' => 'eloquent',
'model' => App\Models\Admin::class,
'table' => 'admins'
],
],
(1) 迁移数据库,运行php artisan entrust:migration
和php artisan migrate
自动生成以下表
roles — 角色表
permissions — 权限表
role_user — 角色和用户之间的关系
permission_role— 角色和权限之间的关系
(2) 创建相应的模型
a.创建Role
模型
php namespace App;
use Zizaco\Entrust\EntrustRole;
class Role extends EntrustRole
{
}
b.创建Permission
模型
namespace App;
use Zizaco\Entrust\EntrustPermission;
class Permission extends EntrustPermission
{
}
c.创建Admin
模型
use Zizaco\Entrust\Traits\EntrustUserTrait;
class Admin extends Eloquent
{
use EntrustUserTrait; // T添加到你的模型
...
}
(3) 创建中间件
在app/Http/Kernel.php
中添加'permission' => \App\Http\Middleware\Permission::class,
protected $routeMiddleware = [
……
'permission' => \App\Http\Middleware\Permission::class,
];
在app/Http/Middeware
下创建permisson.php
namespace App\Http\Middleware;
use App\Models\Admin;
use Closure;
use Illuminate\Http\Request;
class Permission
{
/**
* Handle an incoming request.
*
* @param Request $request
* @param Closure $next
* @return mixed
*/
public function handle($request, Closure $next)
{
//获取当前登录的管理员
$user = auth()->user();
//获取管理员访问的路由
$name = $request->route()->action['as'];
//判断该管理员是否有权访问该路由
if (!$user->can($name)) {
abort(403, 'Forbidden');
}
return $next($request);
}
}
(4)定义路由
将你需要做权限限制的路由绑定中间件permisson
,比如查看文章需要权限验证:
Route::group(['prefix' => '' , 'middleware'=> 'permission'], function () {
Route::resources([
'article' => 'ArticleController',
'articleCat' => 'ArticleCatsController',
]);
});
当你需要对接第三方微信时,可能会遇到微信支付,发送模板消息,自动回复等场景
https://github.com/zoujingli/WeChatDeveloper
composer require zoujingli/wechat-developer
请查看官方手册