上学笔记,Cache和Application的多少个主意

控制器文件: HomeController.php

Controller 控制器虚类

⚠️ Controller 为抽象类,不能通过 new 方式实例化,由 Bootstrap
自动实例化,Azalea 中颇具控制器必须继续此类

    在ASP.NET中,Web
Api的支配器类派生于ApiController,该类与ASP.NET的Control类没有直接关系,因而无法像在Web
MVC中一向动用HttpContext,Cache,Session等,要使用的话,一般是从System.Web.HttpContext.Current静态对象引用HttpContext,从而选用Session等景况数据。

Controller

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;

class HomeController extends Controller
{
    public function index()
    {
        return view('home');
    }
}

路由分发规则


Azalea 依照路径分隔符举行剪切,规则与 Zend
Framework
和 CodeIgniter
类似,规则如下

/[folder/]controller/action/arg1/arg2/arg3...
  • folder 文件夹在 控制器目录 下存在则 folder
    有效,并把该公文夹作为 眼前控制器目录,否则 folder 为空;
  • controller 会在脚下控制器目录下查找 同名.php
    文件,加载并自行实例化,私下认可控制器名在布署
    ['dispatch']['default_controller'] 中设置;
  • action 会在眼下的 控制器实例 中查找 同名 + 环境后缀
    public 方法,暗中认可方法名在布局 ['dispatch']['default_action']
    中设置;
  • action 后的有个别组成 arguments 数组
  • 范例
  • /

[
      'folder` => null,
      'controller' => 'default',
      'action' => 'index',
      'arguments' => [],
]
  • /foo

[
      'folder` => null,
      'controller' => 'foo',
      'action' => 'index',
      'arguments' => [],
]
  • /foo/bar

[
      'folder` => null,
      'controller' => 'foo',
      'action' => 'bar',
      'arguments' => [],
]
  • /foo/bar/a/b/c

[
      'folder` => null,
      'controller' => 'foo',
      'action' => 'bar',
      'arguments' => ['a', 'b', 'c'],
]

   
可是,要在决定器类中经过HttpContext的Session属性直接选用Session状态数据,将抛出nullreference十分,网查首要有三种缓解方案,二个是重载Global的init()方法,在该方法中开放Session状态,另贰个企划带Session的路由处理器

Controller 之 Rquest

  • Larvel中的请求使用的是symfony/http-foundation组件
  • use Illuminate\Http\Request;
  • 伸手里面存放了 $_GET $_POST $_COOKIE $_FILES $_SERVER等数据

 

决定器类和控制器方法命名规则


  • controller 类名与控制器名相同并首字母大写,若存在
    folder,则再加上文件夹名作前缀并首字母大写,并以 "Controller"
    作为后缀,例如

class DefaultController extends Azalea\Controller {}
class AdminDefaultController extends Azalea\Controller {}  // folder 为 "admin"
  • action 条件后缀上学笔记,Cache和Application的多少个主意。 会依照运营条件布置,若暗中同意 "WEB",则后缀为
    "Action",否则直接动用环境名作为后缀,如 "CLI""CRON"
    等,例如

public function indexAction() {}  // 运行环境为 "WEB"
public function scheduleCLI() {}  // 运行环境为 "CLI"

    重载Global的Init()

public class WebApiApplication : System.Web.HttpApplication
{
        public override void Init()
        {
            this.PostAuthorizeRequest += (y, z) => HttpContext.Current.SetSessionStateBehavior(System.Web.SessionState.SessionStateBehavior.Required);
            base.Init();
        }
        protected void Application_Start()
        {
            GlobalConfiguration.Configure(WebApiConfig.Register);
        }
}

设计路由微型总计机

  建立HttpControllerHandler和HttpControllerRouteHandler并覆写

 public class SessionStateRouteHandler : IRouteHandler
  {
        public IHttpHandler GetHttpHandler(RequestContext requestContext)
        {
            return new SessionableControllerHandler(requestContext.RouteData);
        }
 }
 public class SessionableControllerHandler:HttpControllerHandler,IRequiresSessionState
 {
        public SessionableControllerHandler(RouteData routeData)
            :base(routeData)
        {

        }
 }

   创制RouteConfig类型并配备路由

 public class RouteConfig
    {
        public static void RegisterRoutes(RouteCollection route)
        {
            route.MapHttpRoute(
              name: "WebApiRoute1",
              routeTemplate: "api/{controller}/{id}",
              defaults: new { id = RouteParameter.Optional }
            ).RouteHandler = new SessionStateRouteHandler();
        }
    }

 在Global中登记配置

protected void Application_Start()
{
            // GlobalConfiguration.Configure(WebApiConfig.Register);
            RouteConfig.RegisterRoutes(RouteTable.Routes);
}

 

获得请求中的值

骨干的控制器+路由

控制器方法的再次回到值

控制器方法协理回到 2 类别型

  1. 字符串:Azalea 将一贯出口,常用于视图渲染
  2. 数组/对象:Azalea 将进行 json_encode 后出口,常用来接口或 Ajax
    再次来到

认清请求类型

/**
     * 获取请求
     * @return [type] [description]
     */
    public function request1(Request $request){

        /*
            // 取值 
            echo $request->input('name');
            // http://laravel.study.com/request1?name=zhangsan  
            // echo zhangsan

            // 设置一个默认值
            echo $request->input('sex', '未知');
            // http://laravel.study.com/request1?sex=1  
            // echo 1
            // 
            // http://laravel.study.com/request1
            // echo 未知
        */


        /*
            // 判断是否存在该参数
            if ($request->has('name')) {
                echo $request->input('name');
            } else {
                echo "无参数";
            }
        */

        /* 
            // 取url 所有的参数
            $res = $request->all();
            dd($res);
            // http://laravel.study.com/request1?aa=bb&cc=dd
            // array:2 [▼
            //   "aa" => "bb"
            //   "cc" => "dd"
            // ]
        */



        // 获取请求类型
        // echo $request->method();

        // 判断请求类型是否是预设的类型
        // echo $request->isMethod('GET') ? 'get' : '未知';

        // 判断是否是ajax
        // echo $request->ajax();


        // 判断地址格式 是否符合 设定的标准
        // $res = $request->is('student/*');
        // var_dump($res);
        // // bool(false) 

        // 获取当前的url
        // echo $request->url();
        // // http://laravel.study.com/request1

    }
Route::get('/test/home','HomeController@index');

Route::get('/test/home',['uses'=>'HomeController@index']);

Controller::__init <small>子类完毕</small>


控制器开头化回调函数

void Controller::__init ( void )

⚠️ 该方法若子类完成则 Bootstrap 会自动调用,常用于子类开首化

  • 参数

  • 返回值

  • 范例

protected function __init()
{
    if (date('h') < 12) {
      $this->title = '上午';
    } else {
      $this->title = '下午';
    }
}

Controller 之 session

  • 暗中认可使用的是 “file” 的session 驱动
  • session 的配置文件 配置在config/session.php 中

 

Controller::__router <small>子类实现</small>


动态路由回调函数

array Controller::__router ( array $paths )

⚠️ 该方法若子类完毕则 Bootstrap 会自动调用

  • 参数
    $paths – 路径参数数组,第二个因素是 action
    控制器方法名,剩下的因素为 arguments 参数数组

  • 返回值
    新路由数组,若无再次回到或重返 null,则保留原路由
    Azalea 只会对回到的路由数组中 callback, actionarguments
    实行拍卖,别的值将忽略
    callbackaction 必须为字符串,且优先处理
    callback,该值表示分发到控制器内钦命的函数名

  • 范例

protected function __router($paths)
{
    // 如路径为 product/123456,123456 为商品 ID
    if (is_numeric($paths[0])) {
      return [
        'action' => 'view',  // 路由到 view
        'arguments' => [$paths[0]],  // 把 $paths[0] 作为路径参数
      ];
    } else {
      return [
        'callback' => 'view',  // 路由到 $this->view 方法,不会加运行环境后缀
      ]
    }
}
// 目标 Action
public function viewAction($productId) {}
// 目标方法
public function view() {}

laravel中采用的session有二种方法

  • HTTP request 类session() 方法
  • session() 协理函数
  • Session facade 类 — 需求引入 use
    Illuminate\Support\Facades\Session;

    /**
     * 学习 处理 session  主要设置session
     * @return [type] [description]
     */
    public function session1(Request $request)
    {
        // 1、 HTTP request session();
        // 设置 session 值
        // $request->session()->put('key1', 'value1');

        // 2、 session()
        // 设置 session 值
        // session()->put('key2', 'value2');


        // 4、 使用Session 类
        // 需要引入  use Illuminate\Support\Facades\Session;
        // 设置 session 值
        // Session::put('key3', 'value3');

        // 5、 设置一个数组
        // Session::put(['key4'=>'value4']);


        // 6、 往session 中的元素 填入数组
        // Session::push('student', 'test');
        // Session::push('student', 'imooc');
        // 


        // 7、 取出数据并删除
        // $res = Session::pull('student', 'default');
        // var_dump($res);


        // 8、  取出所有session 的值
        // $res = Session::all();
        // dd($res);


        // 9、 判断session 值是否存在
        // if (Session::has('key11')) {
        //  $res = Session::all();
        //  dd($res);
        // } else {
        //  echo 'session key11 不存在!';
        // }


        // 10、 删除指定key

        // // 删除操作
        // Session::forget('key3');

        // $res = Session::all();
        // dd($res);



        // 11、 清空session
        // Session::flush();

        // $res = Session::all();
        // dd($res);

        // 12、 暂存数据 即:第一次访问存在  第二次访问就被删除
        Session::flash('flash-key', 'flash-value');
    }

    /**
     * 主要获取SESSION
     * @param  Request $request [description]
     * @return [type]           [description]
     */
    public function session2(Request $request)
    {   
        // 1、 HTTP request session()  获取值 
        // echo $request->session()->get('key1');

        // 2、 session() 获取值 
        // echo session()->get('key2');

        // 3、 使用 Session 类
        // echo Session::get('key3');

        // 设置默认值
        // echo Session::get('key4', 'default');


        // 5、 获取刚才用数组存入的key4的值
        // echo Session::get('key4', 'default');


        // 6、 获取元素值
        // $res = Session::get('student');
        // dd($res);
        // array:2 [▼
        //   0 => "test"
        //   1 => "imooc"
        // ]
        // 


        // 12、 暂存数据 即:第一次访问存在  第二次访问就被删除
        $res =  Session::get('flash-key');
        dd($res);
    }

路由参数获取+路由外号

Controller::getRequest


获取 Request 请求类

Request Controller::getRequest ( void )
  • 参数

  • 返回值
    请求类实例

  • 范例

$request = $this->getRequest();

Controller 之 Response

Route::get('/test/home/{id}','HomeController@index')->name('home');

Route::get('/test/home',[
  'as'=>'home',
  'uses'=>'HomeController@index'
]);

Controller::getResponse


获取 Response 响应类

Response Controller::getResponse ( void )
  • 参数

  • 返回值
    响应类实例

  • 范例

$response = $this->getResponse();

字符串

reutrn 'aa';

 Controller之request

Controller::getSession


获取 Session 会话类

Session Controller::getSession ( void )
  • 参数

  • 返回值
    会话类实例

  • 范例

$session = $this->getSession();

视图

return view('welcome');
     获取请求值
        echo $request->input('name');
        echo $request->input('sex','未知');
        判断是否有该参数
        if($request->has('name')){
            echo $request->input('name');
        }else {
            echo '无该参数';
        }
        获取所有的参数
        $res = $request->all();
        dd($res);

        输出请求的类型
        echo $request->method();
        判断请求是什么
        if($request->isMethod('get')){
            echo 'GET';
        }else{
            echo 'POST';
        }
        判断是否是Ajax请求
        $res=$request->ajax();
        var_dump($res);
        判断请求的路由格式是否正确
        $res=$request->is('/student/*');
        var_dump($res);
        获取当前的url
        $url=$request->url();
        echo $url;

Controller::getModel


获得模块

Model Controller::getModel ( string $name )
  • 参数
    $name – 模块名

  • 返回值
    模块实例

  • 范例

$mysqlModel = $this->getModel('mysql');

json

response()->json($data);

  Controller之Session

Controller::loadModel


加载模块文件

void Controller::loadModel ( string ...$name )
  • 参数
    $name – 模块名,可传唱三个模块名

  • 返回值

  • 范例

$this->loadModel('mysql', 'solr');

重定向

// 根据控制器和方法名
redirect()->action('StudentController@responseTest');

// 根据别名
redirect()->route('responseTest');

// 返回来源页面
redirect()->back();

    /**
     * response 响应
     * @return [type] [description]
     */
    public function response(){

/*
        // 响应 json 字符串
        $data = array(
            range('a', 'z'),
            'test'=>'test'
        );
        // dump($data);
        return response()->json($data);
*/

        // 重定向
        // return redirect('responseTest');

        // 重定向 带参数(session 方式)
        // return redirect('responseTest')->with('message', '我是快闪数据!');


        // action 跳转方法
        // return redirect()->action('StudentController@responseTest')->with('message', '我是快闪数据!');

        // route
        // return redirect()->route('responseTest')->with('message', '我是快闪数据!');

        // 返回上一个页面
        // sleep(3);
        // return redirect()->back();

    }


    /**
     * 设置重定向后的地址
     */
    public function responseTest(){
        // 重定向 没带参数
        // return '我从response而来。';

        // 重定向 带参数
        // return Session::get('message', '暂无信息');

    }

率先在控制器中引入 session类

Controller::getView


获取 View 视图类

View Controller::getView ( void )
  • 参数

  • 返回值
    视图类实例

  • 范例

$view = $this->getView();

Controller 之 Middleware

  use Illuminate\Support\Facades\Session;

Controller::throw404


抛出 404 异常

void Controller::throw404 ( string $message ) throws E404Exception
  • 参数
    $message – 至极消息

  • 返回值

  • 异常
    抛出 E404Exception 异常

  • 范例

$this->throw404('找不到商品');

中间件有如何作用

Laravel 中间件提供多个有利的体制来过滤进入应用程序的 http请求

//        储存session值
        Session::put('name','force');
//        也可以接受一个数组
        Session::put(['sex'=>'18']);
//        session的value也可以是一个数组
        Session::push('animal','cat');
        Session::push('animal','dog');
//        获取session值,如果没有也可以定义一个默认值
        Session::get('name','default');
//        pull()方法取出数据后就会删除,仅第一次能够获取到值
        Session::pull("name");
//        获取所有值
        Session::all();
//        判断某key是否存在值
        Session::has('key');
//        删除指定session值
        Session::forget('key');
//        删除所有session
        Session::flush('key');
//        暂存数据,访问一次后就会删除
        Session::flash('key1','value1');

采纳处境

  Controller之Response

有三个运动,在钦赐日期开端后,假诺移动没拉开,只可以访问宣传页面

  • 新建中间件
  • 登记中间件
  • 采纳中间件
  • 中间件的放权和前置操作
//查询到数据并返回一个json
        $students = Student::all();
        return response()->json($students);
        //redirect重定向,快闪数据with
        //跳转到某个控制器
        return redirect('controller')->with('message','hello');
        return redirect()->action('HomeController@response')->with('message','我是快闪数据');
        //跳转到路由别名
        return redirect()->route('home')->with('message','我是快闪数据');
        //获取快闪数据
        return Session::get('message','default');

始建逻辑代码

app\Http\Controllers\StudentController.php

    /**
     *  学习使用中间件   活动的宣传页面
     */
    public function activity0()
    {
        return '活动快要开始啦,敬请期待。';
    }


    /**
     * 学习使用中间件  活动开始页面
     */
    public function activity1()
    {
        return '活动进行中,谢谢您的参与1!';
    }

    /**
     * 学习使用中间件  活动开始页面
     */
    public function activity2()
    {
        return '互动进行中,谢谢您的参与2!';
    }

 

创设路由

app\Http\routes.php

Route::any('activity0', ['uses'=>'StudentController@activity0']);
Route::any('activity1', ['uses'=>'StudentController@activity1']);
Route::any('activity2', ['uses'=>'StudentController@activity2']);

新建中间件

app\Http\Middleware\ 目录是存放中间件的目录
新建 活动中间件 Acivity.php

<?php
namespace app\Http\Middleware;

// 引入 中间件对象的处理方法
use Closure;


/**
 *  活动中间件
 */
class Acivity
{

    /**
     * 中间件处理方法 方法名(handle)是固定的
     * @param  [type]  $request 请求对象
     * @param  Closure $next    处理包 
     * @return [type]           [description]
     */
    public function handle($request, Closure $next)
    {

        // 如果时间未到
        if (time() < strtotime('2016-11-20')) { 

            // 重定向到活动宣传页面
            return redirect('activity0');
        }


        // 如果时间到了  就继续匹配下面的路由  传入请求数据
        return $next($request);
    }

}

中间件

安插文件地方
app\Http\Kernel.php

一旦要 注册三个大局的中间件的话 就新增到 $middleware变量中
只要要新增1个权且的 就剧增到 $routeMiddleware变量中

<?php

namespace App\Http;

use Illuminate\Foundation\Http\Kernel as HttpKernel;

class Kernel extends HttpKernel
{
    /**
     * The application's global HTTP middleware stack.
     *
     * These middleware are run during every request to your application.
     *
     * @var array
     */
    protected $middleware = [
        \Illuminate\Foundation\Http\Middleware\CheckForMaintenanceMode::class,
    ];

    /**
     * The application's route middleware groups.
     *
     * @var array
     */
    protected $middlewareGroups = [
        'web' => [
            \App\Http\Middleware\EncryptCookies::class,
            \Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class,
            \Illuminate\Session\Middleware\StartSession::class,
            \Illuminate\View\Middleware\ShareErrorsFromSession::class,
            \App\Http\Middleware\VerifyCsrfToken::class,
        ],

        'api' => [
            'throttle:60,1',
        ],
    ];

    /**
     * The application's route middleware.
     *
     * These middleware may be assigned to groups or used individually.
     *
     * @var array
     */
    protected $routeMiddleware = [
        'auth' => \App\Http\Middleware\Authenticate::class,
        'auth.basic' => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class,
        'guest' => \App\Http\Middleware\RedirectIfAuthenticated::class,
        'throttle' => \Illuminate\Routing\Middleware\ThrottleRequests::class,

        // 新增 活动中间件
        'activity' =>  \App\Http\Middleware\Activity::class,
    ];
}

利用中间件

亚洲必赢官网 ,修改路由文件

// 创建活动路由
// Route::any('activity0', ['uses'=>'StudentController@activity0']);
// Route::any('activity1', ['uses'=>'StudentController@activity1']);
// Route::any('activity2', ['uses'=>'StudentController@activity2']);


// 活动开始页面 不需要做限制
Route::any('activity0', ['uses'=>'StudentController@activity0']);

// 使用中间件
Route::group(['middleware'=>['activity']], function(){
    Route::any('activity1', ['uses'=>'StudentController@activity1']);
    Route::any('activity2', ['uses'=>'StudentController@activity2']);
});

中间件的内置操作和前置操作

嵌入和前置的界别是:
前置在付出下叁个路由操作从前就早已 进行逻辑代码处理了
后置在交付下八个路由操作之后再拓展逻辑代码的处理

    /**
     * 中间件处理方法 方法名(handle)是固定的
     * @param  [type]  $request 请求对象
     * @param  Closure $next    处理包 中的方法
     * @return [type]           [description]
     */


    /* 
    // 请求前置操作
    public function handle($request, Closure $next)
    {

        // 如果时间未到
        // if (time() < strtotime('2016-11-20')) {
        if (time() < strtotime('2016-11-19')) {

            // 重定向到活动宣传页面
            return redirect('activity0');
        }

        // 如果时间到了  就继续匹配下面的路由  传入请求数据
        return $next($request);
    }
    */


    // 请求后置操作
    public function handle($request, Closure $next)
    {
        // 如果时间到了  就继续匹配下面的路由  传入请求数据
        $response =  $next($request);
        var_dump($response);

        // 逻辑代码
        echo '这是后面执行的操作,即后置操作。';
        exit;
    }

Laravel表单案例演示

案例演示

。。。。

静态能源管理及模板布局

asset()

透过该措施引入前端财富文件

<link rel="stylesheet" href="{{ asset('static/bootstrap/css/bootstrap.min.css') }}">

include

通过该方法 引入 分离的零件

表单列表及分页达成

// 通过  paginate(每页多少行)获取数据
$students = Student::paginate(2);


// 在前端使用 foreach 进行遍历 
@foreach($students as $student)
<tr>
    <th scope="row">{{ $student->id }}</th>
    <td>{{ $student->name }}</td>
    <td>{{ $student->age }}</td>
    <td>{{ $student->sex }}</td>
    <td>{{ date('Y-m-d', $student->created_at) }}</td>
    <td>
        <a href="{{ url('student/detail', ['id' => $student->id]) }}">详情</a>
        <a href="{{ url('student/update', ['id' => $student->id]) }}">修改</a>
        <a href="{{ url('student/delete', ['id' => $student->id]) }}"
                onclick="if (confirm('确定要删除吗?') == false) return false;">删除</a>
    </td>
</tr>
@endforeach


// 使用 自带的 render() 方法可以自动生成 分页的HTML 代码
{{ $students->render() }}

通过发表完成新增及操作意况提醒功效

采纳模型中的create 方法 创制数量

应用 模型对象创制数量

使用【WEB】中间件 默认 开启session 和 表单 令牌

在表单中新增 表单令牌组件

csrf_field()

表单验证及数码保持详解

即 数据保持 提交数据 出错后(逻辑处理) 数据还在input 中

return redirect()->back()->withErrors($validator)->withInput();

控制器验证

// 1. 控制器验证
/*
$this->validate($request, [
    'Student.name' => 'required|min:2|max:20',
    'Student.age' => 'required|integer',
    'Student.sex' => 'required|integer',
], [
    'required' => ':attribute 为必填项',
    'min' => ':attribute 长度不符合要求',
    'integer' => ':attribute 必须为整数',
], [
    'Student.name' => '姓名',
    'Student.age' => '年龄',
    'Student.sex' => '性别',
]);

validator

// 2. Validator类验证
$validator = \Validator::make($request->input(), [
    'Student.name' => 'required|min:2|max:20',
    'Student.age' => 'required|integer',
    'Student.sex' => 'required|integer',
], [
    'required' => ':attribute 为必填项',
    'min' => ':attribute 长度不符合要求',
    'integer' => ':attribute 必须为整数',
], [
    'Student.name' => '姓名',
    'Student.age' => '年龄',
    'Student.sex' => '性别',
]);

if ($validator->fails()) {
    return redirect()->back()->withErrors($validator)->withInput();
}


$data = $request->input('Student');

if (Student::create($data) ) {
    return redirect('student/index')->with('success', '添加成功!');
} else {
    return redirect()->back();
}

数据保持

使用 lod(); 方法 获取上一次请求 接收到的值
<input type="text" name="Student[name]"
                   value="{{ old('Student')['name'] ? old('Student')['name'] : $student->name }}"
                   class="form-control" id="name" placeholder="请输入学生姓名">

通过模型处理性别

模型代码

    // 数字转字符串
    public function sex($ind = null)
    {
        $arr = [
            self::SEX_UN => '未知',
            self::SEX_BOY => '男',
            self::SEX_GRIL => '女',
        ];

        if ($ind !== null) {
            return array_key_exists($ind, $arr) ? $arr[$ind] : $arr[self::SEX_UN];
        }

        return $arr;
    }

视图使用

<div class="col-sm-5">
    @foreach($student->sex() as $ind=>$val)
        <label class="radio-inline">
            <input type="radio" name="Student[sex]"
                   {{ isset($student->sex) && $student->sex == $ind ? 'checked' : ''  }}
                   value="{{ $ind }}"> {{ $val }}
        </label>
    @endforeach
</div>

通过表单实现修改

表表单中查阅详情及删除

laravel 表单课程计算

  • Request
  • Response
  • Session
  • Middleware
网站地图xml地图