• 50分钟学会Laravel 50个小技巧(基于laravel5.2,仅供参考)


    转载请注明:转载自 Yuansir-web菜鸟 | LAMP学习笔记

    本文链接地址: 50分钟学会Laravel 50个小技巧

    原文链接:《 50 Laravel Tricks in 50 Minutes by willroth 》
    Eloquent
    1.Automatic model validation

        class Post extends Eloquent
        {
            public static $autoValidate = true;
            protected static $rules = array();
         
            protected static function boot()
            {
                parent::boot();
                // You can also replace this with static::creating or static::updating
                static::saving(function ($model) {
                    if($model::$autoValidate) {
         
                        return $model->validate();
                    }
                });
            }
         
            public function validate() { }
        }

    2.Prevent updating

        class Post extends Eloquent
         
        {
            protected static function boot()
            {
                parent::boot();
                static::updating(function ($model) {
                    return false;
                });
            }
        }

    3.Conditional relationships

        class myModel extents Model
        {
             public function category()
             {
                 return $this->belongsTo('myCategoryModel', 'categories_id')->where('users_id', Auth::user()->id);
             }
        }

    4.Expressive where syntax

    $products = Product::where('category', '=', 3)->get();
    $products = Product::where('category', 3)->get();
    $products = Product::whereCategory(3)->get();

    5.Query builder:having raw

    SELECT *, COUNT(*) FROM products GROUP BY category_id HAVING count(*) > 1;

    DB::table('products')
        ->select('*', DB::raw('COUNT(*) as products_count'))
        ->groupBy('category_id')
        ->having('products_count', '>', 1)
        ->get();
    Product::groupBy('category_id')->havingRaw('COUNT(*) > 1')->get();

    6.Simple date filtering

    $q->whereDate('created_at', date('Y-m-d'));
    $q->whereDay('created_at', date('d'));
    $q->whereMonth('created_at', date('m'));
    $q->whereYear('created_at', date('Y'));

    7.Save options

        //src/Illuminate/Database/Eloquent/Model.php
        public function save(array $options = array());
         
         //src/Illuminate/Database/Eloquent/Model.php
        protected function performUpdate(Builder $query, array $options = [])
        {
            if($this->timestamps && array_get($options, 'timestamps', true)) {
                $this->updateTimestamps();
            }
         
         
            $product = Product::find($id);
            $product->updated_at = '2015 -01-01 10:00:00';
            $product->save(['timestamps' => false]);

    8.Multilingual support

        // database/migrations/create_articles_table.php
        public function up()
        {
            Schema::create('articles', function (Blueprint $table) {
                $table->increments('id');
                $table->boolean('online');
                $table->timestamps();
            });
        }
         
        //database/migrations/create_articles_table.php
        public function up()
        {
            $table->increments('id');
            $table->integer('article_id')->unsigned();
            $table->string('locale')->index();
            $table->string('name');
            $table->text('text');
            $table->unique(['article_id', 'locale']);
            $table->foreign('article_id')->references('id')->on('articles')->onDelete('cascade');
         
        }
         
        // app/Article.php
        class Article extends Model
        {
            use DimsavTranslatableTranslatable;
            public $translatedAttributes = ['name', 'text'];
        }
         
        // app/ArticleTranslation.php
        class ArticleTranslation extends Model
        {
            public $timestamps = false;
        }
         
        // app/http/routes.php
         
        Route::get('{locale}', function ($locale) {
            app()->setLocale($locale);
            $article = Article::first();
            return view('article')->with(compact('article'));
        });
         
        // resources/views/article.blade.php
         
        <h1>{{ $article->name }}</h1>
         
        {{ $article->text }}

    9.Retrieve random rows

    $questions = Question::orderByRaw('RAND()')->take(10)->get();

    10.uuid model primary key

        use RamseyUuidUuid;
         trait UUIDModel
         {
             public $incrementing = false;
             protected static function boot()
             {
                 parent::boot();
                 static::creating(function ($model) {
                     $key = $model->getKeyName();
                     if(empty($model->{$key})) {
                         $model->{$key} = (string)$model->generateNewId();
                     }
                 });
             }
         
             public function generateNewUuid()
             {
                 return Uuid::uuid4();
             }
         }

    11.Ordered relationships

    class Category extends Model
     {
         public function products()
         {
             return $this->hasMany('AppProduct')->orderBy('name');
         }
     }

    12.Simple incrementing & Decrementing

        $customer = Customer::find($customer_id);
        $loyalty_points = $customer->loyalty_points + 50;
        $customer->update(['loyalty_points' => $loyalty_points]);
         
        // adds one loyalty point
         
        Customer::find($customer_id)->increment('loyalty_points', 50);
        // subtracts one loyalty point
         
        Customer::find($customer_id)->decrement('loyalty_points', 50);

    13.List with mutations

        $employees = Employee::where('branch_id', 9)->lists('name', 'id');
        return view('customers . create', compact('employees'));
         
         {!! Form::select('employee_id', $employees, '') !!}
         
         public function getFullNameAttribute() {
             return $this->name . ' ' . $this->surname;
         }
         
         
         [2015-07-19 21:47:19] local.ERROR: exception 'PDOException' with message 'SQLSTATE[42S22]: Column not found:
         1054 Unknown column 'full_name' in 'field list'' in
         ...vendorlaravelframeworksrcIlluminateDatabaseConnection.php:288
         
         
        $employees = Employee::where('branch_id', 9)->get()->lists('full_name', 'id');

    14.Appending mutated properties

        function getFullNameAttribute()
        {
            return $this->first_name . ' ' . $this->last_name;
        }
         
         
        {
            "id":1,
            "first_name":"Povilas",
            "last_name":"Korop",
            "email":"[email protected]

    ", "created_at":"2015-06-19 08:16:58", "updated_at":"2015-06-19 19:48:09" } class User extends Model { protected $appends = ['full_name']; { "id":1, "first_name":"Povilas", "last_name":"Korop", "email":" [email protected]

    ", "created_at":"2015-06-19 08:16:58", "updated_at":"2015-06-19 19:48:09", "full_name":"Povilas Korop" }
    15.Filter only rows with child rows

        class Category extends Model
        {
            public function products()
            {
                return $this->hasMany('AppProduct');
            }
        }
         
        public function getIndex()
        {
            $categories = Category::with('products')->has('products')->get();
            return view('categories.index', compact('categories'));
        }

    16.Return relations on model save

        public function store()
        {
            $post = new Post;
            $post->fill(Input::all());
            $post->user_id = Auth::user()->user_id;
            $post->user;
            return $post->save();
         }

    Blade
    17.Dynamic with

        // eloquent
        Post::whereSlug('slug')->get();
         
        // instead of
        View::make('posts.index')->with('posts', $posts);
         
        // do this
        View::make('posts.index')->withPosts($posts);

    18.First/last array element

    //hide all but the first item

    @foreach ($menu as $item)

    <div @if ($item != reset($menu)) class="hidden" @endif>

    <h2>{{ $item->title }}</h2>

         </div>

     
    @endforeach


     //apply css to last item only

     @foreach ($menu as $item)


    <div @if ($item == end($menu)) class="no_margin" @endif>

    <h2>{{ $item->title }}</h2>

     </div>

     
    @endforeach

    Collections
    19.Arrays as collections

        $devs = [
            ['name' => 'Anouar Abdessalam', 'email' => '[email protected]

    '], ['name' => 'Bilal Ararou', 'email' => '[email protected]'] ]; $devs = new IlluminateSupportCollection($devs); $devs->first(); $devs->last(); $devs->push(['name' => 'xroot', 'email' => ' [email protected]

    ']);
    20.Collection filters

        $customers = Customer::all();
        $us_customers = $customers->filter(function ($customer) {
            return $customer->country == 'United States';
        });
         
        $non_uk_customers = $customers->reject(function ($customer) {
            return $customer->country == 'United Kingdom';
        });

    21.find()

        //    returns a single row as a collection
        $collection = AppPerson::find([1]);
         
        //    can return multiple rows as a collection
        $collection = AppPerson::find([1, 2, 3]);

    22.where()

    $collection = AppPerson::all();
    $programmers = $collection->where('type', 'programmer');
    $critic = $collection->where('type', 'critic');
    $engineer = $collection->where('type', 'engineer');

    23.implode()

    $collection = AppPerson::all();
    $names = $collection->implode('first_name', ',');

    24.where() & list()

        // returns a collection of first names
         
        $collection = AppPerson::all()->where('type', 'engineer')->lists('first_name');
         
        // returns all the meta records for user 1
        $collection = AppWP_Meta::whereUserId(1)->get();
         
        // returns the first & last name meta values
         
        $first_name = $collection->where('meta_key', 'first_name')->lists('value')[0];
        $last_name = $collection->where('meta_key', 'last_name')->lists('value')[0];

    25.order belongs-to-many by pivot table

        class Link extends Model
         
         {
             public function users()
             {
                 return $this->belongsToMany('PhpleaksUser')->withTimestamps();
             }
         }
         
         
        @if ($link->users->count() > 0)
        <strong>Recently Favorited By</strong>
         @foreach ($link->users()->orderBy('link_user.created_at', 'desc')->take(15)->get() as $user)
         
         
                <a href="{{ URL::Route('user.show', array('id' => $user->id)) }}">{{ $user->name }}</a>
             
         
         @endforeach
        @endif

    26.sorting with closures

        $collection = collect([
            ['name' => 'Desk'],
            ['name' => 'Chair'],
            ['name' => 'Bookcase']
        ]);
         
        $sorted = $collection->sortBy(function ($product, $key) {
            return array_search($product['name'], [1 => 'Bookcase', 2 => 'Desk', 3 => 'Chair']);
        });

    27.keying arrays

        $library = $books->keyBy('title');
         
        [
            'Lean Startup' => ['title' => 'Lean Startup', 'price' => 10],
            'The One Thing' => ['title' => 'The One Thing', 'price' => 15],
            'Laravel: Code Bright' => ['title' => 'Laravel: Code Bright', 'price' => 20],
            'The 4-Hour Work Week' => ['title' => 'The 4-Hour Work Week', 'price' => 5],
        ]

    28.grouped collections

    $collection = AppPerson::all();
    $grouped = $collection->groupBy('type');

    29.collection unions

        // the point is to actually combine results from different models
        $programmers = AppPerson::where('type', 'programmer')->get();
        $critic = AppPerson::where('type', 'critic')->get();
        $engineer = AppPerson::where('type', 'engineer')->get();
         
        $collection = new Collection;
         
        $all = $collection->merge($programmers)->merge($critic)->merge($engineer);

    30.collection lookaheads

        $collection = collect([1 => 11, 5 => 13, 12 => 14, 21 => 15])->getCachingIterator();
        foreach ($collection as $key => $value) {
            dump($collection->current() . ':' . $collection->getInnerIterator()->current());
        }

    Routing
    31.nested route groups

        Route::group(['prefix' => 'account', 'as' => 'account.'], function () {
         
            Route::get('login', ['as' => 'login', 'uses' => 'AccountController@getLogin']);
            Route::get('register', ['as' => 'register', 'uses' => 'AccountController@getRegister']);
         
            Route::group(['middleware' => 'auth'], function () {
                Route::get('edit', ['as' => 'edit', 'uses' => 'AccountController@getEdit']);
            });
         
        });
         
        <a href="{{ route('account.login') }}">Login</a>
        <a href="{{ route('account.register') }}">Register</a>
        <a href="{{ route('account.edit') }}">Edit Account</a>

    32.catch-all view route

        // app/Http/routes.php
         
        Route::group(['middleware' => 'auth'], function () {
            Route::get('{view}', function ($view) {
                try {
                    return view($view);
                } catch (Exception $e) {
                    abort(404);
                }
            })->where('view', '.*');
        });

    33.internal dispatch

        // api controller
         
        public function show(Car $car)
        {
            if(Input::has('fields')) {
                // do something
            }
        }
         
        // internal request to api - fields are lost
         
        $request = Request::create('/api/cars/' . $id . '?fields=id,color', 'GET');
        $response = json_decode(Route::dispatch($request)->getContent());
         
        // internal request to api - with fields $originalInput = Request::input();
         
        $request = Request::create('/api/cars/' . $id . '?fields=id,color', 'GET');
        Request::replace($request->input());
        $response = json_decode(Route::dispatch($request)->getContent());
        Request::replace($originalInput);

    Testing
    34.evironmental varlables

    // phpunit.xml

    <php>
        <env name="APP_ENV" value="testing"/>
        <env name="CACHE_DRIVER" value="array"/>
        <env name="SESSION_DRIVER" value="array"/>
        <env name="QUEUE_DRIVER" value="sync"/>
        <env name="DB_DATABASE" value=":memory:"/>
        <env name="DB_CONNECTION" value="sqlite"/>
        <env name="TWILIO_FROM_NUMBER" value="+15005550006"/>
    </php>


    //    .env.test – add to .gitignore
    TWILIO_ACCOUNT_SID = fillmein
    TWILIO_ACCOUNT_TOKEN = fillmein


    //    access directly from your tests using helper function
    env('TWILIO_ACCOUNT_TOKEN');


     // tests/TestCase.php <?php class TestCase extends IlluminateFoundationTestingTestCase { /** * The base URL to use while testing the application. * * @var string */ protected $baseUrl = 'http://localhost'; /** * Creates the application. * * @return IlluminateFoundationApplication */ public function createApplication() { $app = require __DIR__ . '/../bootstrap/app.php'; if(file_exists(dirname(__DIR__) . '/.env.test')) { Dotenv::load(dirname(__DIR__), '.env.test'); } $app->make(IlluminateContractsConsoleKernel::class)->bootstrap();
             return $app;
         }
     }

    35.run tests automatically

        // gulpfile.js
         
         var elixir = require('laravel-elixir');
         
         mix.phpUnit();
         
         $ gulp tdd

    36.share cookie between domains

        // app/Http/Middleware/EncryptCookies.php
        protected $except = [
            'shared_cookie'
         
        ];
         
        Cookie::queue('shared_cookie', 'my_shared_value', 10080, null, '.example.com');

    37.Easy model & migrations stubs

    $ artisan make:model Books -m

    38.add spark to existing project

    $ composer require genealabs/laravel-sparkinstaller --dev

     LaravelSparkProvidersSparkServiceProvider::class, GeneaLabsLaravelSparkInstallerProvidersLaravelSparkInstallerServiceProvider::class,

     //    do not run php artisan spark:install
     $ php artisan spark:upgrade

     //    backup /resources/views/home.blade.php or it will be overwritten
     $ php artisan vendor:publish --tag=spark-full

    39.customize the default error page

    <?php namespace AppExceptions; use Exception; use IlluminateFoundationExceptionsHandler as ExceptionHandler; use SymfonyComponentDebugExceptionHandler as SymfonyDisplayer; class Handler extends ExceptionHandler { protected function convertExceptionToResponse(Exception $e) { $debug = config('app.debug', false); if($debug) { return (new SymfonyDisplayer($debug))->createResponse($e);
            }

            return response()->view('errors.default', ['exception' => $e], 500);
        }
    }

    40.conditional service providers

        // app/Providers/AppServiceProvider.php
        public function register()
        {
            $this->app->bind('IlluminateContractsAuthRegistrar', 'AppServicesRegistrar');
         
            if($this->app->environment('production')) {
                $this->app->register('AppProvidersProductionErrorHandlerServiceProvider');
            } else {
                $this->app->register('AppProvidersVerboseErrorHandlerServiceProvider');
            }
        }

    43.extending the application

        //    bootstrap/app.php
         
        //    replace this:
        $app = new IlluminateFoundationApplication(realpath(__DIR__ . '/../'));
         
        // with this:
        $app = new FantabulousApplication(realpath(__DIR__ . '/../'));
         
        <?php namespace Fantabulous; class Application extends IlluminateFoundationApplication { /** * Get the path to the storage directory. * * @return string */ public function storagePath() { return $this->basePath . '/FantabulousStorage';
            }
        }

    44.simple chching microservice

        class fakeApiCaller
         {
             public function getResultsForPath($path)
             {
                 return [
                     'status' => 200,
                     'body' => json_encode([
                         'title' => "Results for path [$path]"
                     ]),
                     'headers' => [
                         "Content-Type" => "application/json"
                     ]
                 ];
             }
         }
         
         $app->get('{path?}', function ($path) {
             $result = Cache::remember($path, 60, function () use ($path) {
                 return (new fakeApiCaller)->getResultsForPath($path);
             });
         
             return response($result['body'], $result['status'], array_only($result['headers'], [
                     'Content-Type',
                     'X-Pagination'
                 ]));
         })->where('path', '.*');

    45.use bleeding edge version

        $ composer create - project laravel / laravel your-project-name-here dev-develop
         
         // composer.json
         {
             "require": {
             "php": ">=5.5.9", "laravel/framework": "5.2.*"
            },
            "minimum-stability": "dev"
         }
         
        $ composer update

    46.capture queries

        Event::listen('illuminate.query', function ($query) {
            var_dump($query);
         
        });
         
         
        DB::listen(function ($query, $bindings, $time) {
            var_dump($query);
         
            var_dump($bindings);
            var_dump($time);
         
        });

    47.authorization without models

        //    app/Policies/AdminPolicy.php
        class AdminPolicy
        {
            public function managePages($user)
            {
                return $user->hasRole(['Administrator', 'Content Editor']);
            }
        }
         
        //    app/Providers/AuthServiceProvider.php
         
        public function boot(IlluminateContractsAuthAccessGateContract $gate)
        {
            foreach (get_class_methods(new AppPoliciesAdminPolicy) as $method) {
                $gate->define($method, "AppPoliciesAdminPolicy@{$method}");
            }
            $this->registerPolicies($gate);
        }
         
         
        $this->authorize('managePages'); // in Controllers
        @can('managePages') // in Blade Templates
        $user->can('managePages'); // via Eloquent

    48.efficient file transfer with streams

    $disk = Storage::disk('s3');

    $disk->put($targetFile, file_get_contents($sourceFile));

    $disk = Storage::disk('s3');
    $disk->put($targetFile, fopen($sourceFile, 'r+'));

    $disk = Storage::disk('s3');

    $stream = $disk->getDriver()->readStream($sourceFileOnS3);
    file_put_contents($targetFile, stream_get_contents($stream), FILE_APPEND);

    $stream = Storage::disk('s3')->getDriver()->readStream($sourceFile);
    Storage::disk('sftp')->put($targetFile, $stream)

    49.avoid overflowing log files

        $schedule->call(function () {
            Storage::delete($logfile);
        })->weekly();

    50.pipeling

        $result = (new IlluminatePipelinePipeline($container)
            ->send($something)
            ->through('ClassOne', 'ClassTwo', 'ClassThree')
            ->then(function ($something) {
                return 'foo';
            });

    51.command handler dispatch

        class PurchasePodcastCommand extends Command
        {
            public $user;
            public $podcast;
            public function __construct(User $user, Podcast $podcast)
            {
                $this->user = $user;
                $this->podcast = $podcast;
            }
        }
         
        class PurchasePodcastCommandHandler
        {
            public function handle(BillingGateway $billing)
            {
                // Handle the logic to purchase the podcast...
         
                event(new PodcastWasPurchased($this->user, $this->podcast));
            }
        }
         
        class PodcastController extends Controller
        {
            public function purchasePodcastCommand($podcastId)
            {
                $this->dispatch(
                    new PurchasePodcast(Auth::user(), Podcast::findOrFail($podcastId))
                );
            }
        }

    52.self handling commands

        class PurchasePodcast extends Command implements SelfHandling
        {
            protected $user;
            protected $podcast;
         
            public function __construct(User $user, Podcast $podcast)
            {
                $this->user = $user;
                $this->podcast = $podcast;
            }
         
            public function handle(BillingGateway $billing)
            {
                // Handle the logic to purchase the podcast...
         
                event(new PodcastWasPurchased($this->user, $this->podcast));
            }
         
        }
         
        class PodcastController extends Controller
        {
            public function purchasePodcast($podcastId)
            {
                $this->dispatch(
                    new PurchasePodcast(Auth::user(), Podcast::findOrFail($podcastId))
                );
            }
        }

    53.automatic dispatch from requests

    class PodcastController extends Controller
    {
        public function purchasePodcast(PurchasePodcastRequest $request)
        {
            $this->dispatchFrom('FantabulousCommandsPurchasePodcastCommand', $request);
        }

    }


    class PodcastController extends Controller
    {
        public function purchasePodcast(PurchasePodcastRequest $request)
        {
            $this->dispatchFrom('FantabulousCommandsPurchasePodcastCommand', $request, [
                'firstName' => 'Taylor',
            ]);
        }
    }

    54.queued commands

        class PurchasePodcast extends Command implements ShouldBeQueued, SerializesModels
        {
            public $user;
            public $podcast;
         
            public function __construct(User $user, Podcast $podcast)
            {
                $this->user = $user;
                $this->podcast = $podcast;
            }
        }

    55.commands pipeline

        // AppProvidersBusServiceProvider::boot
        $dispatcher->pipeThrough(['UseDatabaseTransactions', 'LogCommand']);
         
        class UseDatabaseTransactions
        {
            public function handle($command, $next)
            {
                return DB::transaction(function () use ($command, $next) {
                    return $next($command);
                });
            }
        }
         
         
        // AppProvidersBusServiceProvider::boot
        $dispatcher->pipeThrough([
            function ($command, $next) {
                return DB::transaction(function () use ($command, $next) {
                    return $next($command);
                });
            }
        ]);

    Laravel 5.2
    56.implicit model binding

        // app/http/routes.php
         
        Route::get('/api/posts/{post}', function (Post $post) {
            return $post;
        });
         
        // behind the scenes
        Post::findOrFail($post);

    57.append scheduler autput to a file

    $schedule->command('emails:send')->hourly()->appendOutputTo($filePath);

    58.collections wildcard

    // returns titles for all posts

    $titles = $posts->pluck(‘posts .*.title’);

    59.formarray validation

    <input type="text" name="person[1][id]">
         <input type="text" name="person[1][name]">





        <input type="text" name="person[2][id]"> <input type="text" name="person[2][name]">



    $v = Validator:: make($request->all(), [
        'person.*.id' => 'exists:users.id',
        'person.*.name' => 'required:string',

    ]);

    60.easily clear user sessions

    // included in database session driver
    user_id
    ip_address

    转载请注明:转载自 Yuansir-web菜鸟 | LAMP学习笔记

    原文:https://blog.csdn.net/qq_15766181/article/details/71082129

  • 相关阅读:
    iOS 数字滚动 类似于老
    iOS 实现转盘的效果
    iOS 摇一摇的功能
    APP上架证书无效:解决
    iOS--UIAlertView与UIAlertController和UIAlertAction之间的事儿
    ios 获取字符串所需要占用的label的高度
    适配----Autolayout
    OC中 block 的用法
    微信小程序如何播放腾讯视频?
    IOS-UICollectionView
  • 原文地址:https://www.cnblogs.com/lxwphp/p/10727474.html
Copyright © 2020-2023  润新知