lumen 框架学习

路由

基本使用

# 直接返回信息或简单处理,一般很少用这个
$app->get('/', function() {
	return 'Hello World';
});

# 携带参数
$app->get('user/{id}', function($id) {
	return 'User '.$id;
});

# 重命名并指向控制器-经常使用
$app->get('user/profile', [
	'middleware' => 'old','as' => 'profile', 'uses' => 'UserController@showProfile'
]);

# 分组使用中间件
$app->group(['middleware' => 'foo|bar'], function($app)
{
	$app->get('/', function() {
		// Uses Foo & Bar Middleware
	});

	$app->get('user/profile', function() {
		// Uses Foo & Bar Middleware
	});
});

# 分组通用命名空间
$app->group(['namespace' => 'Admin'], function($app) {
	// Controllers Within The "App\Http\Controllers\Admin" Namespace
});

# tocken 使用
<input type="hidden" name="_token" value="">
    
# ajax自动携带tocken配置
<meta name="csrf-token" content="{{ csrf_token() }}" />
$.ajaxSetup({
	headers: {
		'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content')
	}
});

中间件

实例

 namespace App\Http\Middleware;

/**定义中间件-app/Http/Middleware
* $request 请求体-包含请求的相关信息
* $next 下一个中间件对象
*/
class BeforeMiddleware implements Middleware {

	public function handle($request, Closure $next)
	{
		// Perform action
		return $next($request);
	}
    // 该方法可以在响应发送给客户端的时候调用,可以接受respose参数
    public function terminate($request, $response)
	{
		// Store the session data...
	}
}

# 中间件注册,在bootstrap/app.php Register Middleware (其中容器,配置文件,服务提供者,路由加载,也都是在这个问题里面进行注册)
## 直接注册,所有人都可以用
 $app->middleware([
     App\Http\Middleware\ExampleMiddleware::class 
 ]);
## 指定中间件给特定路由
 $app->routeMiddleware([
     'auth' => App\Http\Middleware\Authenticate::class,
 ]);

请求实例对象操作

操作

# 利用外观模式(服务提供者)操作
use Request
$name = Request::input('name');

# 利用以来注入方式引用
use Illuminate\Http\Request;
class UserController extends Controller {
	public function store(Request $request)
	{
		$name = $request->input('name');
	}
}
## 外部在调用的时候将请求实例注入:UserController->store($this->request);

# 常用基本操作
Request::input('name');// 直接取值
Request::input('name', 'Sally'); // 默认值
Request::has('name'); // 判断是否有值
Request::all(); // 所有值
Request::only('username', 'password'); // 多个值取
Request::except('credit_card'); // 除值以外
Request::flash();// 将当前请求的数据刷新到Session中
Request::old('username');// 调用上一个请求flash刷新的session内容
Request::cookie('name'); //获取cookie
$response->withCookie(cookie('name', 'value', $minutes)); //cookie添加到响应中
Cookie::queue('name', 'value'); // 在response之前创建cookie,并会自动添加到请求中
Request::file('photo'); // 获取上传文件对象
Request::hasFile('photo'); // 判断文件是否存在
Request::file('photo')->isValid(); // 确定上传文件是否有效
Request::file('photo')->move($destinationPath, $fileName);// 移动上传文件
Request::path(); // 检索请求 URI
$method = Request::method();// 检索请求方法
Request::isMethod('post');// 检索请求方法
Request::is('admin/*');// 确定请求路径是否匹配模式
Request::url();// 获取当前请求 URL
    

响应

# 自定义响应
return response($content, $status)
              ->header('Content-Type', $value);

# 重定向并缓存数据到session。两者可以同时完成,然后就可以再后续调用重定向数据
return redirect('user/login')->with('message', 'Login Failed');

# 重定向到上一个url 并携带输入
return redirect()->back()->withInput();

# 重定向到路由
return redirect()->route('profile', ['id' => 1]);

# 创建文件下载响应
return response()->download($pathToFile);
return response()->download($pathToFile, $name, $headers);
return response()->download($pathToFile)->deleteFileAfterSend(true);

#创建 JSON 响应
return response()->json(['name' => 'Abigail', 'state' => 'CA']);

# 创建 JSONP 响应
return response()->json(['name' => 'Abigail', 'state' => 'CA'])
                 ->setCallback($request->input('callback'));

视图

# 视图返回,携带参数
return view('fileName.profile', ['name' => 'James']);

# 通过一个文件路径生成一个视图:
return view()->file($pathToFile, $data);

认证

# 在.env 配置基本数据库信息
AUTH_DRIVER // 驱动
AUTH_MODEL // 数据库操作
AUTH_TABLE // 用户信息表
## 然后可以自动去查询是否匹配,根据第一个参数为key,匹配后面两个字段
Auth::attempt(['email' => $email, 'password' => $password, 'active' => 1], $remember);


Auth::check(); // 要确定用户是否已经登录到您的应用程序
Auth::viaRemember(); // 判断是否使用了remember
Auth::loginUsingId(1); // 通过ID登录认证 bool
Auth::once($credentials); // 单此请求登录,没有cookie和session
Auth::login($user); // 用户信息,等同于attempt
Auth::logout();// 注销

缓存

# redis 缓存
在 Lumen 中使用 Redis 缓存前,需要先通过 Composer 安装 predis/predis 包 (~1.0)# 保存数据到缓存中
Cache::put('key', 'value', $minutes);

# 使用 Carbon 对象设置缓存过期时间
$expiresAt = Carbon::now()->addMinutes(10);
Cache::put('key', 'value', $expiresAt);

# 取出一条数据或返回默认值
Cache::get('key', 'default');
Cache::get('key', function() { return 'default'; });

# 将一条数据永久保存到缓存中
Cache::forever('key', 'value');

# 从缓存获取数据,如果不存在就向缓存保存一个默认数据。是否可以用于防止缓存击穿?
$value = Cache::remember('users', $minutes, function() {
	return DB::table('users')->get();
});

# 从缓存取一条数据并在缓存中删除。是否可用于队列,或者加锁?
$value = Cache::pull('key');

加密

# 设置加密模式
Crypt::setMode('ctr');
Crypt::setCipher($cipher);
# 执行加密解密操作
$encrypted = Crypt::encrypt('secret');
$decrypted = Crypt::decrypt($encryptedValue);

错误和日志

# 处理错误
public function report(Exception $e)
{
	if ($e instanceof CustomException) {
		// TODO:修改$e的一些信息,然后再重新吧错误信息,给到父级去处理
	}
	return parent::report($e);
}

# HTTP 异常
abort(403, 'Unauthorized action.');

# 日志记录
Log::info('This is some useful information.');
Log::warning('Something could be going wrong.');
Log::error('Something is really going wrong.');

# 获取日志实例,可在闭包等地方注入此依赖
$logger = app('Psr\Log\LoggerInterface');
function ($logger){
    $logger->warning();
}

事件

# 监听事件-当事件被触发时,事件对象将被传递给handle监听器的方法:
Event::listen(
	'PodcastWasPurchased', '类@handle'
);
# 触发事件
Event::fire(new PodcastWasPurchased($podcast));
event(new PodcastWasPurchased($podcast));
# 停止事件的传播
Event::listen('App\Events\PodcastWasPurchased', function($event) {
	// Handle the event...
	return false;
});
# 事件排队,这样可以方便处理业务
use Illuminate\Contracts\Queue\ShouldBeQueued;
class SendPurchaseConfirmation implements ShouldBeQueued {
	public function (PurchasePodcast $event)
	{
		//
	}
}

哈希

通过 Bcrypt 加密密码

$password = Hash::make('secret');

还可以直接使用 bcrypt 助手函数:

$password = bcrypt('secret');

对加密后的密码进行验证

if (Hash::check('secret', $hashedPassword))	{
	// 密码匹配...
}

检查密码是否需要重新加密

if (Hash::needsRehash($hashed))	{
	$hashed = Hash::make('secret');
}

辅助函数

list($keys, $values) = array_divide($array); // array_divide 把数组的key和val分别拆分成两个数组
array_dot($array);// 将多维数组展平为使用“点”表示法表示深度的单级数组

# 方法返回一个包含所选嵌套元素的扁平数组
$array = [
	['developer' => ['name' => 'Taylor']],
	['developer' => ['name' => 'Dayle']]
];
$array = array_fetch($array, 'developer.name');
// ['Taylor', 'Dayle'];


#该array_flatten方法会将多维数组展平为单个级别。
$array = ['name' => 'Joe', 'languages' => ['PHP', 'Ruby']];
$array = array_flatten($array);
// ['Joe', 'PHP', 'Ruby'];


#该array_forget方法将使用“点”表示法从深度嵌套的数组中删除给定的键/值对。
$array = ['names' => ['joe' => ['programmer']]];
array_forget($array, 'names.joe');

# 返回数组中的第一个元素。
$first = head($this->returnsArray('foo'));

# 是否以给定的针结束。可以用于判断上传图片是否符合要求
$value = ends_with('This is my name', 'name');

# 限制字符串中的字符数。
str_limit($value, $limit = 100, $end = '...');
str_contains
    
# 是否包含给定的字符。
$value = str_contains('This is my name', 'my');

# 增加结尾
$string = str_finish('this/string', '/');

#确定给定字符串是否与给定模式匹配。星号可用于表示通配符。
$value = str_is('foo*', 'foobar');

# 将字符串转换为其复数形式(仅限英文)。
$plural = str_plural('car');
 
# 生成给定长度的随机字符串。
$string = str_random(40);

# 将字符串转换为其单数形式(仅限英文)。
$singular = str_singular('cars');

# 从给定的字符串生成 URL 友好的“slug”。

str_slug($title, $separator);
例子:

$title = str_slug("Laravel 5 Framework", "-");

// laravel-5-framework

# 将给定的字符串转换为StudlyCase.
$value = studly_case('foo_bar');

你可能感兴趣的:(学习心得,php,laravel)