├── 5.0 ├── .gitignore ├── artisan.md ├── authentication.md ├── billing.md ├── cache.md ├── collections.md ├── commands.md ├── configuration.md ├── container.md ├── contracts.md ├── controllers.md ├── database.md ├── documentation.md ├── elixir.md ├── eloquent.md ├── encryption.md ├── envoy.md ├── errors.md ├── events.md ├── extending.md ├── facades.md ├── filesystem.md ├── hashing.md ├── helpers.md ├── installation.md ├── license.md ├── lifecycle.md ├── localization.md ├── mail.md ├── middleware.md ├── migrations.md ├── packages.md ├── pagination.md ├── providers.md ├── queries.md ├── queues.md ├── readme.md ├── redis.md ├── requests.md ├── responses.md ├── routing.md ├── schema.md ├── session.md ├── structure.md ├── templates.md ├── test.txt ├── testing.md ├── upgrade.md ├── validation.md └── views.md └── README.md /5.0/.gitignore: -------------------------------------------------------------------------------- 1 | /vendor 2 | /resources/docs 3 | /public/api 4 | /build/sami/build 5 | /build/sami/cache 6 | /node_modules 7 | composer.phar 8 | .env.* 9 | .env 10 | .DS_Store 11 | Thumbs.db 12 | -------------------------------------------------------------------------------- /5.0/artisan.md: -------------------------------------------------------------------------------- 1 | # Artisan CLI 2 | 3 | - [Introduction](#introduction) 4 | - [Usage](#usage) 5 | - [Calling Commands Outside Of CLI](#calling-commands-outside-of-cli) 6 | - [Scheduling Artisan Commands](#scheduling-artisan-commands) 7 | 8 | 9 | ## Introduction 10 | 11 | Artisan is the name of the command-line interface included with Laravel. It provides a number of helpful commands for your use while developing your application. It is driven by the powerful Symfony Console component. 12 | 13 | 14 | ## Usage 15 | 16 | #### Listing All Available Commands 17 | 18 | To view a list of all available Artisan commands, you may use the `list` command: 19 | 20 | php artisan list 21 | 22 | #### Viewing The Help Screen For A Command 23 | 24 | Every command also includes a "help" screen which displays and describes the command's available arguments and options. To view a help screen, simply precede the name of the command with `help`: 25 | 26 | php artisan help migrate 27 | 28 | #### Specifying The Configuration Environment 29 | 30 | You may specify the configuration environment that should be used while running a command using the `--env` switch: 31 | 32 | php artisan migrate --env=local 33 | 34 | #### Displaying Your Current Laravel Version 35 | 36 | You may also view the current version of your Laravel installation using the `--version` option: 37 | 38 | php artisan --version 39 | 40 | 41 | ## Calling Commands Outside Of CLI 42 | 43 | Sometimes you may wish to execute an Artisan command outside of the CLI. For example, you may wish to fire an Artisan command from an HTTP route. Just use the `Artisan` facade: 44 | 45 | Route::get('/foo', function() 46 | { 47 | $exitCode = Artisan::call('command:name', ['--option' => 'foo']); 48 | 49 | // 50 | }); 51 | 52 | You may even queue Artisan commands so they are processed in the background by your [queue workers](/docs/{{version}}/queues): 53 | 54 | Route::get('/foo', function() 55 | { 56 | Artisan::queue('command:name', ['--option' => 'foo']); 57 | 58 | // 59 | }); 60 | 61 | 62 | ## Scheduling Artisan Commands 63 | 64 | In the past, developers have generated a Cron entry for each console command they wished to schedule. However, this is a headache. Your console schedule is no longer in source control, and you must SSH into your server to add the Cron entries. Let's make our lives easier. The Laravel command scheduler allows you to fluently and expressively define your command schedule within Laravel itself, and only a single Cron entry is needed on your server. 65 | 66 | Your command schedule is stored in the `app/Console/Kernel.php` file. Within this class you will see a `schedule` method. To help you get started, a simple example is included with the method. You are free to add as many scheduled jobs as you wish to the `Schedule` object. The only Cron entry you need to add to your server is this: 67 | 68 | * * * * * php /path/to/artisan schedule:run 1>> /dev/null 2>&1 69 | 70 | This Cron will call the Laravel command scheduler every minute. Then, Laravel evaluates your scheduled jobs and runs the jobs that are due. It couldn't be easier! 71 | 72 | ### More Scheduling Examples 73 | 74 | Let's look at a few more scheduling examples: 75 | 76 | #### Scheduling Closures 77 | 78 | $schedule->call(function() 79 | { 80 | // Do some task... 81 | 82 | })->hourly(); 83 | 84 | #### Scheduling Terminal Commands 85 | 86 | $schedule->exec('composer self-update')->daily(); 87 | 88 | #### Manual Cron Expression 89 | 90 | $schedule->command('foo')->cron('* * * * *'); 91 | 92 | #### Frequent Jobs 93 | 94 | $schedule->command('foo')->everyFiveMinutes(); 95 | 96 | $schedule->command('foo')->everyTenMinutes(); 97 | 98 | $schedule->command('foo')->everyThirtyMinutes(); 99 | 100 | #### Daily Jobs 101 | 102 | $schedule->command('foo')->daily(); 103 | 104 | #### Daily Jobs At A Specific Time (24 Hour Time) 105 | 106 | $schedule->command('foo')->dailyAt('15:00'); 107 | 108 | #### Twice Daily Jobs 109 | 110 | $schedule->command('foo')->twiceDaily(); 111 | 112 | #### Job That Runs Every Weekday 113 | 114 | $schedule->command('foo')->weekdays(); 115 | 116 | #### Weekly Jobs 117 | 118 | $schedule->command('foo')->weekly(); 119 | 120 | // Schedule weekly job for specific day (0-6) and time... 121 | $schedule->command('foo')->weeklyOn(1, '8:00'); 122 | 123 | #### Monthly Jobs 124 | 125 | $schedule->command('foo')->monthly(); 126 | 127 | #### Job That Runs On Specific Days 128 | 129 | $schedule->command('foo')->mondays(); 130 | $schedule->command('foo')->tuesdays(); 131 | $schedule->command('foo')->wednesdays(); 132 | $schedule->command('foo')->thursdays(); 133 | $schedule->command('foo')->fridays(); 134 | $schedule->command('foo')->saturdays(); 135 | $schedule->command('foo')->sundays(); 136 | 137 | #### Prevent Jobs From Overlapping 138 | 139 | By default, scheduled jobs will be run even if the previous instance of the job is still running. To prevent this, you may use the `withoutOverlapping` method: 140 | 141 | $schedule->command('foo')->withoutOverlapping(); 142 | 143 | In this example, the `foo` command will be run every minute if it is not already running. 144 | 145 | #### Limit The Environment The Jobs Should Run In 146 | 147 | $schedule->command('foo')->monthly()->environments('production'); 148 | 149 | #### Indicate The Job Should Run Even When Application Is In Maintenance Mode 150 | 151 | $schedule->command('foo')->monthly()->evenInMaintenanceMode(); 152 | 153 | #### Only Allow Job To Run When Callback Is True 154 | 155 | $schedule->command('foo')->monthly()->when(function() 156 | { 157 | return true; 158 | }); 159 | 160 | #### E-mail The Output Of A Scheduled Job 161 | 162 | $schedule->command('foo')->sendOutputTo($filePath)->emailOutputTo('foo@example.com'); 163 | 164 | > **Note:** You must send the output to a file before it can be mailed. 165 | 166 | #### Send The Output Of The Scheduled Job To A Given Location 167 | 168 | $schedule->command('foo')->sendOutputTo($filePath); 169 | 170 | #### Ping A Given URL After The Job Runs 171 | 172 | $schedule->command('foo')->thenPing($url); 173 | 174 | Using the `thenPing($url)` feature requires the Guzzle HTTP library. You can add Guzzle 5 to your project by adding the following line to your `composer.json` file: 175 | 176 | "guzzlehttp/guzzle": "~5.0" 177 | -------------------------------------------------------------------------------- /5.0/cache.md: -------------------------------------------------------------------------------- 1 | # Cache 2 | 3 | - [Configuration](#configuration) 4 | - [Cache Usage](#cache-usage) 5 | - [Increments & Decrements](#increments-and-decrements) 6 | - [Cache Tags](#cache-tags) 7 | - [Cache Events](#cache-events) 8 | - [Database Cache](#database-cache) 9 | - [Memcached Cache](#memcached-cache) 10 | - [Redis Cache](#redis-cache) 11 | 12 | 13 | ## Configuration 14 | 15 | Laravel provides a unified API for various caching systems. The cache configuration is located at `config/cache.php`. In this file you may specify which cache driver you would like used by default throughout your application. Laravel supports popular caching backends like [Memcached](http://memcached.org) and [Redis](http://redis.io) out of the box. 16 | 17 | The cache configuration file also contains various other options, which are documented within the file, so make sure to read over these options. By default, Laravel is configured to use the `file` cache driver, which stores the serialized, cached objects in the filesystem. For larger applications, it is recommended that you use an in-memory cache such as Memcached or APC. You may even configure multiple cache configurations for the same driver. 18 | 19 | Before using a Redis cache with Laravel, you will need to install the `predis/predis` package (~1.0) via Composer. 20 | 21 | 22 | ## Cache Usage 23 | 24 | #### Storing An Item In The Cache 25 | 26 | Cache::put('key', 'value', $minutes); 27 | 28 | #### Using Carbon Objects To Set Expire Time 29 | 30 | $expiresAt = Carbon::now()->addMinutes(10); 31 | 32 | Cache::put('key', 'value', $expiresAt); 33 | 34 | #### Storing An Item In The Cache If It Doesn't Exist 35 | 36 | Cache::add('key', 'value', $minutes); 37 | 38 | The `add` method will return `true` if the item is actually **added** to the cache. Otherwise, the method will return `false`. 39 | 40 | #### Checking For Existence In Cache 41 | 42 | if (Cache::has('key')) 43 | { 44 | // 45 | } 46 | 47 | #### Retrieving An Item From The Cache 48 | 49 | $value = Cache::get('key'); 50 | 51 | #### Retrieving An Item Or Returning A Default Value 52 | 53 | $value = Cache::get('key', 'default'); 54 | 55 | $value = Cache::get('key', function() { return 'default'; }); 56 | 57 | #### Storing An Item In The Cache Permanently 58 | 59 | Cache::forever('key', 'value'); 60 | 61 | Sometimes you may wish to retrieve an item from the cache, but also store a default value if the requested item doesn't exist. You may do this using the `Cache::remember` method: 62 | 63 | $value = Cache::remember('users', $minutes, function() 64 | { 65 | return DB::table('users')->get(); 66 | }); 67 | 68 | You may also combine the `remember` and `forever` methods: 69 | 70 | $value = Cache::rememberForever('users', function() 71 | { 72 | return DB::table('users')->get(); 73 | }); 74 | 75 | Note that all items stored in the cache are serialized, so you are free to store any type of data. 76 | 77 | #### Pulling An Item From The Cache 78 | 79 | If you need to retrieve an item from the cache and then delete it, you may use the `pull` method: 80 | 81 | $value = Cache::pull('key'); 82 | 83 | #### Removing An Item From The Cache 84 | 85 | Cache::forget('key'); 86 | 87 | #### Access Specific Cache Stores 88 | 89 | When using multiple cache stores, you may access them via the `store` method: 90 | 91 | $value = Cache::store('foo')->get('key'); 92 | 93 | 94 | ## Increments & Decrements 95 | 96 | All drivers except `database` support the `increment` and `decrement` operations: 97 | 98 | #### Incrementing A Value 99 | 100 | Cache::increment('key'); 101 | 102 | Cache::increment('key', $amount); 103 | 104 | #### Decrementing A Value 105 | 106 | Cache::decrement('key'); 107 | 108 | Cache::decrement('key', $amount); 109 | 110 | 111 | ## Cache Tags 112 | 113 | > **Note:** Cache tags are not supported when using the `file` or `database` cache drivers. Furthermore, when using multiple tags with caches that are stored "forever", performance will be best with a driver such as `memcached`, which automatically purges stale records. 114 | 115 | #### Accessing A Tagged Cache 116 | 117 | Cache tags allow you to tag related items in the cache, and then flush all caches tagged with a given name. To access a tagged cache, use the `tags` method. 118 | 119 | You may store a tagged cache by passing in an ordered list of tag names as arguments, or as an ordered array of tag names: 120 | 121 | Cache::tags('people', 'authors')->put('John', $john, $minutes); 122 | 123 | Cache::tags(['people', 'artists'])->put('Anne', $anne, $minutes); 124 | 125 | You may use any cache storage method in combination with tags, including `remember`, `forever`, and `rememberForever`. You may also access cached items from the tagged cache, as well as use the other cache methods such as `increment` and `decrement`. 126 | 127 | #### Accessing Items In A Tagged Cache 128 | 129 | To access a tagged cache, pass the same ordered list of tags used to save it. 130 | 131 | $anne = Cache::tags('people', 'artists')->get('Anne'); 132 | 133 | $john = Cache::tags(['people', 'authors'])->get('John'); 134 | 135 | You may flush all items tagged with a name or list of names. For example, this statement would remove all caches tagged with either `people`, `authors`, or both. So, both "Anne" and "John" would be removed from the cache: 136 | 137 | Cache::tags('people', 'authors')->flush(); 138 | 139 | In contrast, this statement would remove only caches tagged with `authors`, so "John" would be removed, but not "Anne". 140 | 141 | Cache::tags('authors')->flush(); 142 | 143 | 144 | ## Cache Events 145 | 146 | To execute code on every cache operation, you may listen for the events fired by the cache: 147 | 148 | Event::listen('cache.hit', function($key, $value) { 149 | // 150 | }); 151 | 152 | Event::listen('cache.missed', function($key) { 153 | // 154 | }); 155 | 156 | Event::listen('cache.write', function($key, $value, $minutes) { 157 | // 158 | }); 159 | 160 | Event::listen('cache.delete', function($key) { 161 | // 162 | }); 163 | 164 | 165 | ## Database Cache 166 | 167 | When using the `database` cache driver, you will need to setup a table to contain the cache items. You'll find an example `Schema` declaration for the table below: 168 | 169 | Schema::create('cache', function($table) 170 | { 171 | $table->string('key')->unique(); 172 | $table->text('value'); 173 | $table->integer('expiration'); 174 | }); 175 | 176 | 177 | #### Memcached Cache 178 | 179 | Using the Memcached cache requires the [Memcached PECL package](http://pecl.php.net/package/memcached) to be installed. 180 | 181 | The default [configuration](#configuration) uses TCP/IP based on [Memcached::addServer](http://php.net/manual/en/memcached.addserver.php): 182 | 183 | 'memcached' => array( 184 | array('host' => '127.0.0.1', 'port' => 11211, 'weight' => 100), 185 | ), 186 | 187 | You may also set the `host` option to a UNIX socket path. If you do this, the `port` option should be set to `0`: 188 | 189 | 'memcached' => array( 190 | array('host' => '/var/run/memcached/memcached.sock', 'port' => 0, 'weight' => 100), 191 | ), 192 | 193 | 194 | #### Redis Cache 195 | 196 | See [Redis Configuration](/docs/redis#configuration) 197 | -------------------------------------------------------------------------------- /5.0/collections.md: -------------------------------------------------------------------------------- 1 | # Collections 2 | 3 | - [Introduction](#introduction) 4 | - [Basic Usage](#basic-usage) 5 | 6 | 7 | ## Introduction 8 | 9 | The `Illuminate\Support\Collection` class provides a fluent, convenient wrapper for working with arrays of data. For example, check out the following code. We'll use the `collect` helper to create a new collection instance from the array: 10 | 11 | $collection = collect(['taylor', 'abigail', null])->map(function($name) 12 | { 13 | return strtoupper($name); 14 | }) 15 | ->reject(function($name) 16 | { 17 | return empty($name); 18 | }); 19 | 20 | 21 | As you can see, the `Collection` class allows you to chain its methods to perform fluent mapping and reducing of the underlying array. In general, every `Collection` method returns an entirely new `Collection` instance. To dig in further, keep reading! 22 | 23 | 24 | ## Basic Usage 25 | 26 | #### Creating Collections 27 | 28 | As mentioned above, the `collect` helper will return a new `Illuminate\Support\Collection` instance for the given array. You may also use the `make` command on the `Collection` class: 29 | 30 | $collection = collect([1, 2, 3]); 31 | 32 | $collection = Collection::make([1, 2, 3]); 33 | 34 | Of course, collections of [Eloquent](/docs/{{version}}/eloquent) objects are always returned as `Collection` instances; however, you should feel free to use the `Collection` class wherever it is convenient for your application. 35 | 36 | #### Explore The Collection 37 | 38 | Instead of listing all of the methods (there are a lot) the Collection makes available, check out the [API documentation for the class](http://laravel.com/api/master/Illuminate/Support/Collection.html)! 39 | -------------------------------------------------------------------------------- /5.0/commands.md: -------------------------------------------------------------------------------- 1 | # Artisan Development 2 | 3 | - [Introduction](#introduction) 4 | - [Building A Command](#building-a-command) 5 | - [Registering Commands](#registering-commands) 6 | 7 | 8 | ## Introduction 9 | 10 | In addition to the commands provided with Artisan, you may also build your own custom commands for working with your application. You may store your custom commands in the `app/Console/Commands` directory; however, you are free to choose your own storage location as long as your commands can be autoloaded based on your `composer.json` settings. 11 | 12 | 13 | ## Building A Command 14 | 15 | ### Generating The Class 16 | 17 | To create a new command, you may use the `make:console` Artisan command, which will generate a command stub to help you get started: 18 | 19 | #### Generate A New Command Class 20 | 21 | php artisan make:console FooCommand 22 | 23 | The command above would generate a class at `app/Console/Commands/FooCommand.php`. 24 | 25 | When creating the command, the `--command` option may be used to assign the terminal command name: 26 | 27 | php artisan make:console AssignUsers --command=users:assign 28 | 29 | ### Writing The Command 30 | 31 | Once your command is generated, you should fill out the `name` and `description` properties of the class, which will be used when displaying your command on the `list` screen. 32 | 33 | The `fire` method will be called when your command is executed. You may place any command logic in this method. 34 | 35 | ### Arguments & Options 36 | 37 | The `getArguments` and `getOptions` methods are where you may define any arguments or options your command receives. Both of these methods return an array of commands, which are described by a list of array options. 38 | 39 | When defining `arguments`, the array definition values represent the following: 40 | 41 | [$name, $mode, $description, $defaultValue] 42 | 43 | The argument `mode` may be any of the following: `InputArgument::REQUIRED` or `InputArgument::OPTIONAL`. 44 | 45 | When defining `options`, the array definition values represent the following: 46 | 47 | [$name, $shortcut, $mode, $description, $defaultValue] 48 | 49 | For options, the argument `mode` may be: `InputOption::VALUE_REQUIRED`, `InputOption::VALUE_OPTIONAL`, `InputOption::VALUE_IS_ARRAY`, `InputOption::VALUE_NONE`. 50 | 51 | The `VALUE_IS_ARRAY` mode indicates that the switch may be used multiple times when calling the command: 52 | 53 | InputOption::VALUE_REQUIRED | InputOption::VALUE_IS_ARRAY 54 | 55 | Would then allow for this command: 56 | 57 | php artisan foo --option=bar --option=baz 58 | 59 | The `VALUE_NONE` option indicates that the option is simply used as a "switch": 60 | 61 | php artisan foo --option 62 | 63 | ### Retrieving Input 64 | 65 | While your command is executing, you will obviously need to access the values for the arguments and options accepted by your application. To do so, you may use the `argument` and `option` methods: 66 | 67 | #### Retrieving The Value Of A Command Argument 68 | 69 | $value = $this->argument('name'); 70 | 71 | #### Retrieving All Arguments 72 | 73 | $arguments = $this->argument(); 74 | 75 | #### Retrieving The Value Of A Command Option 76 | 77 | $value = $this->option('name'); 78 | 79 | #### Retrieving All Options 80 | 81 | $options = $this->option(); 82 | 83 | ### Writing Output 84 | 85 | To send output to the console, you may use the `info`, `comment`, `question` and `error` methods. Each of these methods will use the appropriate ANSI colors for their purpose. 86 | 87 | #### Sending Information To The Console 88 | 89 | $this->info('Display this on the screen'); 90 | 91 | #### Sending An Error Message To The Console 92 | 93 | $this->error('Something went wrong!'); 94 | 95 | ### Asking Questions 96 | 97 | You may also use the `ask` and `confirm` methods to prompt the user for input: 98 | 99 | #### Asking The User For Input 100 | 101 | $name = $this->ask('What is your name?'); 102 | 103 | #### Asking The User For Secret Input 104 | 105 | $password = $this->secret('What is the password?'); 106 | 107 | #### Asking The User For Confirmation 108 | 109 | if ($this->confirm('Do you wish to continue? [yes|no]')) 110 | { 111 | // 112 | } 113 | 114 | You may also specify a default value to the `confirm` method, which should be `true` or `false`: 115 | 116 | $this->confirm($question, true); 117 | 118 | ### Calling Other Commands 119 | 120 | Sometimes you may wish to call other commands from your command. You may do so using the `call` method: 121 | 122 | $this->call('command:name', ['argument' => 'foo', '--option' => 'bar']); 123 | 124 | 125 | ## Registering Commands 126 | 127 | #### Registering An Artisan Command 128 | 129 | Once your command is finished, you need to register it with Artisan so it will be available for use. This is typically done in the `app/Console/Kernel.php` file. Within this file, you will find a list of commands in the `commands` property. To register your command, simply add it to this list. 130 | 131 | protected $commands = [ 132 | 'App\Console\Commands\FooCommand' 133 | ]; 134 | 135 | When Artisan boots, all the commands listed in this property will be resolved by the [service container](/docs/{{version}}/container) and registered with Artisan. 136 | -------------------------------------------------------------------------------- /5.0/configuration.md: -------------------------------------------------------------------------------- 1 | # پیکربندی 2 | 3 | - [آشنایی](#introduction) 4 | - [پس از نصب](#after-installation) 5 | - [دستیابی به مقادیر پیکربندی](#accessing-configuration-values) 6 | - [پیکربندی محیط کاری](#environment-configuration) 7 | - [پیکربندی کش](#configuration-caching) 8 | - [حالت نگاهداری](#maintenance-mode) 9 | - [آدرسهای خوانا - Pretty URLs](#pretty-urls) 10 | 11 | 12 | ## آشنایی 13 | 14 | تمامی فایلهای پیکربندی فریمورک لاراول در دایرکتوری `config` قرار دارند. هر گزینه مستند شده است، بنابراین برای بررسی گزینه ها با میتوانید فایلها را ببینید و با گزینه هایی که در اختیار شما قرار گرفته اند آشنا شوید. 15 | 16 | 17 | ## پس از نصب 18 | 19 | ### نامگذاری نرم افزار 20 | 21 | پس از نصب لاراول، میتوانید نرم افزار خود را نامگذاری نمایید. به صورت پیش فرض، دایرکتوری `app` تحت فضای نام `App` قرار گرفته است، و توسط کامپوزر توسط [استاندارد بارگذاری خودکار PSR-4](http://www.php-fig.org/psr/psr-4/) خودکار بارگذاری میگردد. هرچند میتوانید فضای نام را متناسب با نرم افزار خود تغییر دهید. این کار را به آسانی از طریق فرمان آرتیزان `app:name` انجام دهید. 22 | 23 | برای مثال، اگر نام نرم افزار کاربردی وب شما "larabook" باشد، کافیست دستور زیر را از بالاترین پوشه پروژه خود اجرا نمایید: 24 | 25 | php artisan app:name larabook 26 | 27 | تغییر نام نرم افزار کاملا اختیاری است، و برای نگاه داشتن فضای نام `App` کاملا آزاد هستید. 28 | 29 | ### دیگر تنظیمات 30 | 31 | لاراول تقریبا تنظیمات کمی دارد. میتوانید شروع به توسعه نرم افزارهای کاربردی تحت وب نمایید! هرچند میتوانید فایل `config/app.php` 32 | و مستندات آن را مرور نمایید. این فایل شامل گزینه ها بسیار زیادی مانند `timezone` یا `ناحیه زمانی` و `locale` یا `تنظیمات محلی` میباشد که میتوانید متناسب با نرم افزار تحت وب خود تغییر دهید. 33 | 34 | پس از نصب لاراول، همچنین باید [تنظیمات محلی خود را هم تغییر دهید](/docs/{{version}}/configuration#environment-configuration). 35 | 36 | > **نکته:** هیچگاه برای نرم افزارهای کاربردی واقعی مقدار `app.debug` را `true` نگذارید. 37 | 38 | 39 | ### دسترسی ها 40 | 41 | شاید نیاز باشد برخی دسترسی ها برای لاراول تعریف شود: وب سرور برای اعمال تغییرات در پوشه های `storage` و `vendor` نیازمند دسترسی کافی برای نوشتن میباشد 42 | 43 | 44 | ## دسترسی به مقادیر پیکربندی 45 | 46 | با استفاده از فاساد `Config` میتوانید به راحتی به مقادیر پیکربندی خود دسترسی داشته باشید. 47 | 48 | $value = Config::get('app.timezone'); 49 | 50 | Config::set('app.timezone', 'America/Chicago'); 51 | 52 | همچنین میتوانید از تابع کمکی `config` نیز استفاده نمایید: 53 | 54 | $value = config('app.timezone'); 55 | 56 | 57 | ## تنظمیات متغیرهای محلی 58 | 59 | داشتن تنظمیات متناسب با محیط کاری که نرم افزار در آن اجرا میشود میتواند مفید باشد. برای مثال، ممکن است از یک درایور کش متفاوت از آنچه بر روی سرور خود استفاده میکنید، در محیط توسعه محلی خود استفاده نمایید. این کار با کمک پیکربندی مبتنی بر متغیرهای محلی امکان پذیر است. 60 | 61 | برای روشنتر شدن موضوع، لاراول از کتابخانه پی اچ پی [DotEnv](https://github.com/vlucas/phpdotenv) توسط که Vance Lucas نوشته شده استفاده مینماید. در یک پروژه خام لاراول، دایرکتوری ریشه نرم افزار شامل یک فایل `env.example.` میباشد. اگر لاراول را با استفاده از کامپوزر نصب کنید، این فایل خودکار به `env.` تغییر نام میدهد. در غیر اینصورت، شما باید دستی این فایل را تغییر نام دهید. 62 | 63 | هنگامی که نرم افزار درخواستی دریافت میکند، تمامی متغیرهای لیست شده، در متغیر فراگلوبال PHP، `$_ENV` بارگذاری میشوند. میتوانید از تابع کمکی `env` برای خواندن مقادیر از این متغیرها استفاده نمایید. در واقع، اگر فایلهای پیکربندی لاراول را بررسی نمایید، متوجه خواهید شد بسیاری از گزینه ها، خود از این تابع کمکی استفاده میکنند. 64 | 65 | به راحتی و بدون دغدغه میتوانید این متغیرهای محیطی را متناسب با نیاز بر روی سرور محلی یا محیط تجاری مقداردهی نمایید. فایل `env.` نباید بر روی محیط کنترل منبعتان قرار بگیرد، چراکه هر توسعه دهنده / سرور که از نرم افزار شمااستفاده میکند پیکربندی متغیرهای محلی اختصاصی خود را داراست. 66 | 67 | اگر کار توسعه را در قالب یک تیم انجام میدهید، بهتر است فایل `env.example.` را در کنار نرم افزار کاربردی خود نگاه دارید. با قراردادن قراردادهایی، دیگر توسعه دهندگان متوجه خواهند شد کدام متغیر محیطی برای اجرای نرم افزار نیاز است. 68 | 69 | #### دسترسی به متغیرهای محیطی نرم افزار جاری 70 | 71 | برای دسترسی به متغیرهای محلی نرم افزار میتوانید از متد `environment` بر روی نمونه ای از `Application` استفاده کنید: 72 | 73 | $environment = $app->environment(); 74 | 75 | همچنین میتوانید آرگومانهایی را به متد `environment` بفرستید تا مقدار ارائه شده را مقدار متغیر محلی مقایسه کنید: 76 | 77 | if ($app->environment('local')) 78 | { 79 | // The environment is local 80 | } 81 | 82 | if ($app->environment('local', 'staging')) 83 | { 84 | // The environment is either local OR staging... 85 | } 86 | 87 | برای ایجاد نمونه ای از اپلیکیشن، کانترکت `Illuminate\Contracts\Foundation\Application` را از طریق [service container](/docs/{{version}}/container) بیابید . 88 | 89 | نمونه اپلیکیشن همچنین میتواند از طریق تابع کمکی `app` یا فاساد `App` نیز مورد استفاده قرار گیرد: 90 | 91 | $environment = app()->environment(); 92 | 93 | $environment = App::environment(); 94 | 95 | 96 | ## کش کردن پیکربندی 97 | 98 | برای افزایش سرعت نرم افزار کاربردیتان، میتوانید با استفاده از فرمان آرتیزان `config:cache` تمام فایلهای پیکربندی خود را در یک فایل کش نمایید. این فرمان تمامی گزینه های پیکربندی نرم افزارتان را در یک فایل که میتواند به سرعت توسط فریمورک لاراول بارگذاری شود ترکیب نماید. 99 | 100 | معمولا باید فرمان `config:cache` را به عنوان بخشی از عملیات دیپلوی اجرا نمایید. 101 | 102 | 103 | ## حالت نگهداری 104 | 105 | هنگامی که نرم افزار شما در حالت نگهداری باشد، یک نمای مشخص برای تمامی درخواستهای ارسال شده برای نرم افزار کاربردی نمایش داده میشود. این کار غیرفعال کردن نرم افزار را هنگامی که مشغول به روزرسانی نرم افزار یا انجام فعالیتهای نگهداری هستید آسان میکند. چک حالت نگهداری در middleware پیش فرض نرم افزار شما قرار دارد. در صورتیکه نرم افزار کاربردی شما در حالت نگهداری باشد، یک `HttpException` با کد وضعیت 503 ایجاد میشود. 106 | 107 | برای فعالسازی حالت نگهداری، به سادگی فرمان آرتیزان `down` را اجرا نمایید: 108 | 109 | php artisan down 110 | 111 | و همچنین برای غیرفعال نمودن حالت نگهداری از فرمان `up` استفاده نمایید: 112 | 113 | php artisan up 114 | 115 | ### قالب پاسخ حالت نگهداری 116 | 117 | قالب پیش فرض برای پاسخ حالت نگهداری در `resources/views/errors/503.blade.php` قرار دارد. 118 | 119 | ### حالت نگهداری و صفها 120 | 121 | درحالیکه نرم افزار کاربردی شما در حالت نگهداری است، هیچ یک از [وظیفه های صف وظایف](/docs/{{version}}/queues) انجام نمیشوند. پس از آنکه نرم افزار از حالت نگهداری خارج شد [queued jobs](/docs/{{version}}/queues) به شکل نرمال انجام می شوند. 122 | 123 | 124 | ## آدرسهای خوانا - Pretty URLs 125 | 126 | ### آپاچی 127 | 128 | لاراول به همراه یک فایل `public/.htaccess` به منظور ایجاد امکان ایجاد URLهای بدون `index.php` ارائه میشود. اگر برای اجرای نرم افزار خود از آپاچی استفاده میکنید، مطمئن شوید ماژول `mod_rewrite` را فعال نموده اید. 129 | 130 | اگر فایل `.htaccess` ارائه شده در کنار لاراول کار نمیکند، میتوانید راه حل زیر را امتحان کنید. 131 | 132 | Options +FollowSymLinks 133 | RewriteEngine On 134 | 135 | RewriteCond %{REQUEST_FILENAME} !-d 136 | RewriteCond %{REQUEST_FILENAME} !-f 137 | RewriteRule ^ index.php [L] 138 | 139 | اگر هاستی که استفاده میکنید اجازه استفاده از گزینه `FollowSymlinks` را نمیدهد، آن را با `Options +SymLinksIfOwnerMatch` جایگزین نمایید. 140 | 141 | ### Nginx 142 | بر روی Ngnix راهنمای سرور زیر در تنظیمات سرور امکان pretty URL (آدرسهای خوانا) را فراهم میکند. 143 | 144 | location / { 145 | try_files $uri $uri/ /index.php?$query_string; 146 | } 147 | 148 | البته هنگامی که از [Homestead](/docs/{{version}}/homestead) استفاده میکنید، آدرسهای خوانا به شکل خودکار تنظیم می شوند. -------------------------------------------------------------------------------- /5.0/contracts.md: -------------------------------------------------------------------------------- 1 | # Contracts 2 | 3 | - [Introduction](#introduction) 4 | - [Why Contracts?](#why-contracts) 5 | - [Contract Reference](#contract-reference) 6 | - [How To Use Contracts](#how-to-use-contracts) 7 | 8 | 9 | ## Introduction 10 | 11 | Laravel's Contracts are a set of interfaces that define the core services provided by the framework. For example, a `Queue` contract defines the methods needed for queueing jobs, while the `Mailer` contract defines the methods needed for sending e-mail. 12 | 13 | Each contract has a corresponding implementation provided by the framework. For example, Laravel provides a `Queue` implementation with a variety of drivers, and a `Mailer` implementation that is powered by [SwiftMailer](http://swiftmailer.org/). 14 | 15 | All of the Laravel contracts live in [their own GitHub repository](https://github.com/illuminate/contracts). This provides a quick reference point for all available contracts, as well as a single, decoupled package that may be utilized by other package developers. 16 | 17 | 18 | ## Why Contracts? 19 | 20 | You may have several questions regarding contracts. Why use interfaces at all? Isn't using interfaces more complicated? 21 | 22 | Let's distill the reasons for using interfaces to the following headings: loose coupling and simplicity. 23 | 24 | ### Loose Coupling 25 | 26 | First, let's review some code that is tightly coupled to a cache implementation. Consider the following: 27 | 28 | cache = $cache; 46 | } 47 | 48 | /** 49 | * Retrieve an Order by ID. 50 | * 51 | * @param int $id 52 | * @return Order 53 | */ 54 | public function find($id) 55 | { 56 | if ($this->cache->has($id)) 57 | { 58 | // 59 | } 60 | } 61 | 62 | } 63 | 64 | In this class, the code is tightly coupled to a given cache implementation. It is tightly coupled because we are depending on a concrete Cache class from a package vendor. If the API of that package changes our code must change as well. 65 | 66 | Likewise, if we want to replace our underlying cache technology (Memcached) with another technology (Redis), we again will have to modify our repository. Our repository should not have so much knowledge regarding who is providing them data or how they are providing it. 67 | 68 | **Instead of this approach, we can improve our code by depending on a simple, vendor agnostic interface:** 69 | 70 | cache = $cache; 85 | } 86 | 87 | } 88 | 89 | Now the code is not coupled to any specific vendor, or even Laravel. Since the contracts package contains no implementation and no dependencies, you may easily write an alternative implementation of any given contract, allowing you to replace your cache implementation without modifying any of your cache consuming code. 90 | 91 | ### Simplicity 92 | 93 | When all of Laravel's services are neatly defined within simple interfaces, it is very easy to determine the functionality offered by a given service. **The contracts serve as succinct documentation to the framework's features.** 94 | 95 | In addition, when you depend on simple interfaces, your code is easier to understand and maintain. Rather than tracking down which methods are available to you within a large, complicated class, you can refer to a simple, clean interface. 96 | 97 | 98 | ## Contract Reference 99 | 100 | This is a reference to most Laravel Contracts, as well as their Laravel "facade" counterparts: 101 | 102 | Contract | Laravel 4.x Facade 103 | ------------- | ------------- 104 | [Illuminate\Contracts\Auth\Guard](https://github.com/illuminate/contracts/blob/master/Auth/Guard.php) | Auth 105 | [Illuminate\Contracts\Auth\PasswordBroker](https://github.com/illuminate/contracts/blob/master/Auth/PasswordBroker.php) | Password 106 | [Illuminate\Contracts\Bus\Dispatcher](https://github.com/illuminate/contracts/blob/master/Bus/Dispatcher.php) | Bus 107 | [Illuminate\Contracts\Cache\Repository](https://github.com/illuminate/contracts/blob/master/Cache/Repository.php) | Cache 108 | [Illuminate\Contracts\Cache\Factory](https://github.com/illuminate/contracts/blob/master/Cache/Factory.php) | Cache::driver() 109 | [Illuminate\Contracts\Config\Repository](https://github.com/illuminate/contracts/blob/master/Config/Repository.php) | Config 110 | [Illuminate\Contracts\Container\Container](https://github.com/illuminate/contracts/blob/master/Container/Container.php) | App 111 | [Illuminate\Contracts\Cookie\Factory](https://github.com/illuminate/contracts/blob/master/Cookie/Factory.php) | Cookie 112 | [Illuminate\Contracts\Cookie\QueueingFactory](https://github.com/illuminate/contracts/blob/master/Cookie/QueueingFactory.php) | Cookie::queue() 113 | [Illuminate\Contracts\Encryption\Encrypter](https://github.com/illuminate/contracts/blob/master/Encryption/Encrypter.php) | Crypt 114 | [Illuminate\Contracts\Events\Dispatcher](https://github.com/illuminate/contracts/blob/master/Events/Dispatcher.php) | Event 115 | [Illuminate\Contracts\Filesystem\Cloud](https://github.com/illuminate/contracts/blob/master/Filesystem/Cloud.php) |   116 | [Illuminate\Contracts\Filesystem\Factory](https://github.com/illuminate/contracts/blob/master/Filesystem/Factory.php) | File 117 | [Illuminate\Contracts\Filesystem\Filesystem](https://github.com/illuminate/contracts/blob/master/Filesystem/Filesystem.php) | File 118 | [Illuminate\Contracts\Foundation\Application](https://github.com/illuminate/contracts/blob/master/Foundation/Application.php) | App 119 | [Illuminate\Contracts\Hashing\Hasher](https://github.com/illuminate/contracts/blob/master/Hashing/Hasher.php) | Hash 120 | [Illuminate\Contracts\Logging\Log](https://github.com/illuminate/contracts/blob/master/Logging/Log.php) | Log 121 | [Illuminate\Contracts\Mail\MailQueue](https://github.com/illuminate/contracts/blob/master/Mail/MailQueue.php) | Mail::queue() 122 | [Illuminate\Contracts\Mail\Mailer](https://github.com/illuminate/contracts/blob/master/Mail/Mailer.php) | Mail 123 | [Illuminate\Contracts\Queue\Factory](https://github.com/illuminate/contracts/blob/master/Queue/Factory.php) | Queue::driver() 124 | [Illuminate\Contracts\Queue\Queue](https://github.com/illuminate/contracts/blob/master/Queue/Queue.php) | Queue 125 | [Illuminate\Contracts\Redis\Database](https://github.com/illuminate/contracts/blob/master/Redis/Database.php) | Redis 126 | [Illuminate\Contracts\Routing\Registrar](https://github.com/illuminate/contracts/blob/master/Routing/Registrar.php) | Route 127 | [Illuminate\Contracts\Routing\ResponseFactory](https://github.com/illuminate/contracts/blob/master/Routing/ResponseFactory.php) | Response 128 | [Illuminate\Contracts\Routing\UrlGenerator](https://github.com/illuminate/contracts/blob/master/Routing/UrlGenerator.php) | URL 129 | [Illuminate\Contracts\Support\Arrayable](https://github.com/illuminate/contracts/blob/master/Support/Arrayable.php) |   130 | [Illuminate\Contracts\Support\Jsonable](https://github.com/illuminate/contracts/blob/master/Support/Jsonable.php) |   131 | [Illuminate\Contracts\Support\Renderable](https://github.com/illuminate/contracts/blob/master/Support/Renderable.php) |   132 | [Illuminate\Contracts\Validation\Factory](https://github.com/illuminate/contracts/blob/master/Validation/Factory.php) | Validator::make() 133 | [Illuminate\Contracts\Validation\Validator](https://github.com/illuminate/contracts/blob/master/Validation/Validator.php) |   134 | [Illuminate\Contracts\View\Factory](https://github.com/illuminate/contracts/blob/master/View/Factory.php) | View::make() 135 | [Illuminate\Contracts\View\View](https://github.com/illuminate/contracts/blob/master/View/View.php) |   136 | 137 | 138 | ## How To Use Contracts 139 | 140 | So, how do you get an implementation of a contract? It's actually quite simple. Many types of classes in Laravel are resolved through the [service container](/docs/{{version}}/container), including controllers, event listeners, filters, queue jobs, and even route Closures. So, to get an implementation of a contract, you can just "type-hint" the interface in the constructor of the class being resolved. For example, take a look at this event handler: 141 | 142 | redis = $redis; 164 | } 165 | 166 | /** 167 | * Handle the event. 168 | * 169 | * @param NewUserRegistered $event 170 | * @return void 171 | */ 172 | public function handle(NewUserRegistered $event) 173 | { 174 | // 175 | } 176 | 177 | } 178 | 179 | When the event listener is resolved, the service container will read the type-hints on the constructor of the class, and inject the appropriate value. To learn more about registering things in the service container, check out [the documentation](/docs/{{version}}/container). 180 | -------------------------------------------------------------------------------- /5.0/database.md: -------------------------------------------------------------------------------- 1 | # استفاده از بانک اطلاعاتی در لاراول 2 | 3 | - [تنظیمات اولیه](#configuration) 4 | - [تعریف نوع ارتباط (خواندن/نوشتن)](#read-write-connections) 5 | - [اجرای Query](#running-queries) 6 | - [ کار با Transaction ها ](#database-transactions) 7 | - [دسترسی به کانکشن های تعریف شده](#accessing-connections) 8 | - [log گرفتن از Query های اجرا شده ](#query-logging) 9 | 10 | 11 | ## تنظیمات اولیه 12 | ارتباط با بانک اطلاعاتی و اجرای Query در لاراول بسیار ساده است ، تنظیمات بانک اطلاعاتی بطور پیشفرض در فایل `config/database.php` قرار دارد . در این فایل شما میتوانید تمامی کانکشن های بانک اطلاعاتی (database) خود را تعریف ، و مشخص کنید کدامیک بعنوان کانکشن پیشفرض درنظر گرفته شود . به عنوان مثال تمامی بانکهای اطلاعاتی زیر میتوانند در این فایل ذخیره شوند. 13 | 14 | بانک های اطلاعاتی که در حال حاضر توسط لاراول پشتیبانی می شوند : MySQL, Postgres, SQLite, and SQL Server. 15 | 16 | 17 | ## تعریف نوع ارتباط (خواندن/نوشتن) 18 | ممکن است بخواهید از یک کانکشن برای اجرای دستورات SELECT و کانکشن دیگری را برای دستورات INSERT , UPDATE و DELETE داشته باشید . لاراول این امر را ممکن می سازد و مطابق با نوع کوئری ، کاناکشن مربوطه را برای اجرای کوئری برقرار میکند . 19 | برای تعریف نوع ارتباط (خواندن/نوشتن) از این طریق عمل میکنیم : 20 | 21 | 'mysql' => [ 22 | 'read' => [ 23 | 'host' => '192.168.1.1', 24 | ], 25 | 'write' => [ 26 | 'host' => '196.168.1.2' 27 | ], 28 | 'driver' => 'mysql', 29 | 'database' => 'database', 30 | 'username' => 'root', 31 | 'password' => '', 32 | 'charset' => 'utf8', 33 | 'collation' => 'utf8_unicode_ci', 34 | 'prefix' => '', 35 | ], 36 | نکته : دو کلید به آرایه تنظیمات اضافه شده است که در آنها تنها مقدار `host` تعریف شده اند ، نیازی نیست برای هرکدام ، تنظیمات مربوط به `driver` ، `database` ، `username` مجددا وارد شود ! لاراول این مقادیر را از گزینه های تعریف شده در آرایه `mysql` دریافت میکند . برای مثال کانکشن ازنوع `read` در مثال بالا با آدرس هاست `192.168.1.1` و نوع درایور `mysql` و مقدار `username` برابر `root` و ... تعریف خواهد شد . و برای کانکشن `write` با همین مشخصات ولی آدرس هاست `192.168.1.2` درنظر گرفته میشود . 37 | 38 | 39 | ## اجرای Query 40 | زمانی که تنظیمات مربوط به بانک اطلاعاتی خود را وارد کردید حال میتوانید کوئری ها را با استفاده از فاساد `DB` اجرا نمایید . 41 | #### اجرای یک کوئری SELECT 42 | 43 | $results = DB::select('select * from users where id = ?', [1]); 44 | متد `select` همیشه یک آرایه از رکورد ها را به عنوان نتیجه برمیگرداند . 45 | 46 | همچنین برای اجرای کوئری و ارسال پارامتر (Binding parameters) به صورت زیر عمل میکنیم : 47 | 48 | $results = DB::select('select * from users where id = :id', ['id' => 1]); 49 | 50 | #### اجرای دستور Insert 51 | 52 | DB::insert('insert into users (id, name) values (?, ?)', [1, 'Dayle']); 53 | 54 | #### اجرای دستور Update 55 | 56 | DB::update('update users set votes = 100 where name = ?', ['John']); 57 | 58 | #### اجرای دستور Delete 59 | 60 | DB::delete('delete from users'); 61 | 62 | > **نکته :** دستورات `update` و `delete` تعداد رکورد هایی که Query با موفقیت بر روی آنها انجام شده است را برمیگرداند . 63 | 64 | #### و برای اجرای دستورات دیگر 65 | 66 | DB::statement('drop table users'); 67 | 68 | #### معرفی یک listener برای رویدادهای پرس و جو 69 | 70 | برای تعریف یک Listener برای تمامی کوئری هایی که اجرا میشوند از طریق متد `DB::listen` عمل نموده : 71 | 72 | DB::listen(function($sql, $bindings, $time) 73 | { 74 | // برای مثال شما میتوانید تمامی کوئری هایی که اجرا میشوند را در اینجا لوگ بگیرید 75 | }); 76 | 77 | 78 | ## کار با Transaction ها 79 | برای اجرای مجموعه ای از عملیات بر روی بانک اطلاعات ( `Commit` تایید کردن ،`rollback` یا رد کردن و بازگرداندن بانک اطلاعاتی به وضعیت قبل از اجرای کوئری های مورد نظر ) برحسب نیاز میتوانید از متد `transaction` استفاده نمایید : 80 | 81 | DB::transaction(function() 82 | { 83 | DB::table('users')->update(['votes' => 1]); 84 | 85 | DB::table('posts')->delete(); 86 | }); 87 | 88 | > **نکته:** هرنوع اثتثنائی که از درون Closure تعریف شده در متد `transaction` رخ بدهد ، باعث RollBack شدن transaction بصورت خودکار میشود . 89 | 90 | برای شروع اجرای یک transaction بصورت دستی : 91 | 92 | DB::beginTransaction(); 93 | 94 | و برای مردود کردن آن : 95 | 96 | DB::rollback(); 97 | 98 | و درآخر ، برای تایید کردن Transaction و ذخیره سازی عملیات بر روی بانک اطلاعاتی : 99 | 100 | DB::commit(); 101 | 102 | 103 | ## دسترسی به کانکشن های تعریف شده 104 | زمانی که از چند کانکشن در پروژه تان استفاده میکنید ممکن است برحسب نیاز بخواهید از یک کانکشن مشخص برای اجرای دستورات خود استفاده نمایید ، برای اینکار از متد `DB::connection` میتوانید استفاده نمایید : 105 | 106 | $users = DB::connection('foo')->select(...); 107 | 108 | برای گرفتن نمونه شیء PDO : 109 | 110 | $pdo = DB::connection()->getPdo(); 111 | 112 | درخواست مجدد برقراری ارتباط : 113 | 114 | DB::reconnect('foo'); 115 | اگر میخواهید ارتباط را بدلیل برقراری بیش از حد کانکشن های همزمان ، قطع کنید از متد `disconnect` استفاده کنید . 116 | 117 | DB::disconnect('foo'); 118 | 119 | 120 | ## Log کردن کوئری ها 121 | لاراول میتواند بصورت اختیاری کوئری های اجرا شده برای درخواست جاری را درحافظه دخیره کند که به شما کمک میکند نظارگر کوئری های اجرا شده بر روی بانک اطلاعاتی خود باشید . برای فعال کردن Log گیری ، متد `enableQueryLog` را اجرا کنید : 122 | 123 | DB::connection()->enableQueryLog(); 124 | 125 | برای دریافت آرایه ای از کوئری های Log شده از متد `getQueryLog` استفاده نمایید : 126 | 127 | $queries = DB::getQueryLog(); 128 | -------------------------------------------------------------------------------- /5.0/documentation.md: -------------------------------------------------------------------------------- 1 | - پیشگفتار 2 | - [آخرین تغییرات](/docs/{{version}}/releases) 3 | - [راهنمای بروزرسانی](/docs/{{version}}/upgrade) 4 | - نصب 5 | - [راهنمای نصب](/docs/{{version}}/installation) 6 | - [تنظیمات](/docs/{{version}}/configuration) 7 | - [Homestead](/docs/{{version}}/homestead) 8 | - قواعد اصلی 9 | - [Routing](/docs/{{version}}/routing) 10 | - [Middleware](/docs/{{version}}/middleware) 11 | - [Controllers](/docs/{{version}}/controllers) 12 | - [Requests](/docs/{{version}}/requests) 13 | - [Responses](/docs/{{version}}/responses) 14 | - [Views](/docs/{{version}}/views) 15 | - معماری فریموورک 16 | - [Service Providers](/docs/{{version}}/providers) 17 | - [Service Container](/docs/{{version}}/container) 18 | - [Contracts](/docs/{{version}}/contracts) 19 | - [Facades](/docs/{{version}}/facades) 20 | - [Request Lifecycle](/docs/{{version}}/lifecycle) 21 | - [Application Structure](/docs/{{version}}/structure) 22 | - سرویس ها 23 | - [Authentication](/docs/{{version}}/authentication) 24 | - [Billing](/docs/{{version}}/billing) 25 | - [Cache](/docs/{{version}}/cache) 26 | - [Collections](/docs/{{version}}/collections) 27 | - [Command Bus](/docs/{{version}}/bus) 28 | - [Core Extension](/docs/{{version}}/extending) 29 | - [Elixir](/docs/{{version}}/elixir) 30 | - [Encryption](/docs/{{version}}/encryption) 31 | - [Envoy](/docs/{{version}}/envoy) 32 | - [Errors & Logging](/docs/{{version}}/errors) 33 | - [Events](/docs/{{version}}/events) 34 | - [Filesystem / Cloud Storage](/docs/{{version}}/filesystem) 35 | - [Hashing](/docs/{{version}}/hashing) 36 | - [Helpers](/docs/{{version}}/helpers) 37 | - [Localization](/docs/{{version}}/localization) 38 | - [Mail](/docs/{{version}}/mail) 39 | - [Package Development](/docs/{{version}}/packages) 40 | - [Pagination](/docs/{{version}}/pagination) 41 | - [Queues](/docs/{{version}}/queues) 42 | - [Session](/docs/{{version}}/session) 43 | - [Templates](/docs/{{version}}/templates) 44 | - [Unit Testing](/docs/{{version}}/testing) 45 | - [Validation](/docs/{{version}}/validation) 46 | - بانک اطلاعاتی 47 | - [مقدمه](/docs/{{version}}/database) 48 | - [کوئری ساز](/docs/{{version}}/queries) 49 | - [Eloquent ORM](/docs/{{version}}/eloquent) 50 | - [Schema Builder](/docs/{{version}}/schema) 51 | - [Migration ها و Seed](/docs/{{version}}/migrations) 52 | - [Redis](/docs/{{version}}/redis) 53 | - Artisan CLI 54 | - [Overview](/docs/{{version}}/artisan) 55 | - [Development](/docs/{{version}}/commands) 56 | -------------------------------------------------------------------------------- /5.0/elixir.md: -------------------------------------------------------------------------------- 1 | # Laravel Elixir 2 | 3 | - [Introduction](#introduction) 4 | - [Installation & Setup](#installation) 5 | - [Usage](#usage) 6 | - [Gulp](#gulp) 7 | - [Extensions](#extensions) 8 | 9 | 10 | ## Introduction 11 | 12 | Laravel Elixir provides a clean, fluent API for defining basic [Gulp](http://gulpjs.com) tasks for your Laravel application. Elixir supports several common CSS and JavaScript pre-processors, and even testing tools. 13 | 14 | If you've ever been confused about how to get started with Gulp and asset compilation, you will love Laravel Elixir! 15 | 16 | 17 | ## Installation & Setup 18 | 19 | ### Installing Node 20 | 21 | Before triggering Elixir, you must first ensure that Node.js is installed on your machine. 22 | 23 | node -v 24 | 25 | By default, Laravel Homestead includes everything you need; however, if you aren't using Vagrant, then you can easily install Node by visiting [their download page](http://nodejs.org/download/). Don't worry, it's quick and easy! 26 | 27 | ### Gulp 28 | 29 | Next, you'll want to pull in [Gulp](http://gulpjs.com) as a global NPM package like so: 30 | 31 | npm install --global gulp 32 | 33 | ### Laravel Elixir 34 | 35 | The only remaining step is to install Elixir! With a new install of Laravel, you'll find a `package.json` file in the root. Think of this like your `composer.json` file, except it defines Node dependencies instead of PHP. You may install the dependencies it references by running: 36 | 37 | npm install 38 | 39 | 40 | ## Usage 41 | 42 | Now that you've installed Elixir, you'll be compiling and concatenating in no time! The `gulpfile.js` file in your project's root directory contains all of your Elixir tasks. 43 | 44 | #### Compile Less 45 | 46 | ```javascript 47 | elixir(function(mix) { 48 | mix.less("app.less"); 49 | }); 50 | ``` 51 | 52 | In the example above, Elixir assumes that your Less files are stored in `resources/assets/less`. 53 | 54 | #### Compile Multiple Less Files 55 | 56 | ```javascript 57 | elixir(function(mix) { 58 | mix.less([ 59 | 'app.less', 60 | 'something-else.less' 61 | ]); 62 | }); 63 | ``` 64 | 65 | #### Compile Sass 66 | 67 | ```javascript 68 | elixir(function(mix) { 69 | mix.sass("app.scss"); 70 | }); 71 | ``` 72 | 73 | This assumes that your Sass files are stored in `resources/assets/sass`. 74 | 75 | By default, Elixir, underneath the hood, uses the LibSass library for compilation. In some instances, it might prove advantageous to instead leverage the Ruby version, which, though slower, is more feature rich. Assuming that you have both Ruby and the Sass gem installed (`gem install sass`), you may enable Ruby-mode, like so: 76 | 77 | ```javascript 78 | elixir(function(mix) { 79 | mix.rubySass("app.sass"); 80 | }); 81 | ``` 82 | 83 | #### Compile Without Source Maps 84 | 85 | ```javascript 86 | elixir.config.sourcemaps = false; 87 | 88 | elixir(function(mix) { 89 | mix.sass("app.scss"); 90 | }); 91 | ``` 92 | 93 | Source maps are enabled out of the box. As such, for each file that is compiled, you'll find a companion `*.css.map` file in the same directory. This mapping allows you to, when debugging, trace your compiled stylesheet selectors back to your original Sass or Less partials! Should you need to disable this functionality, however, the code sample above will do the trick. 94 | 95 | #### Compile CoffeeScript 96 | 97 | ```javascript 98 | elixir(function(mix) { 99 | mix.coffee(); 100 | }); 101 | ``` 102 | 103 | This assumes that your CoffeeScript files are stored in `resources/assets/coffee`. 104 | 105 | #### Compile All Less and CoffeeScript 106 | 107 | ```javascript 108 | elixir(function(mix) { 109 | mix.less() 110 | .coffee(); 111 | }); 112 | ``` 113 | 114 | #### Trigger PHPUnit Tests 115 | 116 | ```javascript 117 | elixir(function(mix) { 118 | mix.phpUnit(); 119 | }); 120 | ``` 121 | 122 | #### Trigger PHPSpec Tests 123 | 124 | ```javascript 125 | elixir(function(mix) { 126 | mix.phpSpec(); 127 | }); 128 | ``` 129 | 130 | #### Combine Stylesheets 131 | 132 | ```javascript 133 | elixir(function(mix) { 134 | mix.styles([ 135 | "normalize.css", 136 | "main.css" 137 | ]); 138 | }); 139 | ``` 140 | 141 | Paths passed to this method are relative to the `resources/assets/css` directory. 142 | 143 | #### Combine Stylesheets and Save to a Custom Directory 144 | 145 | ```javascript 146 | elixir(function(mix) { 147 | mix.styles([ 148 | "normalize.css", 149 | "main.css" 150 | ], 'public/build/css/everything.css'); 151 | }); 152 | ``` 153 | 154 | #### Combine Stylesheets From A Custom Base Directory 155 | 156 | ```javascript 157 | elixir(function(mix) { 158 | mix.styles([ 159 | "normalize.css", 160 | "main.css" 161 | ], 'public/build/css/everything.css', 'public/css'); 162 | }); 163 | ``` 164 | 165 | The third argument to both the `styles` and `scripts` methods determines the relative directory for all paths passed to the methods. 166 | 167 | #### Combine All Styles in a Directory 168 | 169 | ```javascript 170 | elixir(function(mix) { 171 | mix.stylesIn("public/css"); 172 | }); 173 | ``` 174 | 175 | #### Combine Scripts 176 | 177 | ```javascript 178 | elixir(function(mix) { 179 | mix.scripts([ 180 | "jquery.js", 181 | "app.js" 182 | ]); 183 | }); 184 | ``` 185 | 186 | Again, this assumes all paths are relative to the `resources/assets/js` directory. 187 | 188 | #### Combine All Scripts in a Directory 189 | 190 | ```javascript 191 | elixir(function(mix) { 192 | mix.scriptsIn("public/js/some/directory"); 193 | }); 194 | ``` 195 | 196 | #### Combine Multiple Sets of Scripts 197 | 198 | ```javascript 199 | elixir(function(mix) { 200 | mix.scripts(['jquery.js', 'main.js'], 'public/js/main.js') 201 | .scripts(['forum.js', 'threads.js'], 'public/js/forum.js'); 202 | }); 203 | ``` 204 | 205 | #### Version / Hash A File 206 | 207 | ```javascript 208 | elixir(function(mix) { 209 | mix.version("css/all.css"); 210 | }); 211 | ``` 212 | 213 | This will append a unique hash to the filename, allowing for cache-busting. For example, the generated file name will look something like: `all-16d570a7.css`. 214 | 215 | Within your views, you may use the `elixir()` function to load the appropriately hashed asset. Here's an example: 216 | 217 | ```html 218 | 219 | ``` 220 | 221 | Behind the scenes, the `elixir()` function will determine the name of the hashed file that should be included. Don't you feel the weight lifting off your shoulders already? 222 | 223 | You may also pass an array to the `version` method to version multiple files: 224 | 225 | ```javascript 226 | elixir(function(mix) { 227 | mix.version(["css/all.css", "js/app.js"]); 228 | }); 229 | ``` 230 | 231 | ```html 232 | 233 | 234 | ``` 235 | 236 | #### Copy a File to a New Location 237 | 238 | ```javascript 239 | elixir(function(mix) { 240 | mix.copy('vendor/foo/bar.css', 'public/css/bar.css'); 241 | }); 242 | ``` 243 | 244 | #### Copy an Entire Directory to a New Location 245 | 246 | ```javascript 247 | elixir(function(mix) { 248 | mix.copy('vendor/package/views', 'resources/views'); 249 | }); 250 | ``` 251 | 252 | #### Trigger Browserify 253 | 254 | ```javascript 255 | elixir(function(mix) { 256 | mix.browserify('index.js'); 257 | }); 258 | ``` 259 | 260 | Want to require modules in the browser? Hoping to use EcmaScript 6 sooner than later? Need a built-in JSX transformer? If so, [Browserify](http://browserify.org/), along with the `browserify` Elixir task, will handle the job nicely. 261 | 262 | This task assumes that your scripts are stored in `resources/assets/js`, though you're free to override the default. 263 | 264 | #### Method Chaining 265 | 266 | Of course, you may chain almost all of Elixir's methods together to build your recipe: 267 | 268 | ```javascript 269 | elixir(function(mix) { 270 | mix.less("app.less") 271 | .coffee() 272 | .phpUnit() 273 | .version("css/bootstrap.css"); 274 | }); 275 | ``` 276 | 277 | 278 | ## Gulp 279 | 280 | Now that you've told Elixir which tasks to execute, you only need to trigger Gulp from the command line. 281 | 282 | #### Execute All Registered Tasks Once 283 | 284 | gulp 285 | 286 | #### Watch Assets For Changes 287 | 288 | gulp watch 289 | 290 | #### Only Compile Scripts 291 | 292 | gulp scripts 293 | 294 | #### Only Compile Styles 295 | 296 | gulp styles 297 | 298 | #### Watch Tests And PHP Classes for Changes 299 | 300 | gulp tdd 301 | 302 | > **Note:** All tasks will assume a development environment, and will exclude minification. For production, use `gulp --production`. 303 | 304 | 305 | ## Custom Tasks and Extensions 306 | 307 | Sometimes, you'll want to hook your own Gulp tasks into Elixir. Perhaps you have a special bit of functionality that you'd like Elixir to mix and watch for you. No problem! 308 | 309 | As an example, imagine that you have a general task that simply speaks a bit of text when called. 310 | 311 | ```javascript 312 | gulp.task("speak", function() { 313 | var message = "Tea...Earl Grey...Hot"; 314 | 315 | gulp.src("").pipe(shell("say " + message)); 316 | }); 317 | ``` 318 | 319 | Easy enough. From the command line, you may, of course, call `gulp speak` to trigger the task. To add it to Elixir, however, use the `mix.task()` method: 320 | 321 | ```javascript 322 | elixir(function(mix) { 323 | mix.task('speak'); 324 | }); 325 | ``` 326 | 327 | That's it! Now, each time you run Gulp, your custom "speak" task will be executed alongside any other Elixir tasks that you've mixed in. To additionally register a watcher, so that your custom tasks will be re-triggered each time one or more files are modified, you may pass a regular expression as the second argument. 328 | 329 | ```javascript 330 | elixir(function(mix) { 331 | mix.task('speak', 'app/**/*.php'); 332 | }); 333 | ``` 334 | 335 | By adding this second argument, we've instructed Elixir to re-trigger the "speak" task each time a PHP file in the "app/" directory is saved. 336 | 337 | 338 | For even more flexibility, you can create full Elixir extensions. Using the previous "speak" example, you may write an extension, like so: 339 | 340 | ```javascript 341 | var gulp = require("gulp"); 342 | var shell = require("gulp-shell"); 343 | var elixir = require("laravel-elixir"); 344 | 345 | elixir.extend("speak", function(message) { 346 | 347 | gulp.task("speak", function() { 348 | gulp.src("").pipe(shell("say " + message)); 349 | }); 350 | 351 | return this.queueTask("speak"); 352 | 353 | }); 354 | ``` 355 | 356 | Notice that we `extend` Elixir's API by passing the name that we will reference within our Gulpfile, as well as a callback function that will create the Gulp task. 357 | 358 | As before, if you want your custom task to be monitored, then register a watcher. 359 | 360 | ```javascript 361 | this.registerWatcher("speak", "app/**/*.php"); 362 | ``` 363 | 364 | This lines designates that when any file that matches the regular expression, `app/**/*.php`, is modified, we want to trigger the `speak` task. 365 | 366 | That's it! You may either place this at the top of your Gulpfile, or instead extract it to a custom tasks file. If you choose the latter approach, simply require it into your Gulpfile, like so: 367 | 368 | ```javascript 369 | require("./custom-tasks") 370 | ``` 371 | 372 | You're done! Now, you can mix it in. 373 | 374 | ```javascript 375 | elixir(function(mix) { 376 | mix.speak("Tea, Earl Grey, Hot"); 377 | }); 378 | ``` 379 | 380 | With this addition, each time you trigger Gulp, Picard will request some tea. 381 | -------------------------------------------------------------------------------- /5.0/encryption.md: -------------------------------------------------------------------------------- 1 | # رمزنگاری 2 | 3 | - [معرفی](#introduction) 4 | - [روش استفاده](#basic-usage) 5 | 6 | 7 | ## معرفی 8 | در لاراول امکان رمزنگاری به روش AES از طریق افزونه php با نام Mcrypt وجود دارد . 9 | 10 | ## روش استفاده 11 | 12 | #### رمزکردن یک رشته 13 | 14 | $encrypted = Crypt::encrypt('secret'); 15 | 16 | > **نکته :** حتما طول مقدار `key` در فایل `config/app.php` باید برابر 16, 24, یا 32 کاراکتر باشد . در غیر اینصورت , رمز نگاری امن نخواهد بود !. 17 | 18 | #### رمز گشایی یک رشته 19 | 20 | $decrypted = Crypt::decrypt($encryptedValue); 21 | 22 | #### تظیم Cipher و حالت 23 | برای تنظیم کردن Cipher و حالت رمزنگاری از متد های زیر استفاد ه کنید : 24 | 25 | Crypt::setMode('ctr'); 26 | 27 | Crypt::setCipher($cipher); 28 | -------------------------------------------------------------------------------- /5.0/envoy.md: -------------------------------------------------------------------------------- 1 | # Envoy Task Runner 2 | 3 | - [Introduction](#introduction) 4 | - [Installation](#envoy-installation) 5 | - [Running Tasks](#envoy-running-tasks) 6 | - [Multiple Servers](#envoy-multiple-servers) 7 | - [Parallel Execution](#envoy-parallel-execution) 8 | - [Task Macros](#envoy-task-macros) 9 | - [Notifications](#envoy-notifications) 10 | - [Updating Envoy](#envoy-updating-envoy) 11 | 12 | 13 | ## Introduction 14 | 15 | [Laravel Envoy](https://github.com/laravel/envoy) provides a clean, minimal syntax for defining common tasks you run on your remote servers. Using a Blade style syntax, you can easily setup tasks for deployment, Artisan commands, and more. 16 | 17 | > **Note:** Envoy requires PHP version 5.4 or greater, and only runs on Mac / Linux operating systems. 18 | 19 | 20 | ## Installation 21 | 22 | First, install Envoy using the Composer `global` command: 23 | 24 | composer global require "laravel/envoy=~1.0" 25 | 26 | Make sure to place the `~/.composer/vendor/bin` directory in your PATH so the `envoy` executable is found when you run the `envoy` command in your terminal. 27 | 28 | Next, create an `Envoy.blade.php` file in the root of your project. Here's an example to get you started: 29 | 30 | @servers(['web' => '192.168.1.1']) 31 | 32 | @task('foo', ['on' => 'web']) 33 | ls -la 34 | @endtask 35 | 36 | As you can see, an array of `@servers` is defined at the top of the file. You can reference these servers in the `on` option of your task declarations. Within your `@task` declarations you should place the Bash code that will be run on your server when the task is executed. 37 | 38 | The `init` command may be used to easily create a stub Envoy file: 39 | 40 | envoy init user@192.168.1.1 41 | 42 | 43 | ## Running Tasks 44 | 45 | To run a task, use the `run` command of your Envoy installation: 46 | 47 | envoy run foo 48 | 49 | If needed, you may pass variables into the Envoy file using command line switches: 50 | 51 | envoy run deploy --branch=master 52 | 53 | You may use the options via the Blade syntax you are used to: 54 | 55 | @servers(['web' => '192.168.1.1']) 56 | 57 | @task('deploy', ['on' => 'web']) 58 | cd site 59 | git pull origin {{ $branch }} 60 | php artisan migrate 61 | @endtask 62 | 63 | #### Bootstrapping 64 | 65 | You may use the ```@setup``` directive to declare variables and do general PHP work inside the Envoy file: 66 | 67 | @setup 68 | $now = new DateTime(); 69 | 70 | $environment = isset($env) ? $env : "testing"; 71 | @endsetup 72 | 73 | You may also use ```@include``` to include any PHP files: 74 | 75 | @include('vendor/autoload.php'); 76 | 77 | #### Confirming Tasks Before Running 78 | 79 | If you would like to be prompted for confirmation before running a given task on your servers, you may use the `confirm` directive: 80 | 81 | @task('deploy', ['on' => 'web', 'confirm' => true]) 82 | cd site 83 | git pull origin {{ $branch }} 84 | php artisan migrate 85 | @endtask 86 | 87 | 88 | ## Multiple Servers 89 | 90 | You may easily run a task across multiple servers. Simply list the servers in the task declaration: 91 | 92 | @servers(['web-1' => '192.168.1.1', 'web-2' => '192.168.1.2']) 93 | 94 | @task('deploy', ['on' => ['web-1', 'web-2']]) 95 | cd site 96 | git pull origin {{ $branch }} 97 | php artisan migrate 98 | @endtask 99 | 100 | By default, the task will be executed on each server serially. Meaning, the task will finish running on the first server before proceeding to execute on the next server. 101 | 102 | 103 | ## Parallel Execution 104 | 105 | If you would like to run a task across multiple servers in parallel, simply add the `parallel` option to your task declaration: 106 | 107 | @servers(['web-1' => '192.168.1.1', 'web-2' => '192.168.1.2']) 108 | 109 | @task('deploy', ['on' => ['web-1', 'web-2'], 'parallel' => true]) 110 | cd site 111 | git pull origin {{ $branch }} 112 | php artisan migrate 113 | @endtask 114 | 115 | 116 | ## Task Macros 117 | 118 | Macros allow you to define a set of tasks to be run in sequence using a single command. For instance: 119 | 120 | @servers(['web' => '192.168.1.1']) 121 | 122 | @macro('deploy') 123 | foo 124 | bar 125 | @endmacro 126 | 127 | @task('foo') 128 | echo "HELLO" 129 | @endtask 130 | 131 | @task('bar') 132 | echo "WORLD" 133 | @endtask 134 | 135 | The `deploy` macro can now be run via a single, simple command: 136 | 137 | envoy run deploy 138 | 139 | 140 | 141 | ## Notifications 142 | 143 | #### HipChat 144 | 145 | After running a task, you may send a notification to your team's HipChat room using the simple `@hipchat` directive: 146 | 147 | @servers(['web' => '192.168.1.1']) 148 | 149 | @task('foo', ['on' => 'web']) 150 | ls -la 151 | @endtask 152 | 153 | @after 154 | @hipchat('token', 'room', 'Envoy') 155 | @endafter 156 | 157 | You can also specify a custom message to the hipchat room. Any variables declared in ```@setup``` or included with ```@include``` will be available for use in the message: 158 | 159 | @after 160 | @hipchat('token', 'room', 'Envoy', "$task ran on [$environment]") 161 | @endafter 162 | 163 | This is an amazingly simple way to keep your team notified of the tasks being run on the server. 164 | 165 | #### Slack 166 | 167 | The following syntax may be used to send a notification to [Slack](https://slack.com): 168 | 169 | @after 170 | @slack('hook', 'channel', 'message') 171 | @endafter 172 | 173 | You may retrieve your webhook URL by creating an `Incoming WebHooks` integration on Slack's website. The `hook` argument should be the entire webhook URL provided by the Incoming Webhooks Slack Integration. For example: 174 | 175 | https://hooks.slack.com/services/ZZZZZZZZZ/YYYYYYYYY/XXXXXXXXXXXXXXX 176 | 177 | You may provide one of the following for the channel argument: 178 | 179 | - To send the notification to a channel: `#channel` 180 | - To send the notification to a user: `@user` 181 | 182 | If no `channel` argument is provided the default channel will be used. 183 | 184 | > Note: Slack notifications will only be sent if all tasks complete successfully. 185 | 186 | 187 | ## Updating Envoy 188 | 189 | To update Envoy, simply use Composer: 190 | 191 | composer global update 192 | 193 | -------------------------------------------------------------------------------- /5.0/errors.md: -------------------------------------------------------------------------------- 1 | # خطاها و لاگ 2 | 3 | - [پیکربندی](#configuration) 4 | - [مدیریت خطاها - Exception Handling](#handling-errors) 5 | - [اکسپشنهای HTTP](#http-exceptions) 6 | - [لاگ کردن](#logging) 7 | 8 | 9 | ## پیکربندی 10 | 11 | کلاس راه انداز (bootstrapper) `Illuminate\Foundation\Bootstrap\ConfigureLogging` مکانیست که میتوانید پیکربندی امکانات لاگ کردن برای نرم افزار را در آن انجام دهید. این کلاس از گزینه پیکربندی `log` که در فایل `config/app.php` تعریف شده استفاده میکند. 12 | 13 | به صورت پیش فرض لاگر برای استفاده از ایجاد لاگ روزانه تنظیم شده است؛ هرچند شما میتوانید این تنظیمات را براساس نیاز خود تغییر دهید. از آنجا که لاراول از کتابخانه شناخته شده [Monolog](https://github.com/Seldaek/monolog) استفاده میکند، میتوانید از هندلرهای بسیاری که Monolog ارائه میکند استفاده نمایید. 14 | 15 | برای مثال، اگر بخواهید به جای استفاده از فایلهای روزانه از یک فایل استفاده کنید، میتوانید گزینه زیر را در فایل پیکربندی `config/app.php` قرار دهید: 16 | 17 | 'log' => 'single' 18 | 19 | به طور کلی لاراول مُدهای لاگ گیری `single`، `daily`، `syslog`، و `errorlog` را پشتیبانی مینماید. میتوانید با بازنویسی کلاس راه انداز `ConfigureLogging` رفتار لاگ گیری اختصاصی مربوط به نرم افزار خود را ایجاد نمایید. 20 | 21 | ### جزئیات خطا 22 | 23 | میزان جزیئاتی که نرم افزار در مرورگر نمایش میدهد به مقدار گزینه `app.debug` در فایل تنظیمات بستگی دارد. به صورت پیش فرض، این گزینه مقدار خود را از متغیر محلی `APP_DEBUG` در فایل `.env` میگیرد. 24 | 25 | برای توسعه بر روی ماشین محلی، باید مقدار متغیر محلی `APP_DEBUG` را با `true` مقداردهی کنید. **در محیط تجاری این مقدار باید همیشه `false` باشد.** 26 | 27 | 28 | ## مدیریت خطاها - Handling Errors 29 | 30 | تمامی اکسپشنها با استفاده از کلاس `App\Exceptions\Handler` مدیریت می شوند. این کلاس دو متد دارد: `report` و `render`. 31 | 32 | متد `report` برای لاگ کردن اکسپشنها یا فرستادن آنها به یک سرویس خارجی مانند [BugSnag](https://bugsnag.com) استفاده میشود. به صورت پیش فرض متد `report` اکسپشن را به پیاده سازی پایه از کلاس پدر میفرستد. کلاس پدر اکسپشن را لاگ میکند. شما آزادید اکسپشنها را به روش خودتان لاگ کنید. اگر میخواهید اکسپشنهای مختلف را به روشهای مختلف لاگ کنید از اپراتور مقایسه `instanceof` در PHP استفاده کنید: 33 | 34 | /** 35 | * Report or log an exception. 36 | * 37 | * This is a great spot to send exceptions to Sentry, Bugsnag, etc. 38 | * 39 | * @param \Exception $e 40 | * @return void 41 | */ 42 | public function report(Exception $e) 43 | { 44 | if ($e instanceof CustomException) 45 | { 46 | // 47 | } 48 | 49 | return parent::report($e); 50 | } 51 | 52 | متد `render` مسئول تبدیل اکسپشن به یک پاسخ HTTP است، این پاسخ به مرورگر بازگردانده می شود. به صورت پیش فرض، اکسپشن به کلاس پایه که یک پاسخ برای شما ایجاد میکند فرستاده می شود. هرچند شما میتوانید نوع اکسپشن را چک کرده و پاسخ متناسب خود را بازگردانید. 53 | 54 | متغیر `dontReport` از مدیر اکسپشن (Exception Handler) آرایه ی اکسپشنهایی که لاگ نمی شوند را نگاه میدارد. به صورت پیش فرض، اکسپشنهایی که از خطای 404 ایجاد می شوند در فایل لاگ ثبت نمیشوند. شما میتوانید اکسپشنهای دیگری را هم به این آرایه بیافزایید. 55 | 56 | 57 | ## اکسپشنهای HTTP 58 | 59 | برخی اکسپشنها کدهای خطای HTTP از سرور را توصیف میکنند. برای مثال، این اکسپشن میتواند یک خطای "صفحه موجود نیست - Page not found" (404)، خطای "غیرمجاز - unauthorized" (401) یا حتی یک خطای 500 تولید شده توسط توسعه دهنده باشد. برای برگرداندن پاسخهای اینگونه از روش زیر استفاده کنید: 60 | 61 | abort(404); 62 | 63 | میتوانید یک پاسخ اختیاری ارائه نمایید: 64 | 65 | abort(403, 'Unauthorized action.'); 66 | 67 | این متد میتواند در هر لحطه از چرخه عمر درخواست استفاده شود. 68 | 69 | ### صفحه خطای اختصاصی خطای 404 70 | 71 | برای بازگرداندن یک view اختصاصی برای تمامی خطاهای 404، یک فایل `resources/views/errors/404.blade.php` ایجاد کنید. این view برای تمامی خطاهای 404 ایجاد شده توسط نرم افزار شما نمایش داده می شود. 72 | 73 | 74 | ## لاگ کردن 75 | 76 | لاراول از کتابخانه شناخته شده [Monolog](https://github.com/Seldaek/monolog) استفاده میکند. به صورت پیش فرض لاراول تنظیم شده تا به ازای هر روز یک فایل لاگ ایجاد کند. این فایلها دردایرکتوری `storage/logs` ذخیره می شوند. میتوانید اطلاعات را به شکل زیر لاگ کنید: 77 | 78 | Log::info('This is some useful information.'); 79 | 80 | Log::warning('Something could be going wrong.'); 81 | 82 | Log::error('Something is really going wrong.'); 83 | 84 | لاگر 7 سطح لاگ معرفی شده در [RFC 5424](http://tools.ietf.org/html/rfc5424) را پشتیبانی میکند: 85 | 86 | - debug 87 | - info 88 | - notice 89 | - warning 90 | - error 91 | - critical 92 | - alert 93 | 94 | آرایه ای از داده های مرتبط را نیز میتوان به متدهای لاگ فرستاد: 95 | 96 | Log::info('Log message', ['context' => 'Other helpful information']); 97 | 98 | Monolog هندلرهای زیادی دارد که میتوانید برای لاگ کردن استفاده کنید. در صورت نیاز میتوانید به نمونه های کلاس پایه ای تر Monolog که لاراول از آنها استفاده میکند دسترسی داشته باشد: 99 | 100 | $monolog = Log::getMonolog(); 101 | 102 | همچنین میتوانید رویدادی (event) برای گرفتن تمامی پیامهای فرستاده شده به لاگ استفاده کنید: 103 | 104 | #### ثبت event listener لاگ 105 | 106 | Log::listen(function($level, $message, $context) 107 | { 108 | // 109 | }); 110 | -------------------------------------------------------------------------------- /5.0/events.md: -------------------------------------------------------------------------------- 1 | # Events 2 | 3 | - [Basic Usage](#basic-usage) 4 | - [Queued Event Handlers](#queued-event-handlers) 5 | - [Event Subscribers](#event-subscribers) 6 | 7 | 8 | ## Basic Usage 9 | 10 | The Laravel event facilities provides a simple observer implementation, allowing you to subscribe and listen for events in your application. Event classes are typically stored in the `app/Events` directory, while their handlers are stored in `app/Handlers/Events`. 11 | 12 | You can generate a new event class using the Artisan CLI tool: 13 | 14 | php artisan make:event PodcastWasPurchased 15 | 16 | #### Subscribing To An Event 17 | 18 | The `EventServiceProvider` included with your Laravel application provides a convenient place to register all event handlers. The `listen` property contains an array of all events (keys) and their handlers (values). Of course, you may add as many events to this array as your application requires. For example, let's add our `PodcastWasPurchased` event: 19 | 20 | /** 21 | * The event handler mappings for the application. 22 | * 23 | * @var array 24 | */ 25 | protected $listen = [ 26 | 'App\Events\PodcastWasPurchased' => [ 27 | 'App\Handlers\Events\EmailPurchaseConfirmation', 28 | ], 29 | ]; 30 | 31 | To generate a handler for an event, use the `handler:event` Artisan CLI command: 32 | 33 | php artisan handler:event EmailPurchaseConfirmation --event=PodcastWasPurchased 34 | 35 | Of course, manually running the `make:event` and `handler:event` commands each time you need a handler or event is cumbersome. Instead, simply add handlers and events to your `EventServiceProvider` and use the `event:generate` command. This command will generate any events or handlers that are listed in your `EventServiceProvider`: 36 | 37 | php artisan event:generate 38 | 39 | #### Firing An Event 40 | 41 | Now we are ready to fire our event using the `Event` facade: 42 | 43 | $response = Event::fire(new PodcastWasPurchased($podcast)); 44 | 45 | The `fire` method returns an array of responses that you can use to control what happens next in your application. 46 | 47 | You may also use the `event` helper to fire an event: 48 | 49 | event(new PodcastWasPurchased($podcast)); 50 | 51 | #### Closure Listeners 52 | 53 | You can even listen to events without creating a separate handler class at all. For example, in the `boot` method of your `EventServiceProvider`, you could do the following: 54 | 55 | Event::listen('App\Events\PodcastWasPurchased', function($event) 56 | { 57 | // Handle the event... 58 | }); 59 | 60 | #### Stopping The Propagation Of An Event 61 | 62 | Sometimes, you may wish to stop the propagation of an event to other listeners. You may do so using by returning `false` from your handler: 63 | 64 | Event::listen('App\Events\PodcastWasPurchased', function($event) 65 | { 66 | // Handle the event... 67 | 68 | return false; 69 | }); 70 | 71 | 72 | ## Queued Event Handlers 73 | 74 | Need to [queue](/docs/{{version}}/queues) an event handler? It couldn't be any easier. When generating the handler, simply use the `--queued` flag: 75 | 76 | php artisan handler:event SendPurchaseConfirmation --event=PodcastWasPurchased --queued 77 | 78 | This will generate a handler class that implements the `Illuminate\Contracts\Queue\ShouldBeQueued` interface. That's it! Now when this handler is called for an event, it will be queued automatically by the event dispatcher. 79 | 80 | If no exceptions are thrown when the handler is executed by the queue, the queued job will be deleted automatically after it has processed. If you need to access the queued job's `delete` and `release` methods manually, you may do so. The `Illuminate\Queue\InteractsWithQueue` trait, which is included by default on queued handlers, gives you access to these methods: 81 | 82 | public function handle(PodcastWasPurchased $event) 83 | { 84 | if (true) 85 | { 86 | $this->release(30); 87 | } 88 | } 89 | 90 | If you have an existing handler that you would like to convert to a queued handler, simply add the `ShouldBeQueued` interface to the class manually. 91 | 92 | 93 | ## Event Subscribers 94 | 95 | #### Defining An Event Subscriber 96 | 97 | Event subscribers are classes that may subscribe to multiple events from within the class itself. Subscribers should define a `subscribe` method, which will be passed an event dispatcher instance: 98 | 99 | class UserEventHandler { 100 | 101 | /** 102 | * Handle user login events. 103 | */ 104 | public function onUserLogin($event) 105 | { 106 | // 107 | } 108 | 109 | /** 110 | * Handle user logout events. 111 | */ 112 | public function onUserLogout($event) 113 | { 114 | // 115 | } 116 | 117 | /** 118 | * Register the listeners for the subscriber. 119 | * 120 | * @param Illuminate\Events\Dispatcher $events 121 | * @return void 122 | */ 123 | public function subscribe($events) 124 | { 125 | $events->listen('App\Events\UserLoggedIn', 'UserEventHandler@onUserLogin'); 126 | 127 | $events->listen('App\Events\UserLoggedOut', 'UserEventHandler@onUserLogout'); 128 | } 129 | 130 | } 131 | 132 | #### Registering An Event Subscriber 133 | 134 | Once the subscriber has been defined, it may be registered with the `Event` class. 135 | 136 | $subscriber = new UserEventHandler; 137 | 138 | Event::subscribe($subscriber); 139 | 140 | You may also use the [service container](/docs/{{version}}/container) to resolve your subscriber. To do so, simply pass the name of your subscriber to the `subscribe` method: 141 | 142 | Event::subscribe('UserEventHandler'); 143 | 144 | -------------------------------------------------------------------------------- /5.0/facades.md: -------------------------------------------------------------------------------- 1 | # فاساد Facades 2 | 3 | - [مقدمه](#introduction) 4 | - [تعریف](#explanation) 5 | - [استفاده عملی](#practical-usage) 6 | - [ایجاد فاساد](#creating-facades) 7 | - [ماک کردن فاسادها](#mocking-facades) 8 | - [مرجع فاساد های لاراول](#facade-class-reference) 9 | 10 | 11 | ## مقدمه 12 | فاساد ها برای دسترسی بصورت `static` به [سرویس های موجود](/docs/{{version}}/container) درون اپلیکیشن مورد استفاده قرار میگیرند . فاساد های زیادی درون لاراول وجود دارد که شما بدون دانستن ساختار آن میتوانید از آنها استفاده نمایید . فاساد ، یک روش دسترسی به سرویس های موجود در اپلیکیشن می باشد و از طریق آن ها میتوانید متد های موجود در یک سرویس را بصورت استاتیک صدا بزنید . 13 | 14 | ممکن است بخواهید برای پکیج های خود فاساد بسازید . برای این منظورشما را با مفهوم کلاس های فاساد بیشتر آشنا خواهیم کرد . 15 | 16 | > **نکته :** قبل از مطالعه بر روی کلاس های فاساد, پیشنهاد میکنیم با [service container](/docs/{{version}}/container) ها آشنا شوید. 17 | 18 | 19 | ## تعریف 20 | در لاراول ، یک فاساد به منظور دسترسی سریع به یک سرویس درون اپلیکیشن استفاده میشود . منطقی که این عملیات را انجام میدهد درون کلاس `Facade` پایه قرار دارد و هر فاسادی که شما میسازید باید از کلاس `Facade` پایه ، ارث بری کند . 21 | 22 | کلاس های فاساد ایجاد شده توسط شما تنها باید یک متد با نام `getFacadeAccessor` در خود داشته باشند ، این متد نام سرویسی که این فاساد باید به آن دسترسی داشته باشد را تعیین میکند .کلاس `Facade` امکان استفاده از متد جادویی `__callStatic()` را میدهد که به موجب آن میتوانید متد های درون سرویس را با این ترفند به صورت static اجرا نمایید . بنابراین ، 23 | فاسادهای لاراول یک راه آسان برای دسترسی به سرویس ها می باشند . 24 | 25 | برای مثال ، زمانی که فاساد `Cache::get` را فراخوانی میکنید لاراول بدنبال آن ، متد get را از سرویس cache صدا میزند . 26 | 27 | 28 | ## استفاده عملی 29 | در مثال زیر ، یک متد static از فاساد cache صدا زده شده است و شما در نگا ه اول تصور خواهید کرد متد `get` درون کلاس `cache` وجود دارد. 30 | 31 | $value = Cache::get('key'); 32 | 33 | اما , اگر به کلاس `Illuminate\Support\Facades\Cache` یک نگاه بندازید ، خواهید دید که هیچ متد استاتیکی با نام `get` وجود ندارد ! : 34 | 35 | class Cache extends Facade { 36 | 37 | /** 38 | * Get the registered name of the component. 39 | * 40 | * @return string 41 | */ 42 | protected static function getFacadeAccessor() { return 'cache'; } 43 | 44 | } 45 | 46 | کلاس `cache` از کلاس `Facade` ارث بری میکند و یک متد با نام `getFacadeAccessor()` درخود دارد ، بیاد داشته باشید که این متد نام سرویسی که این فاساد میخواهد به آن دسترسی داشته باشد را برمیگرداند. 47 | 48 | بنابراین ، فراخوانی `Cache::get` مفهومی همانند کد زیر خواهد داشت : 49 | 50 | $value = $app->make('cache')->get('key'); 51 | 52 | #### استفاده از یک فاساد 53 | اگر قصد دارید از یک فاساد درون کنترلر های خود استفاده نمایید باید حتما آن را به namespace کنترولر خود اضافه کنید . تمامی فاساد ها در فضای `global` قابل دسترس هستند : 54 | 55 | 76 | ## ایجاد فاساد 77 | ساخت فاساد برای پروژه یا پکیج بسیار ساده است . تنها 3 چیز را نیاز دارید : 78 | 79 | - اضافه کردن سرویس . 80 | - ایحاد یک کلاس فاساد. 81 | - معرفی فاساد به فریموورک . 82 | 83 | به مثال زیر توجه نمایید ، ما یک کلاس با نام `PaymentGateway\Payment` تعریف کرده ایم. 84 | 85 | namespace PaymentGateway; 86 | 87 | class Payment { 88 | 89 | public function process() 90 | { 91 | // 92 | } 93 | 94 | } 95 | 96 | باید بتوانیم به کلاس مورد نظر به صورت یک سرویس دسترسی داشته باشیم . پس آن را به سرویس هایتان اضافه کنید : 97 | 98 | App::bind('payment', function() 99 | { 100 | return new \PaymentGateway\Payment; 101 | }); 102 | 103 | همچنین روش بهتری نیز وجود دارد که ابتدا یک [service provider](/docs/{{version}}/container#service-providers) با نام `PaymentServiceProvider` اینجاد میکنیم و دستورات بالا را درون متد `register` آن اضافه میکنم و سپس آن را به آرایه سرویس ها در فایل `config/app.php` اضافه میکنیم . 104 | 105 | سپس ، فاساد آن را به روش زیر ایجاد میکنیم : 106 | 107 | use Illuminate\Support\Facades\Facade; 108 | 109 | class Payment extends Facade { 110 | 111 | protected static function getFacadeAccessor() { return 'payment'; } 112 | 113 | } 114 | در پایان ، فاساد را به آرایه `aliases` در فایل `config/app.php` اضافه میکنیم . حالا میتوانید متد `process` را از سرویس `Payment` به روش زیر فراخوانی کنید : 115 | 116 | Payment::process(); 117 | 118 | 119 | ## ماک کردن فاسادها 120 | تست واحد (Unit testing) یکی از مهمترین قسمت های فاساد ها میباشد که نشان دهنده چگونگی عملکرد آنها می باشد . درواقع تست مهمترین دلیلی است که اهمیت وجود یک فاساد را مشخص میکند . برای اطلاعات بیشتر به مستندات [mocking facades](/docs/{{version}}/testing#mocking-facades) رجوع کنید . 121 | 122 | 123 | ## مرجع فاساد های لاراول 124 | در اینجا لیستی از تمامی فاساد ها به همراه سرویس های مرتبط با آنها نمایش داده شده است . اگر میخواهید بدانید که هر فاساد از کدام سرویس خدمت میگیرد میتوانید از لیست زیر کمک بگیرید . همچنین مشخصه هر سرویس ([service container binding](/docs/{{version}}/container) ) نیزمشخص شده است . 125 | 126 | فاساد | نام سرویس | مشخصه سرویس 127 | ------------- | ------------- | ------------- 128 | App | [Illuminate\Foundation\Application](http://laravel.com/api/{{version}}/Illuminate/Foundation/Application.html) | `app` 129 | Artisan | [Illuminate\Console\Application](http://laravel.com/api/{{version}}/Illuminate/Console/Application.html) | `artisan` 130 | Auth | [Illuminate\Auth\AuthManager](http://laravel.com/api/{{version}}/Illuminate/Auth/AuthManager.html) | `auth` 131 | Auth (Instance) | [Illuminate\Auth\Guard](http://laravel.com/api/{{version}}/Illuminate/Auth/Guard.html) | 132 | Blade | [Illuminate\View\Compilers\BladeCompiler](http://laravel.com/api/{{version}}/Illuminate/View/Compilers/BladeCompiler.html) | `blade.compiler` 133 | Bus | [Illuminate\Contracts\Bus\Dispatcher](http://laravel.com/api/{{version}}/Illuminate/Contracts/Bus/Dispatcher.html) | 134 | Cache | [Illuminate\Cache\CacheManager](http://laravel.com/api/{{version}}/Illuminate/Cache/Repository.html) | `cache` 135 | Config | [Illuminate\Config\Repository](http://laravel.com/api/{{version}}/Illuminate/Config/Repository.html) | `config` 136 | Cookie | [Illuminate\Cookie\CookieJar](http://laravel.com/api/{{version}}/Illuminate/Cookie/CookieJar.html) | `cookie` 137 | Crypt | [Illuminate\Encryption\Encrypter](http://laravel.com/api/{{version}}/Illuminate/Encryption/Encrypter.html) | `encrypter` 138 | DB | [Illuminate\Database\DatabaseManager](http://laravel.com/api/{{version}}/Illuminate/Database/DatabaseManager.html) | `db` 139 | DB (Instance) | [Illuminate\Database\Connection](http://laravel.com/api/{{version}}/Illuminate/Database/Connection.html) | 140 | Event | [Illuminate\Events\Dispatcher](http://laravel.com/api/{{version}}/Illuminate/Events/Dispatcher.html) | `events` 141 | File | [Illuminate\Filesystem\Filesystem](http://laravel.com/api/{{version}}/Illuminate/Filesystem/Filesystem.html) | `files` 142 | Hash | [Illuminate\Contracts\Hashing\Hasher](http://laravel.com/api/{{version}}/Illuminate/Contracts/Hashing/Hasher.html) | `hash` 143 | Input | [Illuminate\Http\Request](http://laravel.com/api/{{version}}/Illuminate/Http/Request.html) | `request` 144 | Lang | [Illuminate\Translation\Translator](http://laravel.com/api/{{version}}/Illuminate/Translation/Translator.html) | `translator` 145 | Log | [Illuminate\Log\Writer](http://laravel.com/api/{{version}}/Illuminate/Log/Writer.html) | `log` 146 | Mail | [Illuminate\Mail\Mailer](http://laravel.com/api/{{version}}/Illuminate/Mail/Mailer.html) | `mailer` 147 | Password | [Illuminate\Auth\Passwords\PasswordBroker](http://laravel.com/api/{{version}}/Illuminate/Auth/Passwords/PasswordBroker.html) | `auth.password` 148 | Queue | [Illuminate\Queue\QueueManager](http://laravel.com/api/{{version}}/Illuminate/Queue/QueueManager.html) | `queue` 149 | Queue (Instance) | [Illuminate\Queue\QueueInterface](http://laravel.com/api/{{version}}/Illuminate/Queue/QueueInterface.html) | 150 | Queue (Base Class) | [Illuminate\Queue\Queue](http://laravel.com/api/{{version}}/Illuminate/Queue/Queue.html) | 151 | Redirect | [Illuminate\Routing\Redirector](http://laravel.com/api/{{version}}/Illuminate/Routing/Redirector.html) | `redirect` 152 | Redis | [Illuminate\Redis\Database](http://laravel.com/api/{{version}}/Illuminate/Redis/Database.html) | `redis` 153 | Request | [Illuminate\Http\Request](http://laravel.com/api/{{version}}/Illuminate/Http/Request.html) | `request` 154 | Response | [Illuminate\Contracts\Routing\ResponseFactory](http://laravel.com/api/{{version}}/Illuminate/Contracts/Routing/ResponseFactory.html) | 155 | Route | [Illuminate\Routing\Router](http://laravel.com/api/{{version}}/Illuminate/Routing/Router.html) | `router` 156 | Schema | [Illuminate\Database\Schema\Blueprint](http://laravel.com/api/{{version}}/Illuminate/Database/Schema/Blueprint.html) | 157 | Session | [Illuminate\Session\SessionManager](http://laravel.com/api/{{version}}/Illuminate/Session/SessionManager.html) | `session` 158 | Session (Instance) | [Illuminate\Session\Store](http://laravel.com/api/{{version}}/Illuminate/Session/Store.html) | 159 | Storage | [Illuminate\Contracts\Filesystem\Factory](http://laravel.com/api/{{version}}/Illuminate/Contracts/Filesystem/Factory.html) | `filesystem` 160 | URL | [Illuminate\Routing\UrlGenerator](http://laravel.com/api/{{version}}/Illuminate/Routing/UrlGenerator.html) | `url` 161 | Validator | [Illuminate\Validation\Factory](http://laravel.com/api/{{version}}/Illuminate/Validation/Factory.html) | `validator` 162 | Validator (Instance) | [Illuminate\Validation\Validator](http://laravel.com/api/{{version}}/Illuminate/Validation/Validator.html) | 163 | View | [Illuminate\View\Factory](http://laravel.com/api/{{version}}/Illuminate/View/Factory.html) | `view` 164 | View (Instance) | [Illuminate\View\View](http://laravel.com/api/{{version}}/Illuminate/View/View.html) | 165 | -------------------------------------------------------------------------------- /5.0/filesystem.md: -------------------------------------------------------------------------------- 1 | # سیستم فایل / ذخیره سازی ابری 2 | 3 | - [آشنایی](#introduction) 4 | - [پیکربندی](#configuration) 5 | - [کاربرد پایه](#basic-usage) 6 | - [سیستم فایل اختصاصی](#custom-filesystems) 7 | 8 | 9 | ## آشنایی 10 | 11 | لاراول امکانات فایل سیستم بسیار مفیدی را با اتکا به کتابخانه [Flysystem](https://github.com/thephpleague/flysystem) که یک بسته PHP است ارائه میدهد. این کتابخانه توسط Frank de Jonge تهیه شده است. استفاده لاراول از Flysystem درایورهای ساده ای برای کار با سیستم فایل محلی، Amazon S3، و فضای ذخیره سازی ابری Rackspace فراهم می آورد. یکسان بودن API برای همه این گزینه ها سوئیچ بین آنها را ساده میکند. 12 | 13 | 14 | ## پیکربندی 15 | 16 | فایل پیکربندی سیستم فایل، در مسیر `config/filesystems.php` قرار دارد. در این فایل میتوانید تمامی دیسکهایتان را پیکربندی نمایید. هر دیسک نماینده یک درایور ذخیره سازی است، پیکربندی نمونه برای هر درایور پشتیبانی شده در فایل پیکربندی ارائه شده است. بنابراین، به سادگی میتوانید با تغییر مقادیر، تنظیمات پیکربندی و مجوزهای دسترسی مربوط به فضای ذخیره سازی خود را جایگزین کنید! 17 | 18 | پیش از استفاده از درایورهای S3 و Rackspace، باید بسته های متناسب را با استفاده از کامپوزر نصب کنید: 19 | 20 | - Amazon S3: `league/flysystem-aws-s3-v2 ~1.0` 21 | - Rackspace: `league/flysystem-rackspace ~1.0` 22 | 23 | البته، هر تعداد دیسک را که بخواهید میتوانید تنظیم کنید و یا میتوانید چندین دیسک با درایور مشابه داشته باشید. 24 | 25 | هنگامی که از یک درایور `local` استفاده میکنید، توجه داشته باشید تمامی عملیات فایلی که انجام میدهید نسبت به دایرکتوری `root` که در فایل پیکربندی معرفی کرده اید انجام می شود. به صورت پیش فرض، این مقدار برابر با دایرکتوری `storage/app` مقداردهی شده است. بنابراین، متد زیر فایل را در آدرس `storage/app/file.txt` ذخیره مینماید: 26 | 27 | Storage::disk('local')->put('file.txt', 'Contents'); 28 | 29 | 30 | ## کاربرد ابتدایی 31 | 32 | برای کار با هر یک از دیسکهای پیکربندی شده می توانید از فاساد `Storage` استفاده نمایید. به جای آن، میتوانید کانترکت `Illuminate\Contracts\Filesystem\Factory` را بر روی هر کلاسی که توسط [service container](/docs/%7B%7Bversion%7D%7D/container) لاراول شناخته می شود، تایپ هینت کنید. 33 | 34 | #### بازیابی یک دیسک مشخص 35 | 36 | $disk = Storage::disk('s3'); 37 | 38 | $disk = Storage::disk('local'); 39 | 40 | #### تعیین وجود یک فایل 41 | 42 | $exists = Storage::disk('s3')->exists('file.jpg'); 43 | 44 | #### فراخوانی متدها بر روی دیسک پیش فرض 45 | 46 | if (Storage::exists('file.jpg')) 47 | { 48 | // 49 | } 50 | 51 | #### بازیابی محتوای یک فایل 52 | 53 | $contents = Storage::get('file.jpg'); 54 | 55 | #### مقداردهی محتوای فایل 56 | 57 | Storage::put('file.jpg', $contents); 58 | 59 | #### افزودن به ابتدای یک فایل 60 | 61 | Storage::prepend('file.log', 'Prepended Text'); 62 | 63 | #### افزودن به انتهای یک فایل 64 | 65 | Storage::append('file.log', 'Appended Text'); 66 | 67 | #### حذف یک فایل 68 | 69 | Storage::delete('file.jpg'); 70 | 71 | Storage::delete(['file1.jpg', 'file2.jpg']); 72 | 73 | #### کپی یک فایل در یک مکان جدید 74 | 75 | Storage::copy('old/file1.jpg', 'new/file1.jpg'); 76 | 77 | #### جابجایی یک فایل به یک مکان جدید 78 | 79 | Storage::move('old/file1.jpg', 'new/file1.jpg'); 80 | 81 | #### گرفتن اندازه یک فایل 82 | 83 | $size = Storage::size('file1.jpg'); 84 | 85 | #### خواندن آخرین زمان ویرایش یک فایل (UNIX) 86 | 87 | $time = Storage::lastModified('file1.jpg'); 88 | 89 | #### خواندن تمامی فایلهای یک دایرکتوری 90 | 91 | $files = Storage::files($directory); 92 | 93 | // Recursive... 94 | $files = Storage::allFiles($directory); 95 | 96 | #### خواندن تمامی دایرکتوریهای درون یک دایرکتوری 97 | 98 | $directories = Storage::directories($directory); 99 | 100 | // Recursive... 101 | $directories = Storage::allDirectories($directory); 102 | 103 | #### ایجاد یک دایرکتوری 104 | 105 | Storage::makeDirectory($directory); 106 | 107 | #### حذف یک دایرکتوری 108 | 109 | Storage::deleteDirectory($directory); 110 | 111 | 112 | ## سیستمهای فایل اختصاصی 113 | 114 | ترکیب لاراول با Flysystem درایورهایی بسیاری ارائه میکند؛ هر چند Flysystem محدود به این فایل سیستمها نیست و مبدلهایی برای سیستمهای ذخیره سازی بسیار دیگری ارائه می دهد. میتوانید برای استفاده از آنها در نرم افزارهای لاراول خود درایورهای اختصاصی تولید نمایید. نگران نباشید، چندان سخت نیست! 115 | 116 | برای ایجاد یک سیستم فایل جدید شما باید یک service provider مانند `DropboxFilesystemServiceProvider` ایجاد نمایید. در متد `boot` مربوط به provider باید نمونه ای از کانترکت `Illuminate\Contracts\Filesystem\Factory` را تزریق نمایید و متد `extend` را برای نمونه تزریق شده فراخوانی کنید. در روشی دیگر میتوانید از متد `extend` فاساد `Disk` استفاده کنید. 117 | 118 | آرگومان اول متد `extend` نام درایور است، و آرگومان دوم کلوژری است که متغیرهای `$app` و `$config` را دریافت میکند. به کلوژر resolver باید نمونه ای از کلاس `League\Flysystem\Filesystem` ارسال کنید. 119 | 120 | > **نکته:** متغیر $config حاوی تمامی مقادیر تعریف شده در `config/filesystems.php` برای دیسک مشخص شده است. 121 | 122 | #### مثال Dropbox 123 | 124 | 7 | ## معرفی 8 | از فاساد `Hash` در لاراول برای برای ذخیره رمز کاربر به روش ( Bcrypt hashing) استفاده میشود . اگر از کنترلر `AuthController` استفاده میکنید (بصورت پیشفرض در اپلیکیشن شما وجود دارد) یکی از وظایف این کنترلر هش کردن رمز ورودی کاربران است . 9 | 10 | 11 | 12 | ## روش استفاده 13 | 14 | #### هش کردن پسوورد با روش Bcrypt 15 | 16 | $password = Hash::make('secret'); 17 | 18 | همچنین میتوانید از تابع کمکی `bcrypt` استفاده کنید : 19 | 20 | $password = bcrypt('secret'); 21 | 22 | #### مقایسه یک رشته با یک رشته هش شده 23 | 24 | if (Hash::check('secret', $hashedPassword)) 25 | { 26 | // The passwords match... 27 | } 28 | 29 | #### بررسی اینکه آیا پسوورد نیاز به Hash شدن دوباره دارد یا خیر 30 | 31 | if (Hash::needsRehash($hashed)) 32 | { 33 | $hashed = Hash::make('secret'); 34 | } 35 | -------------------------------------------------------------------------------- /5.0/helpers.md: -------------------------------------------------------------------------------- 1 | # تابع های کمکی - Helpers 2 | 3 | - [آرایه ها - Arrays](#arrays) 4 | - [مسیرها - Paths](#paths) 5 | - [نگاشت مسیر - Routing](#routing) 6 | - [Strings](#strings) 7 | - [URLs](#urls) 8 | - [متنوع](#miscellaneous) 9 | 10 | 11 | ## آرایه ها - Arrays 12 | 13 | ### array_add 14 | 15 | تابع `array_add` در صورتی که دوتایی کلید / مقدار در آرایه وجود نداشته باشد، آن را به آرایه می افزاید. 16 | 17 | $array = ['foo' => 'bar']; 18 | 19 | $array = array_add($array, 'key', 'value'); 20 | 21 | ### array_divide 22 | 23 | تابع `array_divide` دو آرایه بازمیگرداند، یکی شامل کلیدها و دیگری مقادیر موجود در آرایه اولیه. 24 | 25 | $array = ['foo' => 'bar']; 26 | 27 | list($keys, $values) = array_divide($array); 28 | 29 | ### array_dot 30 | 31 | تابع `array_dot` آرایه های چندبعدی را به آرایه تک بعدی کاهش بعد داده و امکان دسترسی به عمق آرایه با استفاده از "." فراهم میکند. 32 | 33 | $array = ['foo' => ['bar' => 'baz']]; 34 | 35 | $array = array_dot($array); 36 | 37 | // ['foo.bar' => 'baz']; 38 | 39 | ### array_except 40 | 41 | تابع `array_except` دوتایی کلید / مقدار را از آرایه حذف میکند. 42 | 43 | $array = array_except($array, ['keys', 'to', 'remove']); 44 | 45 | ### array_fetch 46 | 47 | تابع `array_fetch` آرایه ای تک بعدی شامل مقادیر کلید داده شده باز میگرداند. 48 | 49 | $array = [ 50 | ['developer' => ['name' => 'Taylor']], 51 | ['developer' => ['name' => 'Dayle']] 52 | ]; 53 | 54 | $array = array_fetch($array, 'developer.name'); 55 | 56 | // ['Taylor', 'Dayle']; 57 | 58 | ### array_first 59 | 60 | تابع `array_first` اولین عنصر یک آرایه که شرط ارائه شده را داشته باشد باز میگرداند. 61 | 62 | $array = [100, 200, 300]; 63 | 64 | $value = array_first($array, function($key, $value) 65 | { 66 | return $value >= 150; 67 | }); 68 | 69 | یک مقدار پیش فرض را نیز به عنوان پارامتر سوم میتوان به تابع فرستاد: 70 | 71 | $value = array_first($array, $callback, $default); 72 | 73 | ### array_last 74 | 75 | تابع `array_last` آخرین عنصر آرایه ای که شرط ارائه شده در مورد آن صادق باشد را برمیگرداند. 76 | 77 | $array = [350, 400, 500, 300, 200, 100]; 78 | 79 | $value = array_last($array, function($key, $value) 80 | { 81 | return $value > 350; 82 | }); 83 | 84 | // 500 85 | 86 | یک مقدار پیش فرض را نیز به عنوان پارامتر سوم میتوان به تابع فرستاد: 87 | 88 | $value = array_last($array, $callback, $default); 89 | 90 | ### array_flatten 91 | 92 | تابع `array_flatten` یک آرایه چند بعدی را تبدیل به آرایه ای تک بعدی مینماید. 93 | 94 | $array = ['name' => 'Joe', 'languages' => ['PHP', 'Ruby']]; 95 | 96 | $array = array_flatten($array); 97 | 98 | // ['Joe', 'PHP', 'Ruby']; 99 | 100 | ### array_forget 101 | 102 | تابع `array_forget` یک دوتایی را از عمق آرایه ای تو در تو با استفاده از "." حذف مینماید. 103 | 104 | $array = ['names' => ['joe' => ['programmer']]]; 105 | 106 | array_forget($array, 'names.joe'); 107 | 108 | ### array_get 109 | 110 | تابع `array_get` یک مقدار داده شده را از عمق یک آرایه چند بعدی با استفاده از "." باز میگرداند. 111 | 112 | $array = ['names' => ['joe' => ['programmer']]]; 113 | 114 | $value = array_get($array, 'names.joe'); 115 | 116 | $value = array_get($array, 'names.john', 'default'); 117 | 118 | > **نکته:** چیزی شبیه به `array_get` اما برای اشیاء لازم دارید؟ از `object_get` استفاده کنید. 119 | 120 | ### array_only 121 | 122 | متد `array_only` تنها دوتاییهای مشخص شده را از آرایه بازمیگرداند. 123 | 124 | $array = ['name' => 'Joe', 'age' => 27, 'votes' => 1]; 125 | 126 | $array = array_only($array, ['name', 'votes']); 127 | 128 | ### array_pluck 129 | 130 | متد `array_pluck` لیستی از دوتایی های کلید / مقدار را از آرایه ایجاد میکند. 131 | 132 | $array = [['name' => 'Taylor'], ['name' => 'Dayle']]; 133 | 134 | $array = array_pluck($array, 'name'); 135 | 136 | // ['Taylor', 'Dayle']; 137 | 138 | ### array_pull 139 | 140 | متد `array_pull` پس از بازگرداندن یک دوتایی کلید / مقدار از یک آرایه، آن را حذف میکند. 141 | 142 | $array = ['name' => 'Taylor', 'age' => 27]; 143 | 144 | $name = array_pull($array, 'name'); 145 | 146 | ### array_set 147 | 148 | متد `array_set` مقدار را در عمق یک آرایه با استفاده از "." مقداردهی میکند. 149 | 150 | $array = ['names' => ['programmer' => 'Joe']]; 151 | 152 | array_set($array, 'names.editor', 'Taylor'); 153 | 154 | ### array_sort 155 | 156 | متد `array_sort` آرایه را با توجه به نتایج کلوژر ارائه شده مرتب سازی میکند. 157 | 158 | $array = [ 159 | ['name' => 'Jill'], 160 | ['name' => 'Barry'] 161 | ]; 162 | 163 | $array = array_values(array_sort($array, function($value) 164 | { 165 | return $value['name']; 166 | })); 167 | 168 | ### array_where 169 | 170 | آرایه را با استفاده از کلوژر ارائه شده فیلتر مینماید. 171 | 172 | $array = [100, '200', 300, '400', 500]; 173 | 174 | $array = array_where($array, function($key, $value) 175 | { 176 | return is_string($value); 177 | }); 178 | 179 | // Array ( [1] => 200 [3] => 400 ) 180 | 181 | ### head 182 | 183 | اولین عنصر در آرایه را بازمیگرداند. 184 | 185 | $first = head($this->returnsArray('foo')); 186 | 187 | ### last 188 | 189 | آخرین عنصر آرایه را بازمیگرداند. در فراخوانی زنجیره ای متدها کاربرد دارد. 190 | 191 | $last = last($this->returnsArray('foo')); 192 | 193 | 194 | ## مسیرها - Paths 195 | 196 | ### app_path 197 | 198 | مسیر کامل دایرکتوری `app` را بازمیگرداند. 199 | 200 | $path = app_path(); 201 | 202 | ### base_path 203 | 204 | مسیر کامل محل نصب پروژه را باز میگرداند. 205 | 206 | ### config_path 207 | 208 | مسیر کامل به دایرکتوری `config` را بازمیگرداند. 209 | 210 | ### public_path 211 | 212 | مسیرکامل دایرکتوری `public` را بازمیگرداند. 213 | 214 | ### storage_path 215 | 216 | مسیر کامل دایرکتوری `storage` را بازمیگرداند. 217 | 218 | 219 | ## Routing 220 | 221 | ### get 222 | 223 | route جدیدی از نوع GET را ثبت میکند. 224 | 225 | get('/', function() { return 'Hello World'; }); 226 | 227 | ### post 228 | 229 | route جدیدی از نوع POST را ثبت میکند. 230 | 231 | post('foo/bar', 'FooController@action'); 232 | 233 | ### put 234 | 235 | route جدیدی از نوع PUT را ثبت میکند. 236 | 237 | put('foo/bar', 'FooController@action'); 238 | 239 | ### patch 240 | 241 | route جدیدی از نوع PATCH را ثبت میکند. 242 | 243 | patch('foo/bar', 'FooController@action'); 244 | 245 | ### delete 246 | 247 | route جدیدی از نوع DELETE را ثبت میکند. 248 | 249 | delete('foo/bar', 'FooController@action'); 250 | 251 | ### resource 252 | 253 | route جدیدی از نوع منبع RESTful را ثبت میکند. 254 | 255 | resource('foo', 'FooController'); 256 | 257 | 258 | ## Strings 259 | 260 | ### camel_case 261 | 262 | یک رشته متن داده شده را به `camelCase` تبدیل میکند. 263 | 264 | $camel = camel_case('foo_bar'); 265 | 266 | // fooBar 267 | 268 | ### class_basename 269 | 270 | نام کلاس داده شده را بدون فضای نام (namespace) ارائه میکند. 271 | 272 | $class = class_basename('Foo\Bar\Baz'); 273 | 274 | // Baz 275 | 276 | ### e 277 | 278 | تابع `htmlentities` را بر روی یک string با پشتیبانی از UTF-8 اجرا میکند. 279 | 280 | $entities = e('foo'); 281 | 282 | ### ends_with 283 | 284 | بررسی میکند آیا رشته ارائه شده به مقدار مورد نظر ختم می شود. 285 | 286 | $value = ends_with('This is my name', 'name'); 287 | 288 | ### snake_case 289 | 290 | رشته ارائه شده را به `snake_case` تبدیل میکند. 291 | 292 | $snake = snake_case('fooBar'); 293 | 294 | // foo_bar 295 | 296 | ### str_limit 297 | 298 | تعداد کاراکترها را در یک رشته به اندازه پارامتر ارائه شده محدود میکند. 299 | 300 | str_limit($value, $limit = 100, $end = '...') 301 | 302 | Example: 303 | 304 | $value = str_limit('The PHP framework for web artisans.', 7); 305 | 306 | // The PHP... 307 | 308 | ### starts_with 309 | 310 | بررسی میکند آیا رشته ارائه شده با مقدار مورد نظر شروع می شود. 311 | 312 | $value = starts_with('This is my name', 'This'); 313 | 314 | 315 | ### str_contains 316 | 317 | وجود مقدار داده شده در رشته متن را بررسی میکند. 318 | 319 | $value = str_contains('This is my name', 'my'); 320 | 321 | ### str_finish 322 | 323 | مقدار ارائه شده را برای یکبار به رشته متن می افزاید. بقیه مقادیر را حذف میکند. 324 | 325 | $string = str_finish('this/string', '/'); 326 | 327 | // this/string/ 328 | 329 | ### str_is 330 | 331 | همخوانی یک رشته متنی با الگوی ارائه شده را بررسی میکند. برای مشخص کردن وجود "هر" مقدار میتوانید از علامت * استفاده کنید. 332 | 333 | $value = str_is('foo*', 'foobar'); 334 | 335 | ### str_plural 336 | 337 | یک رشته را به فرم جمع تبدیل میکند (تنها در زبان انگلیسی). 338 | 339 | $plural = str_plural('car'); 340 | 341 | ### str_random 342 | 343 | رشته ای تصادفی ا زکاراکترها با طول داده شده ایجاد میکند. 344 | 345 | $string = str_random(40); 346 | 347 | ### str_singular 348 | 349 | رشته را به شکل مفرد تبدیل میکند (تنها در زبان انگلیسی). 350 | 351 | $singular = str_singular('cars'); 352 | 353 | ### str_slug 354 | 355 | از یک رشته متن یک عبارت خوش فرم برای URL میسازد. 356 | 357 | str_slug($title, $separator); 358 | 359 | مثال: 360 | 361 | $title = str_slug("Laravel 5 Framework", "-"); 362 | 363 | // laravel-5-framework 364 | 365 | ### studly_case 366 | 367 | رشته متنی را به `StudlyCase` تبدیل میکند. 368 | 369 | $value = studly_case('foo_bar'); 370 | 371 | // FooBar 372 | 373 | ### trans 374 | 375 | ترجمه یک متن را با توجه به زبان انتخاب شده جایگزین میکند. آلیاس (Alias) برای `Lang::get`. 376 | 377 | $value = trans('validation.required'): 378 | 379 | ### trans_choice 380 | 381 | یک متن را با توجه به تعداد کلمات مشخص شده ترجمه میکند. آلیاس (Alias) برای `Lang::choice` 382 | 383 | $value = trans_choice('foo.bar', $count); 384 | 385 | 386 | ## URLs 387 | 388 | ### action 389 | 390 | URL برای مربوط به یک متد کنترلررا ارائه مینماید. 391 | 392 | $url = action('HomeController@getIndex', $params); 393 | 394 | ### route 395 | 396 | URL متناظر با یک route نامگذاری شده را ایجاد میکند. 397 | 398 | $url = route('routeName', $params); 399 | 400 | ### asset 401 | 402 | URL مربوط به منابع استاتیک (عکس، جاوااسکریپت، css) را ایجاد میکند. 403 | 404 | $url = asset('img/photo.jpg'); 405 | 406 | ### secure_asset 407 | 408 | ایجاد URL مربوط به منابع استاتیک با استفاده از HTTPS. 409 | 410 | echo secure_asset('foo/bar.zip', $title, $attributes = []); 411 | 412 | ### secure_url 413 | 414 | ایجاد URL کامل به یک مسیر مشخص شده در قالب HTTPS. 415 | 416 | echo secure_url('foo/bar', $parameters = []); 417 | 418 | ### url 419 | 420 | URL کامل برای یک مسیر مشخص شده ایجاد میکند. 421 | 422 | echo url('foo/bar', $parameters = [], $secure = null); 423 | 424 | 425 | ## Miscellaneous 426 | 427 | ### csrf_token 428 | 429 | مقدار توکن CSRF فعلی را باز میگرداند. 430 | 431 | $token = csrf_token(); 432 | 433 | ### dd 434 | 435 | متغیر مشخص شده را چاپ میکند و اجرای اسکریپت را متوقف میکند. 436 | 437 | dd($value); 438 | 439 | ### elixir 440 | 441 | مسیر فایل ورژن گذاری شده Elixir را باز میگرداند. 442 | 443 | elixir($file); 444 | 445 | ### env 446 | 447 | مقدار متغیر محلی را باز میگرداند. در صورت نداشتن مقدار مقدار پیش فرض را باز میگرداند. 448 | 449 | env('APP_ENV', 'production') 450 | 451 | ### event 452 | 453 | اجرای یک رویداد 454 | 455 | event('my.event'); 456 | 457 | ### value 458 | 459 | اگر مقدار داده شده `Closure` باشد، مقدار بازگردانده شده توسط `Closure` را باز میگرداند. در غیراینصورت مقدار مشخص شده را بازمیگرداند. 460 | 461 | $value = value(function() { return 'bar'; }); 462 | 463 | ### view 464 | 465 | نمونه View برای مسیر view مشخص شده را بازمیگرداند. 466 | 467 | return view('auth.login'); 468 | 469 | ### with 470 | 471 | شی مشخص شده را بازمیگرداند. 472 | 473 | $value = with(new Foo)->doWork(); 474 | -------------------------------------------------------------------------------- /5.0/installation.md: -------------------------------------------------------------------------------- 1 | # نصب 2 | 3 | - [نصب کامپوزر](#install-composer) 4 | - [نصب لاراول](#install-laravel) 5 | - [نیازمندیهای سرور](#server-requirements) 6 | 7 | 8 | ## نصب کامپوزر 9 | 10 | لاراول برای مدیریت وابستگیهای پروژه از [کامپوزر](http://getcomposer.org) استفاده میکند. بنابراین پیش از استفاده از لاروال، باید از نصب بودن کامپوزر بر روی سیستم خود مطمئن شوید. 11 | 12 | 13 | ## نصب لاراول 14 | 15 | ### از طریق نصب کننده لاروال 16 | 17 | برای قدم اول لاراول را با استفاده از کامپوزر بر روی سیستم خود نصب کنید. 18 | 19 | composer global require "laravel/installer=~1.1" 20 | 21 | دایرکتوری `~/.composer/vendor/bin` را در متغیر محیطی PATH قرار دهید تا سیستم محل قرار گرفتن`laravel` را بداند. 22 | 23 | پس از نصب لاراول، اجرای دستور ساده `laravel new` در خط فرمان یک نسخه خام از یک پروژه لاراول را در مکانی که معرفی میکنید نصب میکند. برای مثال `laravel new blog` یک دایرکتوری با نام `blog` شامل یک نسخه خام پروژه لاراول با تمام بسته های مورد نیاز ایجاد مینماید. این روش نصب بسیار سریعتر از استفاده از کامپوزر است: 24 | 25 | laravel new blog 26 | 27 | ### با استفاده از دستور create-project کامپوزر 28 | 29 | همچنین میتوان با استفاده از دستور `create-project` کامپوزر در خط فرمان یک پروژه خام لاراول ایجاد نمایید: 30 | 31 | composer create-project laravel/laravel {directory} "~5.0.0" --prefer-dist 32 | 33 | پس از نصب، باید پروژه را با آخرین بسته های لاراول به روزرسانی نمایید. ابتدا، فایل `{directory}/vendor/compiled.php` را حذف نمایید. در خط فرمان دایرکتوری خود را به `{directory}` تغییر دهید و دستور `composer update` را اجرا کنید. 34 | 35 | ### Scaffolding 36 | 37 | لاراول از ابتدا برای ثبت کاربران و سنجش هویت کاربران scaffolding را با خود دارد. اگر میخواهید این امکانات را حذف نمایید، از دستور `fresh` در آرتیزان استفاده کنید: 38 | 39 | php artisan fresh 40 | 41 | 42 | ## نیازمندیهای سرور 43 | 44 | سرور لاراول مورد استفاده برای این نسخه نیازمندیهای زیر را دارد: 45 | 46 | - PHP >= 5.4 47 | - Mcrypt PHP Extension 48 | - OpenSSL PHP Extension 49 | - Mbstring PHP Extension 50 | - Tokenizer PHP Extension 51 | 52 | بعد از PHP 5.5، در برخی توزیعهای سیستم عاملها اکستنشن PHP JSON را باید دستی نصب نمود. وقتی از اوبونتر استفاده میکنید، این کار را میتوان با استفاده از دستور `apt-get install php5-json` انجام داد. 53 | 54 | 55 | ## پیکربندی 56 | 57 | اولین کاری که پس از انجام لاراول باید انجام دهید، مقداردهی کلید اپلیکیشن با رشته ای تصادفی است. اگر کامپوزر را با استفاده از کامپوزر نصب کرده اید، این کلید احتمالا با استفاده از فرمان `key:generate` مقداردهی شده باشد. 58 | 59 | این رشته باید 32 کاراکتر داشته باشد. این کلید را میتوانید در فایل متغیرهای محیطی لاراول با پسوند `.env` مقداردهی کنید. 60 | **اگر کلید اپلیکیشن را مقداردهی نکنید، نشست و دیگر داده های کدگذاری شده کاربر امن نخواهند بود** 61 | 62 | لاراول تقریبا نیازی به تنظیمات دیگری ندارد. میتوانید شروع به توسعه نرم افزارهای کاربردی تحت وب نمایید! هرچند میتوانید فایل `config/app.php` و مستندات آن را مرور نمایید. این فایل شامل گزینه ها بسیار زیادی مانند `timezone` یا `ناحیه زمانی` و `locale` یا `تنظیمات محلی` میباشد که میتوانید متناسب با نرم افزار تحت وب خود تغییر دهید. 63 | 64 | پس از نصب لاراول، همچنین باید [تنظیمات محلی خود را هم تغییر دهید](/docs/{{version}}/configuration#environment-configuration). 65 | > **نکته:** هیچگاه برای نرم افزارهای کاربردی واقعی مقدار `app.debug` را `true` نگذارید. 66 | 67 | 68 | ### دسترسی ها 69 | 70 | شاید نیاز باشد برخی دسترسی ها برای لاراول تعریف شود: وب سرور برای اعمال تغییرات در پوشه های `storage` و `vendor` نیازمند دسترسی کافی برای نوشتن میباشد. 71 | 72 | 73 | ## Pretty URL - آدرسهای خوانا 74 | 75 | ### آپاچی 76 | 77 | لاراول به همراه یک فایل `public/.htaccess` به منظور ایجاد امکان وجود URLهای بدون `index.php` ارائه میشود. 78 | 79 | اگر فایل `.htaccess` ارائه شده در کنار لاراول کار نمیکند، میتوانید راه حل زیر را امتحان کنید. 80 | 81 | Options +FollowSymLinks 82 | RewriteEngine On 83 | 84 | RewriteCond %{REQUEST_FILENAME} !-d 85 | RewriteCond %{REQUEST_FILENAME} !-f 86 | RewriteRule ^ index.php [L] 87 | 88 | ### Nginx 89 | 90 | بر روی Ngnix راهنمای سرور زیر در تنظیمات سرور امکان pretty URL (آدرسهای خوانا) را فراهم میکند. 91 | 92 | location / { 93 | try_files $uri $uri/ /index.php?$query_string; 94 | } 95 | 96 | البته هنگامی که از [Homestead](/docs/{{version}}/homestead) استفاده میکنید، آدرسهای خوانا به شکل خودکار تنظیم می شوند. -------------------------------------------------------------------------------- /5.0/license.md: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | Copyright © Taylor Otwell 3 | 4 | Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the “Software”), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: 5 | 6 | The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. 7 | 8 | THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -------------------------------------------------------------------------------- /5.0/lifecycle.md: -------------------------------------------------------------------------------- 1 | # Request Lifecycle 2 | 3 | - [Introduction](#introduction) 4 | - [Lifecycle Overview](#lifecycle-overview) 5 | - [Focus On Service Providers](#focus-on-service-providers) 6 | 7 | 8 | ## Introduction 9 | 10 | When using any tool in the "real world", you feel more confident if you understand how that tool works. Application development is no different. When you understand how your development tools function, you feel more comfortable and confident using them. 11 | 12 | The goal of this document is to give you a good, high-level overview of how the Laravel framework "works". By getting to know the overall framework better, everything feels less "magical" and you will be more confident building your applications. 13 | 14 | If you don't understand all of the terms right away, don't lose heart! Just try to get a basic grasp of what is going on, and your knowledge will grow as you explore other sections of the documentation. 15 | 16 | 17 | ## Lifecycle Overview 18 | 19 | #### First Things 20 | 21 | The entry point for all requests to a Laravel application is the `public/index.php` file. All requests are directed to this file by your web server (Apache / Nginx) configuration. The `index.php` file doesn't contain much code. Rather, it is simply a starting point for loading the rest of the framework. 22 | 23 | The `index.php` file loads the Composer generated autoloader definition, and then retrieves an instance of the Laravel application from `bootstrap/app.php` script. The first action taken by Laravel itself is to create an instance of the application / [service container](/docs/{{version}}/container). 24 | 25 | #### HTTP / Console Kernels 26 | 27 | Next, the incoming request is sent to either the HTTP kernel or the console kernel, depending on the type of request that is entering the application. These two kernels serve as the central location that all requests flow through. For now, let's just focus on the HTTP kernel, which is located in `app/Http/Kernel.php`. 28 | 29 | The HTTP kernel extends the `Illuminate\Foundation\Http\Kernel` class, which defines an array of `bootstrappers` that will be run before the request is executed. These bootstrappers configure error handling, configure logging, detect the application environment, and perform other tasks that need to be done before the request is actually handled. 30 | 31 | The HTTP kernel also defines a list of HTTP [middleware](/docs/{{version}}/middleware) that all requests must pass through before being handled by the application. These middleware handle reading and writing the HTTP session, determine if the application is in maintenance mode, verifying the CSRF token, and more. 32 | 33 | The method signature for the HTTP kernel's `handle` method is quite simple: receive a `Request` and return a `Response`. Think of the Kernel as being a big black box that represents your entire application. Feed it HTTP requests and it will return HTTP responses. 34 | 35 | #### Service Providers 36 | 37 | One of the most important Kernel bootstrapping actions is loading the service providers for your application. All of the service providers for the application are configured in the `config/app.php` configuration file's `providers` array. First, the `register` method will be called on all providers, then, once all providers have been registered, the `boot` method will be called. 38 | 39 | #### Dispatch Request 40 | 41 | Once the application has been bootstrapped and all service providers have been registered, the `Request` will be handed off to the router for dispatching. The router will dispatch the request to a route or controller, as well as run any route specific middleware. 42 | 43 | 44 | ## Focus On Service Providers 45 | 46 | Service providers are truly the key to bootstrapping a Laravel application. The application instance is created, the service providers are registered, and the request is handed to the bootstrapped application. It's really that simple! 47 | 48 | Having a firm grasp of how a Laravel application is built and bootstrapped via service providers is very valuable. Of course, your application's default service providers are stored in the `app/Providers` directory. 49 | 50 | By default, the `AppServiceProvider` is fairly empty. This provider is a great place to add your application's own bootstrapping and service container bindings. Of course, for large applications, you may wish to create several service providers, each with a more granular type of bootstrapping. 51 | -------------------------------------------------------------------------------- /5.0/localization.md: -------------------------------------------------------------------------------- 1 | # Localization 2 | 3 | - [Introduction](#introduction) 4 | - [Language Files](#language-files) 5 | - [Basic Usage](#basic-usage) 6 | - [Pluralization](#pluralization) 7 | - [Validation Localization](#validation) 8 | - [Overriding Package Language Files](#overriding-package-language-files) 9 | 10 | 11 | ## Introduction 12 | 13 | The Laravel `Lang` facade provides a convenient way of retrieving strings in various languages, allowing you to easily support multiple languages within your application. 14 | 15 | 16 | ## Language Files 17 | 18 | Language strings are stored in files within the `resources/lang` directory. Within this directory there should be a subdirectory for each language supported by the application. 19 | 20 | /resources 21 | /lang 22 | /en 23 | messages.php 24 | /es 25 | messages.php 26 | 27 | #### Example Language File 28 | 29 | Language files simply return an array of keyed strings. For example: 30 | 31 | 'Welcome to our application' 35 | ]; 36 | 37 | #### Changing The Default Language At Runtime 38 | 39 | The default language for your application is stored in the `config/app.php` configuration file. You may change the active language at any time using the `App::setLocale` method: 40 | 41 | App::setLocale('es'); 42 | 43 | #### Setting The Fallback Language 44 | 45 | You may also configure a "fallback language", which will be used when the active language does not contain a given language line. Like the default language, the fallback language is also configured in the `config/app.php` configuration file: 46 | 47 | 'fallback_locale' => 'en', 48 | 49 | 50 | ## Basic Usage 51 | 52 | #### Retrieving Lines From A Language File 53 | 54 | echo Lang::get('messages.welcome'); 55 | 56 | The first segment of the string passed to the `get` method is the name of the language file, and the second is the name of the line that should be retrieved. 57 | 58 | > **Note:** If a language line does not exist, the key will be returned by the `get` method. 59 | 60 | You may also use the `trans` helper function, which is an alias for the `Lang::get` method. 61 | 62 | echo trans('messages.welcome'); 63 | 64 | #### Making Replacements In Lines 65 | 66 | You may also define place-holders in your language lines: 67 | 68 | 'welcome' => 'Welcome, :name', 69 | 70 | Then, pass a second argument of replacements to the `Lang::get` method: 71 | 72 | echo Lang::get('messages.welcome', ['name' => 'Dayle']); 73 | 74 | #### Determine If A Language File Contains A Line 75 | 76 | if (Lang::has('messages.welcome')) 77 | { 78 | // 79 | } 80 | 81 | 82 | ## Pluralization 83 | 84 | Pluralization is a complex problem, as different languages have a variety of complex rules for pluralization. You may easily manage this in your language files. By using a "pipe" character, you may separate the singular and plural forms of a string: 85 | 86 | 'apples' => 'There is one apple|There are many apples', 87 | 88 | You may then use the `Lang::choice` method to retrieve the line: 89 | 90 | echo Lang::choice('messages.apples', 10); 91 | 92 | You may also supply a locale argument to specify the language. For example, if you want to use the Russian (ru) language: 93 | 94 | echo Lang::choice('товар|товара|товаров', $count, [], 'ru'); 95 | 96 | Since the Laravel translator is powered by the Symfony Translation component, you may also create more explicit pluralization rules easily: 97 | 98 | 'apples' => '{0} There are none|[1,19] There are some|[20,Inf] There are many', 99 | 100 | 101 | 102 | ## Validation 103 | 104 | For localization for validation errors and messages, take a look at the documentation on Validation. 105 | 106 | 107 | ## Overriding Package Language Files 108 | 109 | Many packages ship with their own language lines. Instead of hacking the package's core files to tweak these lines, you may override them by placing files in the `resources/lang/packages/{locale}/{package}` directory. So, for example, if you need to override the English language lines in `messages.php` for a package named `skyrim/hearthfire`, you would place a language file at: `resources/lang/packages/en/hearthfire/messages.php`. In this file you would define only the language lines you wish to override. Any language lines you don't override will still be loaded from the package's language files. 110 | -------------------------------------------------------------------------------- /5.0/mail.md: -------------------------------------------------------------------------------- 1 | # ایمیل (Mail) 2 | 3 | - [تنظیمات](#configuration) 4 | - [کاربرد ابتدایی](#basic-usage) 5 | - [افزودن پیوست درلحظه - Inline Attachment](#embedding-inline-attachments) 6 | - [صف کردن ایمیل ها](#queueing-mail) 7 | - [ایمیل و توسعه محلی](#mail-and-local-development) 8 | 9 | 10 | ## تنظیمات 11 | 12 | لاراول یک API ساده و خوش ساخت برپایه کتابخانه معروف [SwiftMailer](http://swiftmailer.org) ارائه می نماید. فایل تنظیمات ایمیل `config/mail.php` است، و گزینه هایی برای تنظیم میزبان SMTP، پورت، و اطلاعات دسترسی و همینطور یک متغیر عمومی `from` برای تمامی ایمیل های فرستاده شده توسط این کتابخانه در خود دارد. شما میتوانید از هر سرور SMTP که بخواهید استفاده کنید. اگر میخواهید از تابع `mail` در PHP برای فرستادن ایمیل استفاده کنید، باید مقدار متغیر `driver` درفایل تنظیمات را به `mail` تغییر دهید. یک درایور `sendmail` هم برای استفاده وجود دارد. 13 | 14 | ### درایورهای API 15 | 16 | لاراول همچنین درایورهایی برای APIهای HTTP با نامهای Mailgun و Mandrill ارائه می دهد. این APIها اغلب از سرورهای SMTP ساده تر و سریعتر هستند. هردوی این درایورها برای کار نیاز به نصب یک کتابخانه HTTP با نام Guzzle 5 دارند. با افزودن خط زیر به فایل `composer.json` میتوانید کتابخانه Guzzle 5 را به پروژه خود بیافزایید: 17 | 18 | "guzzlehttp/guzzle": "~5.0" 19 | 20 | #### درایور Mailgun 21 | 22 | برای استفاده از درایور Mailgun در فایل تنظیمات `config/mail.php` مقدار متغیر `driver` را با `mailgun` مقداردهی کنید. در قدم بعد اگر فایل تنظیمات `config/services.php` وجود ندارد آن را ایجاد کنید. از وجود متغیرهای زیر در آن مطمئن شوید: 23 | 24 | 'mailgun' => [ 25 | 'domain' => 'your-mailgun-domain', 26 | 'secret' => 'your-mailgun-key', 27 | ], 28 | 29 | #### درایور Mandrill 30 | 31 | برای استفاده از درایور Mandrill در فایل تنظیمات `config/mail.php` مقدار متغیر `driver` را با `mandrill` مقداردهی کنید. در قدم بعد اگر فایل تنظیمات `config/services.php` وجود ندارد آن را ایجاد کنید. از وجود متغیرهای زیر در آن مطمئن شوید: 32 | 33 | 'mandrill' => [ 34 | 'secret' => 'your-mandrill-key', 35 | ], 36 | 37 | ### درایور لاگ 38 | 39 | اگر مقدار متغیر `driver` در فایل تنظیمات `config/mail.php` با `log` مقداردهی شده باشد، تمامی ایمیل ها در فایلهای لاگ نوشته خواهند شد، و به هیچ یک از مخاطبین فرستاده نمی شوند. این کار برای عیب یابی و بررسی محتوای محلی و سریع مناسب است. 40 | 41 | 42 | ## کاربرد ابتدایی 43 | 44 | متد `Mail::send` میتواند برای فرستادن ایمیل استفاده شود: 45 | 46 | Mail::send('emails.welcome', ['key' => 'value'], function($message) 47 | { 48 | $message->to('foo@example.com', 'John Smith')->subject('Welcome!'); 49 | }); 50 | 51 | آرگومان اول فرستاده شده به متد `send` نام view استفاده شده به عنوان بدنه ایمیل است. آرگومان دوم داده ای است که باید به view فرستاده شود، و اغلب به عنوان یک آرایه ارائه می شود. داده ها از طریق متغیر `$key` در view قابل دسترس خواهند بود. آرگومان سوم کلوژری است که به شما امکان مشخص کردن گزینه های مختلف در مورد پیام ایمیل را میدهد. 52 | 53 | > **نکته:** همیشه یک متغیر `$message` به view مربوط به ایمیل فرستاده می شود و امکان افزودن پیوست در محل را به وجود می آورد. بنابراین بهتر است از فرستادن متغیر `message` خودداری کنید. 54 | 55 | همینطور میتوانید علاوه بر view در قالب HTML، از view با متن ساده استفاده کنید: 56 | 57 | Mail::send(['html.view', 'text.view'], $data, $callback); 58 | 59 | یا میتوانید با استفاده از کلیدهای `html` یا `text` تنها یک نوع view مشخص نمایید: 60 | 61 | Mail::send(['text' => 'view'], $data, $callback); 62 | 63 | میتوانید گزینه های دیگری مانند رونوشت، یا پیوست هم برای ایمیل خود مشخص نمایید: 64 | 65 | Mail::send('emails.welcome', $data, function($message) 66 | { 67 | $message->from('us@example.com', 'Laravel'); 68 | 69 | $message->to('foo@example.com')->cc('bar@example.com'); 70 | 71 | $message->attach($pathToFile); 72 | }); 73 | 74 | هنگامی که فایلی را به پیام پیوست میکنید، میتوانید نوع MIME و/یا نام نمایش داده شده را هم مشخص نمایید: 75 | 76 | $message->attach($pathToFile, ['as' => $display, 'mime' => $mime]); 77 | 78 | اگر میخواهید به جای یک ایمیل کامل یک string ساده بفرستید، میتوانید از متد `raw` استفاده کنید: 79 | 80 | Mail::raw('Text to e-mail', function($message) 81 | { 82 | $message->from('us@example.com', 'Laravel'); 83 | 84 | $message->to('foo@example.com')->cc('bar@example.com'); 85 | }); 86 | 87 | > **نکته:** نمونه پیام فرستاده شده به کلوژر `Mail::send` کلاس SwiftMailer را اکستند میکند. این موضوع امکان فراخوانی هر متدی بر روی آن کلاس برای ساخت پیام ایمیلتان ایجاد میکند. 88 | 89 | 90 | ## پیوست درمحل - Inline Attachment 91 | 92 | پیوست عکسها به بدنه ایمیلها کار دشواری است؛ هرچند، لاراول روشی ساده برای پیوست تصویر به ایمیل و بازیابی CID مناسب ارائه مینماید. 93 | 94 | #### قراردادن تصویر در View مربوط به ایمیل 95 | 96 | 97 | Here is an image: 98 | 99 | 100 | 101 | 102 | #### قراردادن داده خام در View ایمیل 103 | 104 | 105 | Here is an image from raw data: 106 | 107 | 108 | 109 | 110 | توجه داشته باشید که متغیر `$message` همیشه با استفاده از فاساد `Mail` به view مربوط به ایمیل فرستاده می شود. 111 | 112 | 113 | ## صف بندی ایمیلها 114 | 115 | #### قراردادن یک ایمیل در صف 116 | 117 | از آنجاکه فرستادن ایمیل میتواند به شدت زمان پاسخ نرم افزار شما را افزایش دهد، بسیاری از برنامه نویسان ترجیح میدهند ایمیلها را برای اینکه در زمان مناسب و پشت صحنه فرستاده شوند، در صف قرار دهند. لاراول این کار را با استفاده از [API یکتای صف](/docs/%7B%7Bversion%7D%7D/queues) ساده میکند. برای قراردادن ایمیل در صف، به سادگی متد `queue` از فاساد `Mail` را استفاده کنید: 118 | 119 | Mail::queue('emails.welcome', $data, function($message) 120 | { 121 | $message->to('foo@example.com', 'John Smith')->subject('Welcome!'); 122 | }); 123 | 124 | همچنین میتوانید با استفاده از متد `later` مدت زمانی که میخواهید فرستادن ایمیل را به تاخیر بیندازید مشخص کنید: 125 | 126 | Mail::later(5, 'emails.welcome', $data, function($message) 127 | { 128 | $message->to('foo@example.com', 'John Smith')->subject('Welcome!'); 129 | }); 130 | 131 | اگر میخواهید یک صف مشخص را برای افزودن پیام مشخص کنید، میتوانید از متدهای `queueOn` و `laterOn` استفاده کنید: 132 | 133 | Mail::queueOn('queue-name', 'emails.welcome', $data, function($message) 134 | { 135 | $message->to('foo@example.com', 'John Smith')->subject('Welcome!'); 136 | }); 137 | 138 | 139 | ## Mail و توسعه محلی 140 | 141 | هنگامی که در حال توسعه نرم افزاری با امکان ارسال ایمیل هستید، غیرفعال کردن فرستادن ایمیل از ماشین محلی شما میتواند مفید باشد. برای انجام این کار، میتوانید متد `Mail::pretend` را استفاده کنید یا مقدار گزینه `pretend` را در فایل `config/mail.php` را با `true` مقداردهی کنید. هنگامی که فرستنده ایمیل در حالت `pretend` باشد، پیام به جای فرستاده شدن در فایلهای لاگ نرم افزار نوشته میشود. 142 | 143 | اگر میخواهید واقعا ایملیهای تستی را ببینید، از سرویسی مانند [Mailtrap](https://mailtrap.io) استفاده کنید. -------------------------------------------------------------------------------- /5.0/middleware.md: -------------------------------------------------------------------------------- 1 | # middleware HTTP 2 | 3 | - [آشنایی](#introduction) 4 | - [ایجاد middleware](#defining-middleware) 5 | - [ثبت middleware](#registering-middleware) 6 | - [middleware قابل پایان دادن](#terminable-middleware) 7 | 8 | 9 | ## آشنایی 10 | 11 | middleware HTTP مکانیزمی راحت برای فیلترنمودن درخواستهای HTTP دریافت شده توسط نرم افزار ایجاد میکند. برای مثال، لاراول یک middleware برای تعیین احراز هویت شدن کاربر نرم افزار دارد. در صورتی که کاربر احراز هویت نشده باشد، middleware کاربر را به صفحه ورود هدایت مینماید. و اگر کاربر احراز هویت شده باشد، middleware به درخواست اجازه پیشروی در نرما افزار را میدهد. 12 | 13 | البته، middleware میتواند برای انجام کارهای بسیاری فراتر از احراز هویت نوشته شود. یک middleware CORS ممکن از وظیفه افزودن یک هدر مناسب به تمام پاسخهای خروجی از نرم افزار شما را داشته باشد. یک middleware لاگ (ثبت ردپا) ممکن است تمامی درخواست دریافت شده توسط نرم افزار را ثبت نماید. 14 | 15 | middlewareهای بسیاری در فریمورک لاراول وجود دارند، شامل middlewareهایی برای نگهداری (maintenance)، احرازهویت، CSRF، نگهبانی (protection)، و موراد دیگر میباشد. تمامی این middlewareها در دایرکتوری `app/Http/Middleware` قرار دارند. 16 | 17 | 18 | ## ایجاد middleware 19 | 20 | برای ایجاد یک middleware، از فرمان آرتیزان `make:middleware` استفاده کنید: 21 | 22 | php artisan make:middleware OldMiddleware 23 | 24 | این فرمان یک کلاس `OldMiddleware` جدید در دایرکتوری `app/Http/Middleware` ایجاد میکند. در این middleware، ما تنها در صورتی به مسیر دسترسی داریم که `age` بزرگتر اس 200 باشد. در غیر اینصورت، کاربر به مسیر "home" هدایت میشود. 25 | 26 | input('age') < 200) 42 | { 43 | return redirect('home'); 44 | } 45 | 46 | return $next($request); 47 | } 48 | 49 | } 50 | 51 | همانگونه که میبینید، در صورتی که `age` از `200` کمتر باشد، middleware یک ریدیرکت (تغییردهنده مسیر) HTTP به کلاینت بازمیگرداند؛ در غیر اینصورت، درخواست به مراحل بعدی در نرم افزار فرستاده میشود. برای فرستادن درخواست به عمق نرم افزار (برای اجازه دادن به middleware برای گذر)، کافیست تابع کالبک (فراخوان مجدد) `next$` را با پارامتر `request$` فراخوانی نمایید. 52 | 53 | بهتر است middlewareها را به عنوان لایه هایی در نظر بگیرید که درخواستهای HTTP باید از آنها عبور کنند تا به نرم افزار برسند. هر لایه میتواند درخواست را بررسی نماید و حتی آن را کاملا رد نماید. 54 | 55 | ### اجرای ذستورات قبل و بعد از یک درخواست توسط Middleware 56 | 57 | اجرای یک middleware پیش از یا پس از اجرای درخواست به خود middleware وابسته است. این middleware کارهایی را **پیش از** مدیریت درخواست توسط نرم افزار انجام میدهد: 58 | 59 | 92 | ## ثبت middleware 93 | 94 | ### middleware سراسری 95 | 96 | اگر میخواهید middlewareی در طول تمامی درخواستهای HTTP فرستاده شده برای نرم افزار کاربردی شما اجرا شود به سادگی کلاس middleware را در لیست خصوصیت `middleware$` از کلاس `app/Http/Kernel.php` قرار دهید. 97 | 98 | ### انتصاب middleware به route 99 | 100 | اگر میخواهید یک middleware را به یک route مشخص انتصاب دهید، در ابتدا باید به middleware یک کلید کوتاه در فایل `app/Http/Kernel.php` انتصاب دهید. به طور پیش فرض، خصوصیت `routeMiddleware$` این کلاس، دربرگیرنده middlewareهای پیش فرض لاراول میباشد. 101 | پس از تعریف یک middleware در کرنل HTTP، میتوانید از کلید `middleware` در آرایه گزینه های route برای اعمال استفاده کنید: 102 | 103 | Route::get('admin/profile', ['middleware' => 'auth', function() 104 | { 105 | // 106 | }]); 107 | 108 | 109 | ## middlewareهای با قابلیت پایان دادن 110 | 111 | گاهی یک middleware باید کاری را پس از آنکه پاسخ HTTP به مرورگر فرستاده شد، انجام دهد. برای مثال "middleware "session در لاراول _پس از_ آنکه پاسخ به مرورگر فرستاده شد، داده های نشست را ذخیره مینماید. برای انجام این موضوع باید middleware را "terminable" تعریف کنید 112 | 113 | use Closure; 114 | use Illuminate\Contracts\Routing\TerminableMiddleware; 115 | class StartSession implements TerminableMiddleware { 116 | 117 | public function handle($request, Closure $next) 118 | { 119 | return $next($request); 120 | } 121 | 122 | public function terminate($request, $response) 123 | { 124 | // Store the session data... 125 | } 126 | 127 | } 128 | 129 | همانطور که میبینید، علاوه بر تعریف متد `handle`، `TerminableMiddleware` یک متد `terminate` هم تعریف میکند. پس از آنکه یک middleware با قابلیت پایان دادن ایجاد نمودید، باید آن را به لیست middlewareهای گلوبال در کرنل HTTP بیافزایید. 130 | 131 | -------------------------------------------------------------------------------- /5.0/migrations.md: -------------------------------------------------------------------------------- 1 | # Migration ها و داده ریزی (seeding) 2 | 3 | - [مقدمه](#introduction) 4 | - [ساختن یک Migrations](#creating-migrations) 5 | - [اجرای Migration ها](#running-migrations) 6 | - [بازگردانی Migration ها به عقب (rollback)](#rolling-back-migrations) 7 | - [داده ریزی در بانک (Database Seeding)](#database-seeding) 8 | 9 | 10 | ## مقدمه 11 | Migration ها همانند سیستم های کنترل سورس کد SVN,Git ، ولی برای بانک اطلاعاتی تعبیه شده اند و به تیم کمک میکند تا تغییرات بانک اطلاعاتی را همانند سورس کد پروژه Commit کنند و اعضای تیم همیشه یک نسخه بروز از دیتابیس را برروی سیستم خود داشته باشند . Migration ها بطور کلی از [Schema Builder](/docs/{{version}}/schema) استفاده مینمایند تا براحتی بتوانند تغییرات را بر روی ساختار (Schema) بانک اطلاعاتی اعمال و مدریرت کنند . 12 | 13 | 14 | ## ساخت Migration 15 | 16 | برای ساخت یک Migration ، دستور `make:migration` را در Artisan CLI وارد نمایید : 17 | 18 | php artisan make:migration create_users_table 19 | سپس Migration شما در مسیر `database/migrations` تولید خواهد شد . فریموورک برای نامگذاری فایل های Migration از یک Timestamp استفاده مینماید که ترتیب اجرای آنها را مشخص میکند . 20 | 21 | برای تعیین اینکه Migration شما بر روی کدام جدول اعمال شود ، پارامتر `--table` را به آخر دستور آرتیسان خود اضافه کنید . واگر Migration شما قرار است یک جدول جدید درون بانک اطلاعاتی ایجاد نماید ، `--create` را به پارامتر های خود اضافه نمایید : 22 | 23 | php artisan make:migration add_votes_to_users_table --table=users 24 | 25 | php artisan make:migration create_users_table --create=users 26 | 27 | 28 | ## اجرای Migration ها 29 | 30 | #### دستور زیر تمامی Migration ها را بر روی دیتابیس اجرا میکند 31 | 32 | php artisan migrate 33 | 34 | > **نکته:** اگر بواسطه اجرای دستور فوق یک خطای "class not found" دریافت کردید ، ابتدا دستور `composer dump-autoload` را در خط فرامان اجرا کنید . 35 | 36 | ### اجرای بی چون و چرا Migration ها 37 | گاهی اوقات Migration های شما نقشی مخرب دارند به این معنی که ممکن است اطلاعات بانک اطلاعاتی شما را از بیین ببرند ، به منظور جلوگیری از اجرای آنها دربانک اطلاعاتی (بانک اطلاعاتی سیستم در مرحله production) شما باید اجرای عملیات را تایید نمایید ، و اگر میخواهید تمامی عملیات بدون هیچ پرسشی از شما اجرا شود `--force` را به پارامتر اجرای Migration اضافه نمایید : 38 | 39 | php artisan migrate --force 40 | 41 | 42 | ## بازگردانی به عقب (rollback) 43 | 44 | #### بازگردانی تغییرات به قبل از اجرای آخرین عملیات Migration 45 | 46 | php artisan migrate:rollback 47 | 48 | #### بازگردانی تمامی Migration ها 49 | 50 | php artisan migrate:reset 51 | 52 | #### بازگردانی تمامی Migration ها و اجرای دوباره آنها 53 | 54 | php artisan migrate:refresh 55 | 56 | php artisan migrate:refresh --seed 57 | 58 | 59 | ## داده ریزی در بانک اطلاعاتی (Database Seeding) 60 | لاراول همچنین از یک روش ساده برای پرکردن اطلاعات تستی در جداول شما استفاده میکنند . تمامی کلاس های `seed` شما در مسیر `database/seeds` ذخیره میشوند ، میتوانید برای کلاس های `seed` از هر نامی استفاده نمایید اما از قواعد نامگذاری لاراول نیز باید پیروی کنید . مانند `UserTableSeeder` و غیره .. ،همچنین به صورت پیشفرض یک کلاس `DatabaseSeeder` برای شما تعریف شده است . از متد `call` این کلاس میتوانید برای فراخوانی دیگر کلاسهای `seed` تان و کنترل ترتیب اجرای آنها استفاده نمایید . 61 | 62 | #### یک نمونه از کلاس Seed 63 | 64 | class DatabaseSeeder extends Seeder { 65 | 66 | public function run() 67 | { 68 | $this->call('UserTableSeeder'); 69 | 70 | $this->command->info('User table seeded!'); 71 | } 72 | 73 | } 74 | 75 | class UserTableSeeder extends Seeder { 76 | 77 | public function run() 78 | { 79 | DB::table('users')->delete(); 80 | 81 | User::create(['email' => 'foo@bar.com']); 82 | } 83 | 84 | } 85 | 86 | برای اجرای عملیات داده ریزی از دستور `db:seed` در Artisan CLI استفاده نمایید : 87 | 88 | php artisan db:seed 89 | دستور `db:seed` به صورت پیشفرض کلاس `DatabaseSeeder` را اجرا میکند ، که به موجب آن دیگر کلاس های `seed` معرفی شده در آن اجرا میشود . میتوانید از پارامتر `--class` برای اجرای یک کلاس `seed` مشخص استفاده کنید تا تنها آن کلاس برای شما اجرا شود : 90 | 91 | php artisan db:seed --class=UserTableSeeder 92 | همچنین میتوانید توسط دستور `migrate:refresh` در آرتیسان برای rollback و اجرای دوباره تمامی Migration ها به همراه عملیات داده ریزی (seeding) استفاده نمایید : 93 | 94 | php artisan migrate:refresh --seed 95 | -------------------------------------------------------------------------------- /5.0/packages.md: -------------------------------------------------------------------------------- 1 | # Package Development 2 | 3 | - [Introduction](#introduction) 4 | - [Views](#views) 5 | - [Translations](#translations) 6 | - [Configuration](#configuration) 7 | - [Public Assets](#public-assets) 8 | - [Publishing File Groups](#publishing-file-groups) 9 | - [Routing](#routing) 10 | 11 | 12 | ## Introduction 13 | 14 | Packages are the primary way of adding functionality to Laravel. Packages might be anything from a great way to work with dates like [Carbon](https://github.com/briannesbitt/Carbon), or an entire BDD testing framework like [Behat](https://github.com/Behat/Behat). 15 | 16 | Of course, there are different types of packages. Some packages are stand-alone, meaning they work with any framework, not just Laravel. Both Carbon and Behat are examples of stand-alone packages. Any of these packages may be used with Laravel by simply requesting them in your `composer.json` file. 17 | 18 | On the other hand, other packages are specifically intended for use with Laravel. These packages may have routes, controllers, views, and configuration specifically intended to enhance a Laravel application. This guide primarily covers the development of those that are Laravel specific. 19 | 20 | All Laravel packages are distributed via [Packagist](http://packagist.org) and [Composer](http://getcomposer.org), so learning about these wonderful PHP package distribution tools is essential. 21 | 22 | 23 | ## Views 24 | 25 | Your package's internal structure is entirely up to you; however, typically each package will contain one or more [service providers](/docs/{{version}}/providers). The service provider contains any [service container](/docs/{{version}}/container) bindings, as well as instructions as to where package configuration, views, and translation files are located. 26 | 27 | ### Views 28 | 29 | Package views are typically referenced using a double-colon "namespace" syntax: 30 | 31 | return view('package::view.name'); 32 | 33 | All you need to do is tell Laravel where the views for a given namespace are located. For example, if your package is named "courier", you might add the following to your service provider's `boot` method: 34 | 35 | public function boot() 36 | { 37 | $this->loadViewsFrom(__DIR__.'/path/to/views', 'courier'); 38 | } 39 | 40 | Now you may load your package views using the following syntax: 41 | 42 | return view('courier::view.name'); 43 | 44 | When you use the `loadViewsFrom` method, Laravel actually registers **two** locations for your views: one in the application's `resources/views/vendor` directory and one in the directory you specify. So, using our `courier` example: when requesting a package view, Laravel will first check if a custom version of the view has been provided by the developer in `resources/views/vendor/courier`. Then, if the view has not been customized, Laravel will search the package view directory you specified in your call to `loadViewsFrom`. This makes it easy for end-users to customize / override your package's views. 45 | 46 | #### Publishing Views 47 | 48 | To publish your package's views to the `resources/views/vendor` directory, you should use the `publishes` method from the `boot` method of your service provider: 49 | 50 | public function boot() 51 | { 52 | $this->loadViewsFrom(__DIR__.'/path/to/views', 'courier'); 53 | 54 | $this->publishes([ 55 | __DIR__.'/path/to/views' => base_path('resources/views/vendor/courier'), 56 | ]); 57 | } 58 | 59 | Now, when users of your package execute Laravel's `vendor:publish` command, your views directory will be copied to the specified location. 60 | 61 | If you would like to overwrite existing files, use the `--force` switch: 62 | 63 | php artisan vendor:publish --force 64 | 65 | > **Note:** You may use the `publishes` method to publish **any** type of file to any location you wish. 66 | 67 | 68 | ## Translations 69 | 70 | Package translation files are typically referenced using a double-colon syntax: 71 | 72 | return trans('package::file.line'); 73 | 74 | All you need to do is tell Laravel where the translations for a given namespace are located. For example, if your package is named "courier", you might add the following to your service provider's `boot` method: 75 | 76 | public function boot() 77 | { 78 | $this->loadTranslationsFrom(__DIR__.'/path/to/translations', 'courier'); 79 | } 80 | 81 | Note that within your `translations` folder, you would have further directories for each language, such as `en`, `es`, `ru`, etc. 82 | 83 | Now you may load your package translations using the following syntax: 84 | 85 | return trans('courier::file.line'); 86 | 87 | 88 | ## Configuration 89 | 90 | Typically, you will want to publish your package's configuration file to the application's own `config` directory. This will allow users of your package to easily override your default configuration options. 91 | 92 | To publish a configuration file, just use the `publishes` method from the `boot` method of your service provider: 93 | 94 | $this->publishes([ 95 | __DIR__.'/path/to/config/courier.php' => config_path('courier.php'), 96 | ]); 97 | 98 | Now, when users of your package execute Laravel's `vendor:publish` command, your file will be copied to the specified location. Of course, once your configuration has been published, it can be accessed like any other configuration file: 99 | 100 | $value = config('courier.option'); 101 | 102 | You may also choose to merge your own package configuration file with the application's copy. This allows your users to include only the options they actually want to override in the published copy of the configuration. To merge the configurations, use the `mergeConfigFrom` method within your service provider's `register` method: 103 | 104 | $this->mergeConfigFrom( 105 | __DIR__.'/path/to/config/courier.php', 'courier' 106 | ); 107 | 108 | 109 | ## Public Assets 110 | 111 | Your packages may have assets such as JavaScript, CSS, and images. To publish assets, use the `publishes` method from your service provider's `boot` method. In this example, we will also add a "public" asset group tag. 112 | 113 | $this->publishes([ 114 | __DIR__.'/path/to/assets' => public_path('vendor/courier'), 115 | ], 'public'); 116 | 117 | Now, when your package's users execute the `vendor:publish` command, your files will be copied to the specified location. Since you typically will need to overwrite the assets every time the package is updated, you may use the `--force` flag: 118 | 119 | php artisan vendor:publish --tag=public --force 120 | 121 | If you would like to make sure your public assets are always up-to-date, you can add this command to the `post-update-cmd` list in your `composer.json` file. 122 | 123 | 124 | ## Publishing File Groups 125 | 126 | You may want to publish groups of files separately. For instance, you might want your users to be able to publish your package's configuration files and asset files separately. You can do this by 'tagging' them: 127 | 128 | // Publish a config file 129 | $this->publishes([ 130 | __DIR__.'/../config/package.php' => config_path('package.php') 131 | ], 'config'); 132 | 133 | // Publish your migrations 134 | $this->publishes([ 135 | __DIR__.'/../database/migrations/' => database_path('/migrations') 136 | ], 'migrations'); 137 | 138 | You can then publish these files separately by referencing their tag like so: 139 | 140 | php artisan vendor:publish --provider="Vendor\Providers\PackageServiceProvider" --tag="config" 141 | 142 | 143 | ## Routing 144 | 145 | To load a routes file for your package, simply `include` it from within your service provider's `boot` method. 146 | 147 | #### Including A Routes File From A Service Provider 148 | 149 | public function boot() 150 | { 151 | include __DIR__.'/../../routes.php'; 152 | } 153 | 154 | > **Note:** If your package is using controllers, you will need to make sure they are properly configured in your `composer.json` file's auto-load section. 155 | -------------------------------------------------------------------------------- /5.0/pagination.md: -------------------------------------------------------------------------------- 1 | # Pagination 2 | 3 | - [Configuration](#configuration) 4 | - [Usage](#usage) 5 | - [Appending To Pagination Links](#appending-to-pagination-links) 6 | - [Converting To JSON](#converting-to-json) 7 | 8 | 9 | ## Configuration 10 | 11 | In other frameworks, pagination can be very painful. Laravel makes it a breeze. Laravel can generate an intelligent "range" of links based on the current page. The generated HTML is compatible with the Bootstrap CSS framework. 12 | 13 | 14 | ## Usage 15 | 16 | There are several ways to paginate items. The simplest is by using the `paginate` method on the query builder or an Eloquent model. 17 | 18 | #### Paginating Database Results 19 | 20 | $users = DB::table('users')->paginate(15); 21 | 22 | > **Note:** Currently, pagination operations that use a `groupBy` statement cannot be executed efficiently by Laravel. If you need to use a `groupBy` with a paginated result set, it is recommended that you query the database and create a paginator manually. 23 | 24 | #### Creating A Paginator Manually 25 | 26 | Sometimes you may wish to create a pagination instance manually, passing it an array of items. You may do so by creating either an `Illuminate\Pagination\Paginator` or `Illuminate\Pagination\LengthAwarePaginator` instance, depending on your needs. 27 | 28 | #### Paginating An Eloquent Model 29 | 30 | You may also paginate [Eloquent](/docs/{{version}}/eloquent) models: 31 | 32 | $allUsers = User::paginate(15); 33 | 34 | $someUsers = User::where('votes', '>', 100)->paginate(15); 35 | 36 | The argument passed to the `paginate` method is the number of items you wish to display per page. Once you have retrieved the results, you may display them on your view, and create the pagination links using the `render` method: 37 | 38 |
39 | 40 | name; ?> 41 | 42 |
43 | 44 | render(); ?> 45 | 46 | This is all it takes to create a pagination system! Note that we did not have to inform the framework of the current page. Laravel will determine this for you automatically. 47 | 48 | You may also access additional pagination information via the following methods: 49 | 50 | - `currentPage` 51 | - `lastPage` 52 | - `perPage` 53 | - `hasMorePages` 54 | - `url` 55 | - `nextPageUrl` 56 | - `firstItem` 57 | - `lastItem` 58 | - `total` 59 | - `count` 60 | 61 | #### "Simple Pagination" 62 | 63 | If you are only showing "Next" and "Previous" links in your pagination view, you have the option of using the `simplePaginate` method to perform a more efficient query. This is useful for larger datasets when you do not require the display of exact page numbers on your view: 64 | 65 | $someUsers = User::where('votes', '>', 100)->simplePaginate(15); 66 | 67 | #### Customizing The Paginator URI 68 | 69 | You may also customize the URI used by the paginator via the `setPath` method: 70 | 71 | $users = User::paginate(); 72 | 73 | $users->setPath('custom/url'); 74 | 75 | The example above will create URLs like the following: http://example.com/custom/url?page=2 76 | 77 | 78 | ## Appending To Pagination Links 79 | 80 | You can add to the query string of pagination links using the `appends` method on the Paginator: 81 | 82 | appends(['sort' => 'votes'])->render(); ?> 83 | 84 | This will generate URLs that look something like this: 85 | 86 | http://example.com/something?page=2&sort=votes 87 | 88 | If you wish to append a "hash fragment" to the paginator's URLs, you may use the `fragment` method: 89 | 90 | fragment('foo')->render(); ?> 91 | 92 | This method call will generate URLs that look something like this: 93 | 94 | http://example.com/something?page=2#foo 95 | 96 | 97 | ## Converting To JSON 98 | 99 | The `Paginator` class implements the `Illuminate\Contracts\Support\JsonableInterface` contract and exposes the `toJson` method. You may also convert a `Paginator` instance to JSON by returning it from a route. The JSON'd form of the instance will include some "meta" information such as `total`, `current_page`, and `last_page`. The instance's data will be available via the `data` key in the JSON array. 100 | -------------------------------------------------------------------------------- /5.0/providers.md: -------------------------------------------------------------------------------- 1 | # Service Providers 2 | 3 | - [Introduction](#introduction) 4 | - [Basic Provider Example](#basic-provider-example) 5 | - [Registering Providers](#registering-providers) 6 | - [Deferred Providers](#deferred-providers) 7 | 8 | 9 | ## Introduction 10 | 11 | Service providers are the central place of all Laravel application bootstrapping. Your own application, as well as all of Laravel's core services are bootstrapped via service providers. 12 | 13 | But, what do we mean by "bootstrapped"? In general, we mean **registering** things, including registering service container bindings, event listeners, filters, and even routes. Service providers are the central place to configure your application. 14 | 15 | If you open the `config/app.php` file included with Laravel, you will see a `providers` array. These are all of the service provider classes that will be loaded for your application. Of course, many of them are "deferred" providers, meaning they will not be loaded on every request, but only when the services they provide are actually needed. 16 | 17 | In this overview you will learn how to write your own service providers and register them with your Laravel application. 18 | 19 | 20 | ## Basic Provider Example 21 | 22 | All service providers extend the `Illuminate\Support\ServiceProvider` class. This abstract class requires that you define at least one method on your provider: `register`. Within the `register` method, you should **only bind things into the [service container](/docs/{{version}}/container)**. You should never attempt to register any event listeners, routes, or any other piece of functionality within the `register` method. 23 | 24 | The Artisan CLI can easily generate a new provider via the `make:provider` command: 25 | 26 | php artisan make:provider RiakServiceProvider 27 | 28 | ### The Register Method 29 | 30 | Now, let's take a look at a basic service provider: 31 | 32 | app->singleton('Riak\Contracts\Connection', function($app) 47 | { 48 | return new Connection($app['config']['riak']); 49 | }); 50 | } 51 | 52 | } 53 | 54 | This service provider only defines a `register` method, and uses that method to define an implementation of `Riak\Contracts\Connection` in the service container. If you don't understand how the service container works, don't worry, [we'll cover that soon](/docs/{{version}}/container). 55 | 56 | This class is namespaced under `App\Providers` since that is the default location for service providers in Laravel. However, you are free to change this as you wish. Your service providers may be placed anywhere that Composer can autoload them. 57 | 58 | ### The Boot Method 59 | 60 | So, what if we need to register an event listener within our service provider? This should be done within the `boot` method. **This method is called after all other service providers have been registered**, meaning you have access to all other services that have been registered by the framework. 61 | 62 | listen('SomeEvent', 'SomeEventHandler'); 98 | } 99 | 100 | 101 | ## Registering Providers 102 | 103 | All service providers are registered in the `config/app.php` configuration file. This file contains a `providers` array where you can list the names of your service providers. By default, a set of Laravel core service providers are listed in this array. These providers bootstrap the core Laravel components, such as the mailer, queue, cache, and others. 104 | 105 | To register your provider, simply add it to the array: 106 | 107 | 'providers' => [ 108 | // Other Service Providers 109 | 110 | 'App\Providers\AppServiceProvider', 111 | ], 112 | 113 | 114 | ## Deferred Providers 115 | 116 | If your provider is **only** registering bindings in the [service container](/docs/{{version}}/container), you may choose to defer its registration until one of the registered bindings is actually needed. Deferring the loading of such a provider will improve the performance of your application, since it is not loaded from the filesystem on every request. 117 | 118 | To defer the loading of a provider, set the `defer` property to `true` and define a `provides` method. The `provides` method returns the service container bindings that the provider registers: 119 | 120 | app->singleton('Riak\Contracts\Connection', function($app) 142 | { 143 | return new Connection($app['config']['riak']); 144 | }); 145 | } 146 | 147 | /** 148 | * Get the services provided by the provider. 149 | * 150 | * @return array 151 | */ 152 | public function provides() 153 | { 154 | return ['Riak\Contracts\Connection']; 155 | } 156 | 157 | } 158 | 159 | Laravel compiles and stores a list of all of the services supplied by deferred service providers, along with the name of its service provider class. Then, only when you attempt to resolve one of these services does Laravel load the service provider. 160 | -------------------------------------------------------------------------------- /5.0/queries.md: -------------------------------------------------------------------------------- 1 | # کوئری ساز 2 | 3 | - [مقدمه](#introduction) 4 | - [دستورات select](#selects) 5 | - [Joins](#joins) 6 | - [دستورات شرطی پیشرفته](#advanced-wheres) 7 | - [اجرای توابع جمعی (Aggregates)](#aggregates) 8 | - [بکارگیری کوئری های توکار (Raw Expression)](#raw-expressions) 9 | - [ایجاد رکورد Insert](#inserts) 10 | - [دستور Update](#updates) 11 | - [حذف رکورد](#deletes) 12 | - [ادغام رکورد ها Union](#unions) 13 | - [قفل Pessimistic](#pessimistic-locking) 14 | 15 | 16 | ## مقدمه 17 | کوئری ساز لاراول یک رابط روان و راحت و ساده برای تولید و اجرای کوئری ها می باشد که میتواند در بیشتر عملیات کار با دیتابیس نیز استفاده شود و برروی تمامی بانکهایی اطلاعاتی که توسط لاراول پشتیبانی میشود قابل اجرا می باشد . 18 | 19 | > **نکته :** کوئری ساز برای نشاندن مقادیر در کوئری ها ، بطور کامل از `PDO parameter binding` استفاده میکند تا وب سایت شما را درمقابل حملات `SQL injection` حفظ کند و دیگر نیازی نیست که پارامتر های ارسالی به کوئری ساز را از نظر کدهای مخرب چک کنید . 20 | 21 | 22 | ## دستورات Select 23 | 24 | #### گرفتن تمامی رکورد های جدول 25 | 26 | $users = DB::table('users')->get(); 27 | 28 | foreach ($users as $user) 29 | { 30 | var_dump($user->name); 31 | } 32 | 33 | #### تکه تکه کردن نتایج حاصل از اجرای کوئری select 34 | 35 | DB::table('users')->chunk(100, function($users) 36 | { 37 | foreach ($users as $user) 38 | { 39 | // 40 | } 41 | }); 42 | 43 | میتوانید با ارسال مقدار `false` از درون `closure` به اجرای ادامه عملیات خاتمه دهید : 44 | 45 | DB::table('users')->chunk(100, function($users) 46 | { 47 | // 48 | 49 | return false; 50 | }); 51 | 52 | #### دریافت یک رکورد از کل نتایج 53 | 54 | $user = DB::table('users')->where('name', 'John')->first(); 55 | 56 | var_dump($user->name); 57 | 58 | #### دریافت یک ستون از کل نتایج 59 | 60 | $name = DB::table('users')->where('name', 'John')->pluck('name'); 61 | 62 | #### دریافت نتایج بصورت لیست (آرایه) 63 | $roles = DB::table('roles')->lists('title'); 64 | این متد یک آرایه از Title ها را برمیگرداند ، همچنین شما میتوانید مقادیر اندیس ها در آرایه را از طریق پارامتر دوم متد `lists` مشخص کنید : 65 | 66 | $roles = DB::table('roles')->lists('title', 'name'); 67 | 68 | #### دستور select جهت انتخاب ستون ها 69 | 70 | $users = DB::table('users')->select('name', 'email')->get(); 71 | 72 | $users = DB::table('users')->distinct()->get(); 73 | 74 | $users = DB::table('users')->select('name as user_name')->get(); 75 | 76 | #### اضافه کردن یک ستون دیگر با addSelect 77 | 78 | $query = DB::table('users')->select('name'); 79 | 80 | $users = $query->addSelect('age')->get(); 81 | 82 | #### دستورات شرطی 83 | 84 | $users = DB::table('users')->where('votes', '>', 100)->get(); 85 | 86 | #### دستور Or 87 | 88 | $users = DB::table('users') 89 | ->where('votes', '>', 100) 90 | ->orWhere('name', 'John') 91 | ->get(); 92 | 93 | #### جستجو رکورد های که مقدار فیلد x آنها بین دامنه مقادیر داده شده باشد : 94 | 95 | $users = DB::table('users') 96 | ->whereBetween('votes', [1, 100])->get(); 97 | 98 | #### جستجو رکورد های که مقدار فیلد x آنها بین دامنه مقادیر داده شده نباشند : 99 | 100 | $users = DB::table('users') 101 | ->whereNotBetween('votes', [1, 100])->get(); 102 | 103 | #### جستجو رکورد های که مقدار فیلد x آنها محدود به آرایه داده شده باشد : 104 | 105 | $users = DB::table('users') 106 | ->whereIn('id', [1, 2, 3])->get(); 107 | 108 | $users = DB::table('users') 109 | ->whereNotIn('id', [1, 2, 3])->get(); 110 | 111 | #### جستجوی رکوردها با مقادیر null . 112 | 113 | $users = DB::table('users') 114 | ->whereNull('updated_at')->get(); 115 | 116 | #### دستورات شرط پویا 117 | میتوانید برای تولید دستورات شرطی از عبارات خاصی استفاده کنید تا بتوانید نوع شرط را به روش مفهومی تری بیان نمایید : 118 | 119 | $admin = DB::table('users')->whereId(1)->first(); 120 | 121 | $john = DB::table('users') 122 | ->whereIdAndEmail(2, 'john@doe.com') 123 | ->first(); 124 | 125 | $jane = DB::table('users') 126 | ->whereNameOrAge('Jane', 22) 127 | ->first(); 128 | 129 | #### دستورات Order by , Group by, Having 130 | 131 | $users = DB::table('users') 132 | ->orderBy('name', 'desc') 133 | ->groupBy('count') 134 | ->having('count', '>', 100) 135 | ->get(); 136 | 137 | #### دستور Limit 138 | 139 | $users = DB::table('users')->skip(10)->take(5)->get(); 140 | 141 | 142 | ## عملیات Join و ضرب دوجدول 143 | برای ضرب دو جدول و Join کردن آنها به شکل زیر عمل کنید : 144 | 145 | #### نمونه ساده Join چند جدول با یکدیگر 146 | 147 | DB::table('users') 148 | ->join('contacts', 'users.id', '=', 'contacts.user_id') 149 | ->join('orders', 'users.id', '=', 'orders.user_id') 150 | ->select('users.id', 'contacts.phone', 'orders.price') 151 | ->get(); 152 | 153 | #### عملیات Left Join 154 | 155 | DB::table('users') 156 | ->leftJoin('posts', 'users.id', '=', 'posts.user_id') 157 | ->get(); 158 | همچنین میتوانید عملیات Join پیشرفته تری ایجاد کنید : 159 | 160 | DB::table('users') 161 | ->join('contacts', function($join) 162 | { 163 | $join->on('users.id', '=', 'contacts.user_id')->orOn(...); 164 | }) 165 | ->get(); 166 | میتوانید از دستورات "where" یا "orWhere" برای شرط Join خود استفاده کنید، به عنوان مثال علاوه بر شرط همسان بودن دو فیلد ، فیلد مورد نظر را با یک عدد نیز مقایسه نمایید : 167 | 168 | DB::table('users') 169 | ->join('contacts', function($join) 170 | { 171 | $join->on('users.id', '=', 'contacts.user_id') 172 | ->where('contacts.user_id', '>', 5); 173 | }) 174 | ->get(); 175 | 176 | 177 | ## دستور Where پیشرفته 178 | 179 | #### تولید کوئری های تو در تو 180 | ممکن است بخواهید دستورات شرطی پیچیده تری را ایجاد کنید یا مثلا از دستور "where exist" برای بررسی موجودیت یک کوئری استفاده نمایید . لاراول برای اجرای اینگونه کوئری ها ، یک راه حل جالب و مفهومی ارائه کرده است : 181 | 182 | DB::table('users') 183 | ->where('name', '=', 'John') 184 | ->orWhere(function($query) 185 | { 186 | $query->where('votes', '>', 100) 187 | ->where('title', '<>', 'Admin'); 188 | }) 189 | ->get(); 190 | دستورات بالا نمونه کوئری زیر را تولید میکنند : 191 | 192 | select * from users where name = 'John' or (votes > 100 and title <> 'Admin') 193 | 194 | #### بررسی موجودیت یک کوئری (Exists Statements) 195 | 196 | DB::table('users') 197 | ->whereExists(function($query) 198 | { 199 | $query->select(DB::raw(1)) 200 | ->from('orders') 201 | ->whereRaw('orders.user_id = users.id'); 202 | }) 203 | ->get(); 204 | 205 | دستورات بالا نمونه کوئری زیر را تولید میکنند : 206 | 207 | select * from users 208 | where exists ( 209 | select 1 from orders where orders.user_id = users.id 210 | ) 211 | 212 | 213 | ## اجرای توابع جمعی (Aggregates) 214 | میتوانید نتیجه دستورات `count`, `max`, `min`, `avg`, و `sum` را توسط کوئری ساز (Query Builder) استخراج نمایید . 215 | 216 | $users = DB::table('users')->count(); 217 | 218 | $price = DB::table('orders')->max('price'); 219 | 220 | $price = DB::table('orders')->min('price'); 221 | 222 | $price = DB::table('orders')->avg('price'); 223 | 224 | $total = DB::table('users')->sum('votes'); 225 | 226 | 227 | ## بکارگیری از کوئری های توکار (Raw Expression) 228 | برای استفاده از یک کوئری توکار در کوئری ساز (Query Builder) از متد `DB::raw` استفاده میکنیم . حواستان باشد تنها کاربرد این متد بکارگیری یک کوئری در دل کوئری دیگر است ، و این دستور هرگز کوئری ها را از کد های مخرب (Sql Injection) پاک نمیکند .: 229 | 230 | #### نمونه تزریق یک کوئری در یک دستور select 231 | 232 | $users = DB::table('users') 233 | ->select(DB::raw('count(*) as user_count, status')) 234 | ->where('status', '<>', 1) 235 | ->groupBy('status') 236 | ->get(); 237 | 238 | 239 | ## دستورات Insert (ایجاد رکود) 240 | 241 | #### ایجاد رکورد جدید در جدول 242 | 243 | DB::table('users')->insert( 244 | ['email' => 'john@example.com', 'votes' => 0] 245 | ); 246 | 247 | #### اضافه کردن یک رکورد به جدول همراه با `Auto-Incrementing` 248 | اگر جدول شما دارای یک فیلد Auto-Increment باشد ، میتوانید توسط متد `insertGetId` برای ایجاد رکورد و دریافت مقدار ID رکورد ایجاد شده استفاده نمایید : 249 | 250 | $id = DB::table('users')->insertGetId( 251 | ['email' => 'john@example.com', 'votes' => 0] 252 | ); 253 | 254 | > **نکته :** اگر از بانک اطلاعاتی PostgreSQL استفاده میکنید ، برای استفاده از متد `insertGetId` ، نام فیلد کلید اصلی باید برابر `id` باشد . 255 | 256 | #### اضافه کردن چند رکورد به صورت همزمان 257 | 258 | DB::table('users')->insert([ 259 | ['email' => 'taylor@example.com', 'votes' => 0], 260 | ['email' => 'dayle@example.com', 'votes' => 0] 261 | ]); 262 | 263 | 264 | ## دستور Update 265 | 266 | #### ویرایش یک رکود در جدول 267 | 268 | DB::table('users') 269 | ->where('id', 1) 270 | ->update(['votes' => 1]); 271 | 272 | #### افزایش و کاهش مقدار یک فیلد در جدول 273 | 274 | DB::table('users')->increment('votes'); 275 | 276 | DB::table('users')->increment('votes', 5); 277 | 278 | DB::table('users')->decrement('votes'); 279 | 280 | DB::table('users')->decrement('votes', 5); 281 | 282 | میتوانید همزمان فیلد های دیگری را نیز درجدول Update کنید : 283 | 284 | DB::table('users')->increment('votes', 1, ['name' => 'John']); 285 | 286 | 287 | ## حذف رکورد (Delete) 288 | 289 | #### حذف یک رکورد از جدول 290 | 291 | DB::table('users')->where('votes', '<', 100)->delete(); 292 | 293 | #### حذف تمامی رکورد های جدول 294 | 295 | DB::table('users')->delete(); 296 | 297 | #### خالی کردن یک جدول (Truncating) 298 | 299 | DB::table('users')->truncate(); 300 | 301 | 302 | ## دستورات Union (ادغام رکورد ها) 303 | لاراول یک راه سریع برای ادغام دو نتیجه کوئری با یکدیگر ارائه کرده است : 304 | 305 | $first = DB::table('users')->whereNull('first_name'); 306 | 307 | $users = DB::table('users')->whereNull('last_name')->union($first)->get(); 308 | 309 | متد `unionAll` با روشی مشابه با متد `union` نیز در دسترس می باشد. 310 | 311 | 312 | ## قفل Pessimistic 313 | 314 | کوئری ساز ، قابلیت صدور قفل "pessimistic" بر روی دستورات `Select` را دارد. 315 | 316 | توسط متد `sharedLock` برای کوئری SELECT قفل "pessimistic" ایجاد کنید : 317 | 318 | DB::table('users')->where('votes', '>', 100)->sharedLock()->get(); 319 | 320 | و توسط متد lockForUpdate ، هنگام اجرای دستور Select از اجرای Update بر روی آنها جلوگیری نمایید : 321 | 322 | DB::table('users')->where('votes', '>', 100)->lockForUpdate()->get(); 323 | -------------------------------------------------------------------------------- /5.0/readme.md: -------------------------------------------------------------------------------- 1 | # Laravel Documentation 2 | 3 | ## Contribution Guidelines 4 | 5 | If you are submitting documentation for the **current stable release**, submit it to the corresponding branch. For example, documentation for Laravel 5.0 would be submitted to the `5.0` branch. Documentation intended for the next release of Laravel should be submitted to the `master` branch. 6 | -------------------------------------------------------------------------------- /5.0/redis.md: -------------------------------------------------------------------------------- 1 | # Redis 2 | 3 | - [Introduction](#introduction) 4 | - [Configuration](#configuration) 5 | - [Usage](#usage) 6 | - [Pipelining](#pipelining) 7 | 8 | 9 | ## Introduction 10 | 11 | [Redis](http://redis.io) is an open source, advanced key-value store. It is often referred to as a data structure server since keys can contain [strings](http://redis.io/topics/data-types#strings), [hashes](http://redis.io/topics/data-types#hashes), [lists](http://redis.io/topics/data-types#lists), [sets](http://redis.io/topics/data-types#sets), and [sorted sets](http://redis.io/topics/data-types#sorted-sets). 12 | 13 | Before using Redis with Laravel, you will need to install the `predis/predis` package (~1.0) via Composer. 14 | 15 | > **Note:** If you have the Redis PHP extension installed via PECL, you will need to rename the alias for Redis in your `config/app.php` file. 16 | 17 | 18 | ## Configuration 19 | 20 | The Redis configuration for your application is stored in the `config/database.php` file. Within this file, you will see a `redis` array containing the Redis servers used by your application: 21 | 22 | 'redis' => [ 23 | 24 | 'cluster' => true, 25 | 26 | 'default' => ['host' => '127.0.0.1', 'port' => 6379], 27 | 28 | ], 29 | 30 | The default server configuration should suffice for development. However, you are free to modify this array based on your environment. Simply give each Redis server a name, and specify the host and port used by the server. 31 | 32 | The `cluster` option will tell the Laravel Redis client to perform client-side sharding across your Redis nodes, allowing you to pool nodes and create a large amount of available RAM. However, note that client-side sharding does not handle failover; therefore, is primarily suited for cached data that is available from another primary data store. 33 | 34 | If your Redis server requires authentication, you may supply a password by adding a `password` key / value pair to your Redis server configuration array. 35 | 36 | 37 | ## Usage 38 | 39 | You may get a Redis instance by calling the `Redis::connection` method: 40 | 41 | $redis = Redis::connection(); 42 | 43 | This will give you an instance of the default Redis server. If you are not using server clustering, you may pass the server name to the `connection` method to get a specific server as defined in your Redis configuration: 44 | 45 | $redis = Redis::connection('other'); 46 | 47 | Once you have an instance of the Redis client, we may issue any of the [Redis commands](http://redis.io/commands) to the instance. Laravel uses magic methods to pass the commands to the Redis server: 48 | 49 | $redis->set('name', 'Taylor'); 50 | 51 | $name = $redis->get('name'); 52 | 53 | $values = $redis->lrange('names', 5, 10); 54 | 55 | Notice the arguments to the command are simply passed into the magic method. Of course, you are not required to use the magic methods, you may also pass commands to the server using the `command` method: 56 | 57 | $values = $redis->command('lrange', [5, 10]); 58 | 59 | When you are simply executing commands against the default connection, just use static magic methods on the `Redis` class: 60 | 61 | Redis::set('name', 'Taylor'); 62 | 63 | $name = Redis::get('name'); 64 | 65 | $values = Redis::lrange('names', 5, 10); 66 | 67 | > **Note:** Redis [cache](/docs/{{version}}/cache) and [session](/docs/{{version}}/session) drivers are included with Laravel. 68 | 69 | 70 | ## Pipelining 71 | 72 | Pipelining should be used when you need to send many commands to the server in one operation. To get started, use the `pipeline` command: 73 | 74 | #### Piping Many Commands To Your Servers 75 | 76 | Redis::pipeline(function($pipe) 77 | { 78 | for ($i = 0; $i < 1000; $i++) 79 | { 80 | $pipe->set("key:$i", $i); 81 | } 82 | }); 83 | -------------------------------------------------------------------------------- /5.0/requests.md: -------------------------------------------------------------------------------- 1 | # HTTP Requests 2 | 3 | - [دسترسی به یک نمونه از درخواست](#obtaining-a-request-instance) 4 | - [گرفتن ورودی](#retrieving-input) 5 | - [ورودی قبلی](#old-input) 6 | - [کوکی ها](#cookies) 7 | - [فایلها](#files) 8 | - [دیگر اطلاعات درخواست](#other-request-information) 9 | 10 | 11 | ## دسترسی به یک نمونه از درخواست 12 | 13 | ### با استفاده از فاساد 14 | 15 | فاساد `Request` امکان دسترسی به درخواست فعلی که به کانتینر آن وابسته است را ایجاد میکند. برای مثال: 16 | 17 | $name = Request::input('name'); 18 | 19 | به یاد داشته باشید، در صورتی که در یک فضای نام هستید، باید فاساد `Request` را با استفاده از عبارت `;use Request` در بالای فایل کلاس ایمپورت نمایید. 20 | 21 | ### با استفاده از تزریق وابستگی - Dependency Injection (DI) 22 | 23 | برای به دست آورد نمونه ای از درخواست HTTP با استفاده از DI، باید کلاس را بر روی سازنده کلاس یا متد مورد نظر تایپ_هینت کنید. نمونه درخواست فعلی خودکار توسط [service container](/docs/%7B%7Bversion%7D%7D/container) تزریق خواهد شد: 24 | 25 | input('name'); 41 | 42 | // 43 | } 44 | 45 | } 46 | 47 | در صورتی که متد کنترلر منتظر ورودی از پارامتر روت باشد، به سادگی میتوانید آرگومانهای روت را پس از دیگر وابستگی ها لیست نمایید: 48 | 49 | 71 | ## گرفتن ورودی 72 | 73 | #### گرفتن یک مقدار ورودی 74 | 75 | با استفاده از چند متد ساده، میتوانید تمامی به ورودیهای کاربران در نمونه `Illuminate\Http\Request` دسترسی داشته باشید. از آنجا که تمامی ورودیها برای تمامی متدهای درخواست به یک شکل مورد دسترس قرار میگیرند، نیازی نیست نگران متد درخواست HTTP استفاده شده باشید. 76 | 77 | $name = Request::input('name'); 78 | 79 | #### گرفتن یک مقدار پیش فرض درصورتی که مقدار ورودی ارائه نشده باش 80 | 81 | $name = Request::input('name', 'Sally'); 82 | 83 | #### بررسی ارئه شدن یک مقدار ورودی 84 | 85 | if (Request::has('name')) 86 | { 87 | // 88 | } 89 | 90 | #### گرفتن تمامی ورودیهای درخواست 91 | 92 | $input = Request::all(); 93 | 94 | #### گرفتن تنها برخی ورودیهای درخواست 95 | 96 | $input = Request::only('username', 'password'); 97 | 98 | $input = Request::except('credit_card'); 99 | 100 | وقتی با فرمهایی با ورودیهای "آرایه" ای کار میکنید، میتوانید برای دسترسی به آرایه ها از . (dot notation) استفاده کنید 101 | 102 | $input = Request::input('products.0.name'); 103 | 104 | 105 | ## ورودی های قبلی 106 | 107 | لاراول امکان نگهداری ورودیهای یک درخواست، در طول درخواست بعدی را فراهم نموده است. برای مثال، ممکن است نیاز داشته باشید، پس از اعتبارسنجی یک فرم آن را دوباره با مقادیر پیشین پر کنید. 108 | 109 | #### فلش ورودیهای کاربر درون متغیر نشست (session) 110 | 111 | متد `flash` ورودیهای فعلی را درون متغیر [نشست](/docs/%7B%7Bversion%7D%7D/session) قرار میدهد، تا در طول درخواست بعدی کاربر به نرم افزار در دسترس باشد: 112 | 113 | Request::flash(); 114 | 115 | #### فلش برخی از متغیرها درون متغیر نشست 116 | 117 | Request::flashOnly('username', 'email'); 118 | 119 | Request::flashExcept('password'); 120 | 121 | #### فلش و ردیرکت 122 | 123 | از آنجا که اغلب فلش را در زمان ردیرکت به صفحه قبل انجام میدهید، میتوانید به سادگی فلش ورودیها در یک زنجیره عملیات با ردیرکت انجام دهید: 124 | 125 | return redirect('form')->withInput(); 126 | 127 | return redirect('form')->withInput(Request::except('password')); 128 | 129 | #### بازیابی داده های پیشین 130 | 131 | برای بازیابی داده های فلش شده از درخواست پیشین، از متد `old` بر روی نمونه `Request` استفاده کنید: 132 | 133 | $username = Request::old('username'); 134 | 135 | اگر داده های پیشین را دریک قالب بلید (Blade) نمایش میدهید، بسیار راحتتر است که از تابع کمکی `old` استفاده نمایید: 136 | 137 | {{ old('username') }} 138 | 139 | 140 | ## کوکیها 141 | 142 | تمامی کوکیهای ایجاد شده توسط فریمورک لاراول با استفاده از یک کد سنجش هویت رمزنگاری و امضا شده اند، به این معنی که در صورت تغییر آنها توسط کلاینت غیر معتبر خواهند بود. 143 | 144 | #### خواندن مقدار کوکی 145 | 146 | $value = Request::cookie('name'); 147 | 148 | #### پیوست کوکی به یک درخواست جدید 149 | 150 | تابع کمکی `cookie` به عنوان یک سازنده جدید برای ایجاد نمونه های جدید از `Symfony\Component\HttpFoundation\Cookie` عمل مینماید. کوکیها را میتوان با استفاده از متد `withCookie` به یک نمونه از `Response` پیوست کرد: 151 | 152 | $response = new Illuminate\Http\Response('Hello World'); 153 | 154 | $response->withCookie(cookie('name', 'value', $minutes)); 155 | 156 | #### ایجاد یک کوکی که تا ابد میماند* 157 | 158 | _منظور از "ابد" واقعا پنج سال است_ 159 | 160 | $response->withCookie(cookie()->forever('name', 'value')); 161 | 162 | #### قراردادن کوکیها در صف 163 | 164 | شما میتوانید کوکی را حتی پیش از آنکه پاسخ ایجاد گردد، به "صف" اضاف نمایید تا پیوست شود: 165 | 166 | 187 | ## فایلها 188 | 189 | #### گرفتن یک فایل آپلود شده 190 | 191 | $file = Request::file('photo'); 192 | 193 | #### بررسی وجود فایل در درخواست 194 | 195 | if (Request::hasFile('photo')) 196 | { 197 | // 198 | } 199 | 200 | شی بازگردانده شده توسط متد `file` نمونه ای از کلاس `Symfony\Component\HttpFoundation\File\UploadedFile` است، که کلاس `SplFileInfo` از PHP را اکستند میکند و متدهای بسیاری برای کار با فایلها ارائه مینماید. 201 | 202 | #### بررسی معتبر بودن فایل آپلود شده 203 | 204 | if (Request::file('photo')->isValid()) 205 | { 206 | // 207 | } 208 | 209 | #### جابجایی فایل آپلود شده 210 | 211 | Request::file('photo')->move($destinationPath); 212 | 213 | Request::file('photo')->move($destinationPath, $fileName); 214 | 215 | ### دیگر متدهای فایل 216 | 217 | There are a variety of other methods available on `UploadedFile` instances. Check out the [API documentation for the class](http://api.symfony.com/2.5/Symfony/Component/HttpFoundation/File/UploadedFile.html) for more information regarding these methods. 218 | متدهای متنوع بسیاری در نمونه های `UploadedFile` وجود دارند. [مستندات API را برای اطلاعات بیشتر این کلاس](http://api.symfony.com/2.5/Symfony/Component/HttpFoundation/File/UploadedFile.html) بررسی نمایید. 219 | 220 | 221 | ## دیگر اطلاعات درخواست 222 | 223 | The `Request` class provides many methods for examining the HTTP request for your application and extends the `Symfony\Component\HttpFoundation\Request` class. Here are some of the highlights. 224 | کلاس `Request` متدهای بسیاری برای بررسی درخواستهای HTTP ارسال شده برای نرم افزار کاربردی وب ارائه مینماید و کلاس `Symfony\Component\HttpFoundation\Request` را اکستند میکند. 225 | 226 | #### گرفتن URI مروبط به درخواست 227 | 228 | $uri = Request::path(); 229 | 230 | #### بررسی استفاده از AJAX توسط درخواست 231 | 232 | if (Request::ajax()) 233 | { 234 | // 235 | } 236 | 237 | #### گرفتن ممتد درخواست 238 | 239 | $method = Request::method(); 240 | 241 | if (Request::isMethod('post')) 242 | { 243 | // 244 | } 245 | 246 | #### بررسی همخوانی مسیر درخواست با الگویی مشخص 247 | 248 | if (Request::is('admin/*')) 249 | { 250 | // 251 | } 252 | 253 | #### گرفتن URL درخواست جاری 254 | 255 | $url = Request::url(); 256 | -------------------------------------------------------------------------------- /5.0/responses.md: -------------------------------------------------------------------------------- 1 | # پاسخ های HTTP 2 | 3 | - [مقدمه](#basic-responses) 4 | - [ریدایرکت ها (redirects)](#redirects) 5 | - [انواع دیگر پاسخ ها](#other-responses) 6 | - [Macro ها ](#response-macros) 7 | 8 | 9 | ## مقدمه 10 | 11 | #### نمونه ساده ارسال یک پاسخ (response) از درون Route 12 | 13 | متداول ترین نوع پاسخ در لاراول از درون یک Route، پاسخ String می باشد . 14 | 15 | Route::get('/', function() 16 | { 17 | return 'Hello World'; 18 | }); 19 | 20 | #### ایجاد پاسخ های سفارشی 21 | 22 | اما ، در بسیاری از Route ها و Controller-actions ها ،به شما یک نمونه از کلاس `Illuminate\Http\Response` یا یک [view](/docs/{{version}}/views) بعنوان پاسخ ارسال میشود که این امکان را میدهد به راحتی `HTTP status code` و `Headers ` ها را دستکاری کنید . 23 | نمونه ایحاد شده `Response` از کلاس `Symfony\Component\HttpFoundation\Response` ارث میبرد ، که انواع مختلفی از متدها را برای ساخت یک پاسخ HTTP شامل میشود . 24 | 25 | use Illuminate\Http\Response; 26 | 27 | return (new Response($content, $status)) 28 | ->header('Content-Type', $value); 29 | 30 | برای آسودگی بیشتر ، شما میتوانید از تابع کمکی `response` نیز استفاده کنید : 31 | 32 | return response($content, $status) 33 | ->header('Content-Type', $value); 34 | 35 | #### ارسال View به عنوان پاسخ 36 | 37 | اگر نیازمندید که از قابلیت های `response` و متد های آن استفاده کنید (مثلا دستکاری Header ها) و همزمان یک View به عنوان پاسخ به خروجی ارسال کنید میتوانید از متد `view` استفاده نمایید . 38 | 39 | return response()->view('hello')->header('Content-Type', $type); 40 | 41 | #### ارسال کوکی در کنار response 42 | 43 | return response($content)->withCookie(cookie('name', 'value')); 44 | 45 | #### استفاده ذنجیره ای متد ها درکنار هم 46 | 47 | به یاد داشته باشید که بیشتر متدهای `response` قابلیت استفاده ذنجیره ای دارند که کار را برای شما بسیار راحت میکند . 48 | 49 | return response()->view('hello')->header('Content-Type', $type) 50 | ->withCookie(cookie('name', 'value')); 51 | 52 | 53 | ## ریدایرکت ها (redirects) 54 | یکی از مورد استفاده ترین Response ها ریدایرکت ها هستند که یک نمونه از کلاس `Illuminate\Http\RedirectResponse` میباشند . 55 | 56 | #### ارسال پاسخ از نوع ریداریکت (redirect) 57 | روش های مختلفی برای ایجاد یک پاسخ از نوع `RedirectResponse` وجود دارد که ساده ترین آن استفاده از تابع کمکی `redirect` است . در زمان تست ، ایجاد یک پاسخ ریداریکت ساختگی متداول نیست ! بنابراین استفاده از تابع کمکی `redirect` همیشه و در همه حال قابل قبول می باشد . 58 | 59 | return redirect('user/login'); 60 | 61 | #### پاسخ ریداریکت به همراه ارسال متغیر 62 | ریداریکت به یک URL جدید و [انتقال متغیر به Session](/docs/{{version}}/session) معمولا به صورت همزمان انجام میشود . بنابراین برای راحتی بیشتر میتوانید یک نمونه از `RedirectResponse` ایجاد کنید و متغیر ها را از طریق یک متد بصورت ذنجیره وار به session انتقال دهید : 63 | 64 | return redirect('user/login')->with('message', 'Login Failed'); 65 | 66 | #### ریدایرکت به URL پیشین 67 | ممکن است بخواهید کاربر را به مکان قبل (آدرس URL پیشین) منتقل کنید ، برای مثال ، بعد از اینکه یک فرم اطلاعاتی را در دیتابیس ذخیره کردید ، میتوانید بوسیله متد `back` کاربر را به صفحه ای که فرم در آن ثبت شده انتقال دهید : 68 | 69 | return redirect()->back(); 70 | 71 | return redirect()->back()->withInput(); 72 | 73 | #### ریداریکت به یک Route از طریق نام آن 74 | زمانی که از تابع کمکی`redirect` بدون پارامتر استفاده میکنید لاراول به شما یک نمونه از کلاس `Illuminate\Routing\Redirector` برمیگرداند ، که میتوانید از متد های آن استفاده نمایید . برای مثال یک `RedirectResponse` را برای یک روت از طریق نام آن توسط متد `route` میتوانید ایجاد کنید : 75 | 76 | return redirect()->route('login'); 77 | 78 | #### ریداریکت به یک Route از طریق نام آن و ارسال پارامتر 79 | اگر روت شما داری پارامتر می باشد ، میتوانید از طریق آرگومان دوم متد `route` آنها را تعریف کنید : 80 | 81 | // For a route with the following URI: profile/{id} 82 | 83 | return redirect()->route('profile', [1]); 84 | 85 | درصورتی که پارامتر شما یک مدل Eloquent باشد لاراول بطور پیشفرض خصوصیت فیلد ID را از درون مدل استخراج کرده و به عنوان پارامتر ارسال میکند : 86 | 87 | return redirect()->route('profile', [$user]); 88 | 89 | #### ریداریکت به یک Route از طریق نام آن و ارسال مقدار به یک پارامتر نامگذاری شده 90 | // For a route with the following URI: profile/{user} 91 | 92 | return redirect()->route('profile', ['user' => 1]); 93 | 94 | #### ریداریکت به یک کنترلر و اکشن 95 | همانند ریدایرکت به یک Route شما میتوانید به یک [controller actions](/docs/{{version}}/controllers) خاص نیز ریداریکت کنید : 96 | 97 | return redirect()->action('App\Http\Controllers\HomeController@index'); 98 | 99 | > **نکته :** درصورتی که مسیر namespace ریشه کنترلرها رو از طریق متد `URL::setRootControllerNamespace` مشخص کنید دیگر نیاز نخواهید داشت `namespace` کامل را در کلاس URL وارد کنید . 100 | 101 | #### ریداریکت به یک [controller actions](/docs/{{version}}/controllers) و ارسال پارامتر به آن : 102 | 103 | return redirect()->action('App\Http\Controllers\UserController@profile', [1]); 104 | 105 | #### ریداریکت به یک [controller actions](/docs/{{version}}/controllers) و ارسال مقدار به یک پارامتر نامگذاری شده : 106 | return redirect()->action('App\Http\Controllers\UserController@profile', ['user' => 1]); 107 | 108 | 109 | ## انواع دیگر پاسخ ها 110 | تابع کمکی `response` برای تولید انواع دیگر پاسخ ها (,JSONP , JSON , دانلود , ...) نیز بکار میرود . زمانیکه تابع کمکی `response` را بدون آرگومان صدا بزنید ، یک Implementation از کلاس `Illuminate\Contracts\Routing\ResponseFactory` [contract](/docs/{{version}}/contracts) باز گردانده می شود . که این `contract` متد های مفیدی برای تولید انواع پاسخ در خود دارد . 111 | 112 | #### ارسال یک پاسخ JSON 113 | متد json بصورت خودکار مقدار هدر `Content-Type` را `application/json` قرار میدهد : 114 | 115 | return response()->json(['name' => 'Abigail', 'state' => 'CA']); 116 | 117 | #### ارسال یک پاسخ JSONP 118 | 119 | return response()->json(['name' => 'Abigail', 'state' => 'CA']) 120 | ->setCallback($request->input('callback')); 121 | 122 | #### ارسال پاسخ به صورت دانلود فایل 123 | 124 | return response()->download($pathToFile); 125 | 126 | return response()->download($pathToFile, $name, $headers); 127 | 128 | return response()->download($pathToFile)->deleteFileAfterSend(true); 129 | 130 | > **نکته :** کلاس Symfony HttpFoundation , که وظیفه مدیریت دانلود را بر عهده دارد , نیازمند این می باشد که نام فایل دانلودی ، شامل کاراکتر های ASCII باشد . 131 | 132 | 133 | ## Response Macros 134 | ماکرو ها این امکان را میدهند که متد های `response` را سفارشی کنید و آنها را در قسمت های مختلف پروژه (کنترلر ها و Route ها و ..) استفاده کنید . 135 | برای مثال , تعریف ماکرو در متد `boot` از یک [service provider](/docs/{{version}}/providers) : 136 | 137 | caps('foo'); 162 | -------------------------------------------------------------------------------- /5.0/schema.md: -------------------------------------------------------------------------------- 1 | # سازنده اسکیما - Schema Builder 2 | 3 | - [آشنایی](#introduction) 4 | - [ایجاد و حذف جدولها](#creating-and-dropping-tables) 5 | - [افزودن ستونها](#adding-columns) 6 | - [تغییر ستونها](#changing-columns) 7 | - [تغییرنام ستونها](#renaming-columns) 8 | - [حذف ستونها](#dropping-columns) 9 | - [بررسی وجود ستون](#checking-existence) 10 | - [افزودن ایندکس](#adding-indexes) 11 | - [کلیدهای خارجی](#foreign-keys) 12 | - [حذف ایندکس](#dropping-indexes) 13 | - [حذف تایم استمپ و حذف های موقت](#dropping-timestamps) 14 | - [موتورهای ذخیره سازی - Storage Engines](#storage-engines) 15 | 16 | 17 | ## آشنایی 18 | 19 | کلاس `Schema` لاراول روشی مستقل از پایگاه داده برای انجام تغییرات بر روی جدولها ارائه مینماید. این کلاس با تمامی پایگاه داده هایی که توسط لاراول پشتیبانی میشوند به خوبی کارمیکند، و برای تمامی این سیستمها یک واسط توسعه یکسان دارد. 20 | 21 | 22 | ## ایجاد و حذف جداول 23 | 24 | برای ایجاد یک جدول پایگاه داده جدید، متد `Schema::create` استفاده می شود: 25 | 26 | Schema::create('users', function($table) 27 | { 28 | $table->increments('id'); 29 | }); 30 | 31 | آرگومان اولی که به متد `create` فرستاده می شود، اسم جدول است، و آرگومان دوم یک `Closure` است. این کلوژر یک شی `Blueprint` میپذیرد که برای تعریف جدول می توان از آن استفاده کرد. 32 | 33 | برای تغییر نام یک جدول پایگاه داده، میتوان از متد `rename` استفاده کرد: 34 | 35 | Schema::rename($from, $to); 36 | 37 | برای مشخص کردن اتصال پایگاه داده مورد استفاده در انجام عملیات، از متد `Schema::connection` استفاده کنید: 38 | 39 | Schema::connection('foo')->create('users', function($table) 40 | { 41 | $table->increments('id'); 42 | }); 43 | 44 | برای حذف یک جدول، میتوانید از متد `Schema::drop` استفاده کنید: 45 | 46 | Schema::drop('users'); 47 | 48 | Schema::dropIfExists('users'); 49 | 50 | 51 | ## افزودن ستونها 52 | 53 | برای به روزرسانی یک جدول، از متد `Schema::table` استفاده میکنیم: 54 | 55 | Schema::table('users', function($table) 56 | { 57 | $table->string('email'); 58 | }); 59 | 60 | schema builder نوع ستونهای متفاوتی را معرفی میکند که در زمان ساخت جدولها میتوان از آنها استفاده کرد: 61 | 62 | دستور | تعریف 63 | ------------- | ------------- 64 | `$table->bigIncrements('id');` | افزایش مقدار ID با استفاده از معادل "big integer" 65 | `$table->bigInteger('votes');` | معادل BIGINT برای جدول 66 | `$table->binary('data');` | معادل BLOB جدول 67 | `$table->boolean('confirmed');` | معادل BOOLEAN جدول 68 | `$table->char('name', 4);` | معدل CHAR در جدول 69 | `$table->date('created_at');` | معادل DATE در جدول 70 | `$table->dateTime('created_at');` | معدل DATETIME برای جدول 71 | `$table->decimal('amount', 5, 2);` | معادل DECIMAL با مقدار صحیح و اعشار 72 | `$table->double('column', 15, 8);` | معادل DOUBLE با اعشار، در مجموع 15 رقم با 8 رقم اعشار 73 | `$table->enum('choices', ['foo', 'bar']);` | معادل ENUM در جدول 74 | `$table->float('amount');` | معادل FLOAT در جدول 75 | `$table->increments('id');` | افزایش ID در جدول 76 | `$table->integer('votes');` | معادل INTEGER در جدول 77 | `$table->json('options');` | معادل JSON در جدول 78 | `$table->jsonb('options');` | معادل JSONB در جدول 79 | `$table->longText('description');` | معادل LONGTEXT در جدول 80 | `$table->mediumInteger('numbers');` | معادل MEDIUMINT در جدول 81 | `$table->mediumText('description');` | معادل MEDIUMTEXT در جدول 82 | `$table->morphs('taggable');` | ستون INTEGER با عنوان 'taggable_id' و STRING با عنوان 'taggable_type' به جدول اضاف میکند 83 | `$table->nullableTimestamps();` | مشابه متد timestamp() با این تفاوت که امکان NULL بودن مقدار وجود دارد 84 | `$table->smallInteger('votes');` | معادل SMALLINT در جدول 85 | `$table->tinyInteger('numbers');` | معادل TINYINT در جدول 86 | `$table->softDeletes();` | ستون **deleted\_at** را برای امکان حذف موقت به جدول می افزاید 87 | `$table->string('email');` | معادل ستون VARCHAR در جدول 88 | `$table->string('name', 100);` | معادل ستون VARCHAR با امکان ارائه اندازه 89 | `$table->text('description');` | معادل TEXT در جدول 90 | `$table->time('sunrise');` | معادل TIME در جدول 91 | `$table->timestamp('added_on');` | معادل TIMESTAMP در جدول 92 | `$table->timestamps();` | ستونهای **created\_at** و **updated\_at** را به جدول می افزاید 93 | `$table->rememberToken();` | ستون remember_token با نوع VARCHAR(100) و امکان NULL بودن می افزاید 94 | `->nullable()` | اشاره میکند که ستون امکان NULL بودن را هم دارد. 95 | `->default($value)` | یک مقدار پیشفرض برای ستون تعیین میکند. 96 | `->unsigned()` | نوع INTEGER را به UNSIGNED تغییر میدهد. 97 | 98 | #### استفاده از after در MySQL 99 | 100 | اگر از پایگاه داده MySQL استفاده میکنید، میتوانید از متد `after` برای مشخص کردن ترتیب ستونها استفاده کنید: 101 | 102 | $table->string('name')->after('email'); 103 | 104 | 105 | ## تغییر ستونها 106 | 107 | **نکته:** پیش از تغییر ستون، مطمئن باشید وابستگی `doctrine/dbal` را به فایل `composer.json` افزوده اید. 108 | 109 | گاهی نیاز به تغییر یک ستون از جدول دارید. برای مثال، گاهی نیاز به افزایش طول string یک ستون دارید. متد `change` این کار را به سادگی انجام میدهد! برای مثال، اندازه ستون `name` را از 25 به 50 افزایش میدهیم: 110 | 111 | Schema::table('users', function($table) 112 | { 113 | $table->string('name', 50)->change(); 114 | }); 115 | 116 | همچنین میتوان وضعیت یک ستون را به `Nullable` تغییر داد: 117 | 118 | Schema::table('users', function($table) 119 | { 120 | $table->string('name', 50)->nullable()->change(); 121 | }); 122 | 123 | 124 | ## تغییر نام یک ستون 125 | 126 | برای تغییر نام ستون، میتوانید از متد `renameColumn` در Schema builder استفاده کنید. پیش از تغییر نام ستون، وابستگی `doctorine/dbal` را به فایل `composer.json` بیافزایید. 127 | 128 | Schema::table('users', function($table) 129 | { 130 | $table->renameColumn('from', 'to'); 131 | }); 132 | 133 | > **نکته:** تغییر نام در جدولی با ستونی از جنس `enum` در حال حاضر پشتیبانی نمیشود. 134 | 135 | 136 | ## حذف ستونها 137 | 138 | برای حذف یک ستون، میتوانید از متد `dropColumn` در Schema builder استفاده کنید. پیش از حذف یک ستون وابستگی `doctorine/dbal` را به فایل `composer.json` بیافزایید. 139 | 140 | #### حذف یک ستون از یک جدول 141 | 142 | Schema::table('users', function($table) 143 | { 144 | $table->dropColumn('votes'); 145 | }); 146 | 147 | #### حذف چند ستون از جدول 148 | 149 | Schema::table('users', function($table) 150 | { 151 | $table->dropColumn(['votes', 'avatar', 'location']); 152 | }); 153 | 154 | 155 | ## بررسی وجود 156 | 157 | #### بررسی وجود یک جدول 158 | 159 | میتوانید برای بررسی وجود یا عدم وجود یک جدول یا ستون از متدهای `hasTable` یا `hasColumn` استفاده کنید: 160 | 161 | if (Schema::hasTable('users')) 162 | { 163 | // 164 | } 165 | 166 | #### بررسی وجود یک ستون 167 | 168 | if (Schema::hasColumn('users', 'email')) 169 | { 170 | // 171 | } 172 | 173 | 174 | ## افزودن ایندکس 175 | 176 | Schema builder چندین نوع ایندکس از چند نوع ایندکس پشتیبانی میکند. دو راه برای افزودن آنها وجود دارد. راه اول، میتوانید آن را مستقیما هنگام معرفی ستون تعریف کنید، یا در مرحله ای مجزا آنها را بیافزایید: 177 | $table->string('email')->unique(); 178 | 179 | یا میتوانید ایندکس را در خطی مجزا بیافزایید. در ادامه لیستی از نوع ایندکسهای موجود ارائه شده اند: 180 | 181 | Command | Description 182 | ------------- | ------------- 183 | `$table->primary('id');` | افزودن کلید اصلی 184 | `$table->primary(['first', 'last']);` | افزودن کلید ترکیبی 185 | `$table->unique('email');` | افزودن ایندکس یکتا 186 | `$table->index('state');` | افزودن ایندکس پایه ای 187 | 188 | 189 | ## کلید خارجی 190 | 191 | لاراول امکان افزودن محدودیت کلید خارجی به جداول را نیز فراهم مینماید: 192 | 193 | $table->integer('user_id')->unsigned(); 194 | $table->foreign('user_id')->references('id')->on('users'); 195 | 196 | در این مثال، تعریف کرده ایم که ستون `user_id` به ستون `id` از جدول `users` اشاره میکند. پیش از اینکار از ساخته شدن کلید خارجی مطمئن شوید. 197 | 198 | همچنین برای عملیاتهای "on update" و "on delete" میتوانید با پارامترهایی که میفرستید شرایط را هم تعیین نمایید: 199 | 200 | $table->foreign('user_id') 201 | ->references('id')->on('users') 202 | ->onDelete('cascade'); 203 | 204 | برای حذف یک کلید خارجی، میتوانید از متد `dropForeign` استفاده کنید. قرارداد نامگذاری استفاده شده برای کلیدهای خارجی دقیقا مشابه آنچه در نامگذاری ایندکسها استفاده میشود است. 205 | 206 | $table->dropForeign('posts_user_id_foreign'); 207 | 208 | > **نکته:** هنگام ایجاد یک کلید خارجی که به یک Integer با افزایش مقدار خودکار اشاره دارد، به یاد داشته باشید همیشه ستون کلید خارجی را `unsigned` قرار دهید. 209 | 210 | 211 | ## حذف ایندکسها 212 | 213 | برای حذف ایندکس باید نام آن را مشخص نمایید. لاراول به صورت پیش فرض یک نام منطقی به ایندکس انتصاب میدهد. این کار با ترکیب نام جدول، نام ستونی که در ایندکس آمده، و نوع ایندکس مشخص می شود. در ادامه چند مثال را میبینید: 214 | 215 | فرمان | توصیف 216 | ------------- | ------------- 217 | `$table->dropPrimary('users_id_primary');` | حذف یک کلید اصلی از جدول "users" 218 | `$table->dropUnique('users_email_unique');` | حذف یک ایندکس یکتا از جدول "users" 219 | `$table->dropIndex('geo_state_index');` | حذف یک ایندکس ابتدایی از جدول "geo" 220 | 221 | 222 | ## حذف تایم استمپها و حذفهای موقت 223 | 224 | برای حذف ستونهای از جنس `timestamps`، `nullableTimestamps`، softDeletes میتوانید از متدهای زیر استفاده کنید: 225 | 226 | فرمان | توصیف 227 | ------------- | ------------- 228 | `$table->dropTimestamps();` | حذف ستونهای **created\_at** و **updated\_at** از جدول 229 | `$table->dropSoftDeletes();` | حذف ستون **deleted\_at** از جدول 230 | 231 | 232 | ## موتورهای ذخیره سازی 233 | 234 | برای تعیین موتور ذخیره سازی برای یک جدول، مقدار خصوصیت `engine` را بر روی schema builder مقداردهی کنید: 235 | 236 | Schema::create('users', function($table) 237 | { 238 | $table->engine = 'InnoDB'; 239 | 240 | $table->string('email'); 241 | }); 242 | -------------------------------------------------------------------------------- /5.0/session.md: -------------------------------------------------------------------------------- 1 | # نشست - Session 2 | 3 | - [پیکربندی](#configuration) 4 | - [کاربرد نشست](#session-usage) 5 | - [Flash Data](#flash-data) 6 | - [نشستهای پایگاه داده](#database-sessions) 7 | - [درایورهای نشست](#session-drivers) 8 | 9 | 10 | ## پیکربندی 11 | 12 | از آنجاکه نرم افزارهای مبتنی بر HTTP وضعیت اتصالها را نگاه نمیدارند (stateless)، نشستها به عنوان راه حلی برای نگاهداری اطلاعات کاربران در بین درخواستهاست. لاراول امکانات زیادی برای استفاده در یک API شسته رفته و یکپارچه دارد. پشتیبانی از بک اندهایی مانند [Memcached](http://memcached.org) و [Redis](http://redis.io) و پایگاههای داده در لاراول انجام می شود. 13 | 14 | تنظیمات نشست در فایل `config/session.php` ذخیره می شوند. اطمینان حاصل کنید که گزینه های این فایل را به دقت مطالعه نمایید. به صورت پیش فرض، لاراول برای استفاده از درایور نشست `file` تنظیم شده است. این درایور برای عموم نرم افزارها به خوبی کار میکند. 15 | 16 | پیش از استفاده از نشستهای Redis در لاراول باید بسته `predis/predis` (~1.0) را از طریق کامپوزر نصب کنید. 17 | 18 | > **نکته:** اگر داده های نشستهای شما باید رمزگذاری شوند، مقدار گزینه `encrypt` را برابر با `true قرار دهید. 19 | 20 | > **نکته:** هنگام استفاده از درایور نشست `cookie`، به هیچ وجه نباید middleware با عنوان `EncryptCookie` را از کرنل HTTP حذف نمایید. اگر این middleware را حذف کنید، نرم افزار در مقابل code injection آسیب پذیر خواهد بود. 21 | 22 | #### کلیدهای رزروشده 23 | 24 | فریمورک لاراول از کلید نشست `flash` به طور پیش فرض استفاده میکند. بنابراین شما نباید موردی را با این اسم به نشست بیافزایید. 25 | 26 | 27 | ## کاربرد نشست 28 | 29 | به چند روش میتوان به نشستها دسترسی داشت، با استفاده از متد `session` از درخواستهای HTTPT، با استفاده از فاساد `Session`، یا تابع کمکی `session`. اگر تابع کمکی `session` بدون آرگومان فراخوانی شود، خروجی آن کل شی نشست خواهد بود. برای مثال: 30 | 31 | session()->regenerate(); 32 | 33 | #### ذخیره یک عنصر در نشست 34 | 35 | Session::put('key', 'value'); 36 | 37 | session(['key' => 'value']); 38 | 39 | #### افزودن یک مقدار به آرایه ای در نشست 40 | 41 | Session::push('user.teams', 'developers'); 42 | 43 | #### خواندن یک مقدار از نشست 44 | 45 | $value = Session::get('key'); 46 | 47 | $value = session('key'); 48 | 49 | #### خواندن یک مقدار از نشست یا بازگرداندن مقدار پیش فرض 50 | 51 | $value = Session::get('key', 'default'); 52 | 53 | $value = Session::get('key', function() { return 'default'; }); 54 | 55 | #### خواندن مقدار از نشست و حذف آن 56 | 57 | $value = Session::pull('key', 'default'); 58 | 59 | #### خواندن تمامی مقادیر از نشست 60 | 61 | $data = Session::all(); 62 | 63 | #### بررسی وجود یک مقدار در نشست 64 | 65 | if (Session::has('users')) 66 | { 67 | // 68 | } 69 | 70 | #### حذف یک مقدار از نشست 71 | 72 | Session::forget('key'); 73 | 74 | #### حذف تمامی مقدارها از نشست 75 | 76 | Session::flush(); 77 | 78 | #### تولید مجدد ID نشست 79 | 80 | Session::regenerate(); 81 | 82 | 83 | ## فلش داده ها - Flash Data 84 | 85 | گاهی میخواهید اطلاعات را تنها برای درخواست بعدی در session ذخیره کنید. اینکار را با استفاده از متد `Session::flash` میتوانید انجام دهید. 86 | 87 | Session::flash('key', 'value'); 88 | 89 | #### فلش مجدد داده ها فعلی برای session بعدی 90 | 91 | Session::reflash(); 92 | 93 | #### فلش مجدد تنها بخشی از داده ها 94 | 95 | Session::keep(['username', 'email']); 96 | 97 | 98 | ## سشن های پایگاه داده 99 | 100 | برای استفاده از درایور نشست `database`، باید جدولی برای نگاهداری عناصر نشست ایجاد شود. در ادامه یک تعریف `Schema` از این جدول ارائه شده است: 101 | 102 | Schema::create('sessions', function($table) 103 | { 104 | $table->string('id')->unique(); 105 | $table->text('payload'); 106 | $table->integer('last_activity'); 107 | }); 108 | 109 | البته میتوانید از فرمان آرتیزان `session::table` برای ایجاد این میگریشن استفاده کنید! 110 | 111 | php artisan session:table 112 | 113 | composer dump-autoload 114 | 115 | php artisan migrate 116 | 117 | 118 | ## درایورهای نشست - Session Drivers 119 | 120 | درایور نشست مکان ذخیره سازی داده های نشست برای هر درخواست را مشخص میکند. لاراول درایورهای بسیاری با خود دارد: 121 | 122 | - `file` - نشستها در `storage/framework/sessions` ذخیره میشوند. 123 | - `cookie` - نشستهای در کوکیهای کدگذاری شده نگهداری میشوند. 124 | - `database` -نشستها در پایگاه داده استفاده شده استفاده شده توسط نرم افزار شما ذخیره میشوند. 125 | - `memcached` / `redis` - نشستها در یکی از این کشهای سریع و امن نگاهداری میشوند. 126 | - `array` - نشستها در آرایه های ساده PHP نگاهداری می شوند و ما بین درخواستهای مختلف حفظ نمی شوند. 127 | 128 | > **نکته:** درایورarray معمولا برای اجرای [unit test](/docs/%7B%7Bversion%7D%7D/testing) ها استفاده می شود، بنابراین هیچ داده ای ذخیره دائم نمیشود. 129 | -------------------------------------------------------------------------------- /5.0/structure.md: -------------------------------------------------------------------------------- 1 | # ساختار برنامه 2 | 3 | - [آشنایی](#introduction) 4 | - [Root دایرکتوری ](#the-root-directory) 5 | - [App دایرکتوری ](#the-app-directory) 6 | - [فضای نامی برنامه ی شما](#namespacing-your-application) 7 | 8 | 9 | ## آشنایی 10 | 11 | به صورت پیش فرض ساختار دایرکتوری ها در فریم ورک لاراول طوری در نظر گرفته شده است که نقطه ی شروع مناسبی برای برنامه های کوچک و بزرگ باشد . البته شما برای سازماندهی کردن دایرکتوری های برنامه ی خودتان ,کاملا آزاد هستین و تقریبا می توان گفت هیچ محدودیتی از طرف لاراول برای محل قرار گیری کلاس ها وجود ندارد و کامپوزر می تواند آنها را بارگزاری نماید . 12 | 13 | 14 | 15 | 16 | ## Root دایرکتوری 17 | 18 | زمان نصب یک لاراول جدید , دایرکتوری روت شامل فولدرهای متعددی است : 19 | 20 | 21 | همانطور که انتظار می رود , دایرکتوری root شامل کدهای هسته ی برنامه ی شما می باشد . ما به زودی این فولدر و جزییات آن را شرح می دهیم . 22 | 23 | فولدر `bootstrap` شامل فایل های اندکی به منظور راه اندازی فریم ورک و پیکربندی های خودکار می باشد . 24 | 25 | 26 | فولدر `config` همانطور که از نام آن می توان حدس زد شامل فایل های تنظیمات و پیکربندی های برنامه ی شما می باشد . 27 | 28 | 29 | فولدر `database` شامل تمام migration و seeds های برنامه ی شما می باشد . 30 | 31 | فولدر `public` شامل تمام فایل های بخش Front پروژه و assets ها می باشد (عکس ها ,استایل ها ,فایل های جاوااسکریپت و غیره) 32 | 33 | فولدر `resources` شامل تمام view ها , فایل های مربوط به زبان و همچنین فایل هایی مانند LESS, SASS, CoffeeScript می باشد . 34 | 35 | فولدر `storage` شامل تمام فایل های کامپایل شده قالب Blade , سشن ها ,کش ها و دیگر فایل های تولید شده به وسلیه فریم ورک می باشد . 36 | 37 | فولدر `test` شامل فایل های تست خودکار می باشد. 38 | 39 | فولدر `vendor` شامل تمام پکیج های مورد نیاز می باشد . 40 | 41 | 42 | ## App دایرکتوری 43 | 44 | قسمت اصلی برنامه ی شما در فولدر `app` می باشد و این فولدر تحت فضای نامی App است و به صورت خودکار به وسیله ی کامپوزر و استاندارد [PSR-4 autoloading standard](http://www.php-fig.org/psr/psr-4/) بارگزاری می شود .شما می توانید با فرمان آرتیسان app:name این فضای نامی را به دلخواه خود عوض نمایید. 45 | 46 | فولدر `app` شامل فولدرهای مختلفی مانند `Console`, `Http` و `Providers` می باشد . فولدرهای `Console`, `Http` را به منظور ارایه دهنده ی API ای داخل برنامه ی خود درنظر بگیرید و همچنین پروتوکل HTTP و CLI هر دو مکانیزمی به منظور تعامل با برنامه شما می باشند.به عبارت دیگر آنها ۲ راه ساده ی ارسال پیام در برنامه ی شما هستند. 47 | فولدر Console شامل تمام فرمان های Artisan هست و فولدر Http شامل تمام کنترلرها , فیلترها و requests ها می باشد . 48 | فولدر Commands در واقع محلی برای تمام commandsهای برنامه شما می باشد . 49 | فولدر Events همانطور که از نام اش انتظار می رود محل نگهداری کلاس های event می باشد .برای استفاده از event ها لازم نیست از این کلاس ها استفاده کنید , با این حال اگر می خواهید از آنها استفاده کنید , این فولدر محل پیشفرض event هایی است که با فرمان Artisan ایجاد می شوند . 50 | 51 | فولدر `Handlers` شامل تمام کلاس های handler برای commands و events ها می باشد.Handlers ها یک command یا event را دریافت می کنند و زمانی که آنها فراخوانی می شوند , منطق آنها را اجرا کرده و در پاسخ به آنها ارسال می کند . 52 | فولدر `Services` شامل سرویس هایی است که برنامه ی شما در طول اجرا به آن نیاز دارد .برای مثال سرویس `Registrar` مسئول اعتبارسنجی و ایجاد یک کاربر جدید در برنامه ی شما است و یا سرویس هایی که با API های بیرونی ارتباط برقرار می کنند و یا حتی سرویس هایی که داده ها را در برنامه ی شما جمع آوری می کنند . 53 | فولدر `Exceptions` شامل تمام استثناها و exception های برنامه ی شما است و همچنین محل مناسبی برای رسیدگی به exception های رخ داده شده در برنامه می باشد . 54 | 55 | > **توجه داشته باشید:** بسیاری از کلاس های داخل فولدر`app` را می توان با فرمان های artisan ایجاد نمود.به منظور مرور این فرمان ها در ترمینال خود , `php artisan list make` را اجرا نمایید. 56 | 57 | 58 | ## فضای نامی برنامه ی شما 59 | 60 | همانطور که در بالا صحبت کردیم namespace یا فضای نام پیش فرض برنامه, App می باشد هرچند که شما به راحتی با توجه به نام برنامه خودتان می توانید آن را تغییر دهید و این کار از طریق فرمان آرتیسان app:name صورت می گیرد . به عنوان مثال اگر نام برنامه ی شما SocialNet باشد , شما فرمان زیر را می توانید اجرا نمایید. 61 | 62 | php artisan app:name SocialNet 63 | -------------------------------------------------------------------------------- /5.0/templates.md: -------------------------------------------------------------------------------- 1 | # قالبها - Templates 2 | 3 | - [کتابخانه ساخت قالب Blade](#blade-templating) 4 | - [دیگر ساختارهای کنترل Blade](#other-blade-control-structures) 5 | 6 | 7 | ## کتابخانه ساخت قالب Blade 8 | 9 | Blade یک موتور ساده و در عین حال قدرتمند ایجاد قالب است که همراه لاراول ارائه می شود. برخلاف قالبهای کنترلر، کار Blade برپایه _ارث بری قالبها_ و _بخشها_ بنا شده است. تمامی قالبهای Blade باید از پسوند `blade.php.` استفاده کنند. 10 | 11 | #### تعریف یک لی اوت(layout) مبتنی بر Blade 12 | 13 | 14 | 15 | 16 | 17 | App Name - @yield('title') 18 | 19 | 20 | @section('sidebar') 21 | This is the master sidebar. 22 | @show 23 | 24 |
25 | @yield('content') 26 |
27 | 28 | 29 | 30 | #### نحوه استفاده از لی اوت Blade 31 | 32 | @extends('layouts.master') 33 | 34 | @section('title', 'Page Title') 35 | 36 | @section('sidebar') 37 | @@parent 38 | 39 |

This is appended to the master sidebar.

40 | @stop 41 | 42 | @section('content') 43 |

This is my body content.

44 | @stop 45 | 46 | اگر به viewها دقت کنید یک لی اوت Blade را `extend` میکند. با این کار میتوانید بخشهای مشخص شده جایگزین کنید. در viewهایی که این لی اوت را استفاده میکنند، محتوای لی اوت با استفاده از راهنمای (directive) تعریف شده `parent@@` قابل دسترس است. در این بخشها میتوان محتوای لی اوت را با بخشهایی مانند منوکنار (side bar)، و یا فوتر جانمایی کرد. 47 | 48 | گاهی که از تعریف شدن یک بخش اطمینان ندارید، میتوانید یک مقدار پیش فرض به راهنمای `yield@` بفرستید. مقدار پیش فرض را میتوانید به عنوان پارامتر دوم بفرستید: 49 | 50 | @yield('section', 'Default Content') 51 | 52 | 53 | ## دیگر ساختارهای کنترلی Blade 54 | 55 | #### چاپ داده 56 | 57 | Hello, {{ $name }}. 58 | 59 | The current UNIX timestamp is {{ time() }}. 60 | 61 | #### چاپ داده پس از بررسی وجود 62 | 63 | گاهی میخواهید داده ای را چاپ نمایید اما از مقداردهی شدن آن اطمینان ندارید. به سادگی میتوانید روش زیر را استفاده کنید: 64 | 65 | {{ isset($name) ? $name : 'Default' }} 66 | 67 | Blade به جای استفاده از عبارت ترنری (ternary) بالا، امکان استفاده از ساختار زیر را فراهم میکند: 68 | 69 | {{ $name or 'Default' }} 70 | 71 | #### نمایش متن خام در آکولاد 72 | 73 | اگر میخواهید یک رشته متن را که در آکولاد قراردارد نمایش دهید، میتوانید با استفاده از علامت `@` پیش از متن، از تفسیر آکولادها توسط Blade جلوگیری کنید: 74 | 75 | @{{ این متن توسط Blade پردازش نمیشود }} 76 | 77 | اگر میخواهید داده های درون متن هنوز نمایش داده شوند از قالب زیر استفاده کنید: 78 | 79 | Hello, {!! $name !!}. 80 | 81 | > **نکته:** هنگام چاپ محتوایی که توسط کاربران نرم افزار ارائه شده اند بسیار مراقب باشید. همیشه برای نمایش موجودیتهای HTML درون متن از جفت-آکولاد استفاده کنید. 82 | 83 | #### عبارات if 84 | 85 | @if (count($records) === 1) 86 | I have one record! 87 | @elseif (count($records) > 1) 88 | I have multiple records! 89 | @else 90 | I don't have any records! 91 | @endif 92 | 93 | @unless (Auth::check()) 94 | You are not signed in. 95 | @endunless 96 | 97 | #### حلقه های تکرار 98 | 99 | @for ($i = 0; $i < 10; $i++) 100 | The current value is {{ $i }} 101 | @endfor 102 | 103 | @foreach ($users as $user) 104 |

This is user {{ $user->id }}

105 | @endforeach 106 | 107 | @forelse($users as $user) 108 |
  • {{ $user->name }}
  • 109 | @empty 110 |

    No users

    111 | @endforelse 112 | 113 | @while (true) 114 |

    I'm looping forever.

    115 | @endwhile 116 | 117 | #### استفاده از زیرviewها 118 | 119 | @include('view.name') 120 | 121 | میتوانید آرایه ای از داده به view استفاده شده بفرستید: 122 | 123 | @include('view.name', ['some' => 'data']) 124 | 125 | #### بازنویسی بخشها 126 | 127 | برای بازنویسی کل یک بخش، میتوانید از عبارت `overwrite` استفاده کنید: 128 | 129 | @extends('list.item.container') 130 | 131 | @section('list.item.content') 132 |

    This is an item of type {{ $item->type }}

    133 | @overwrite 134 | 135 | #### نمایش خطوط زبان 136 | 137 | @lang('language.line') 138 | 139 | @choice('language.line', 1) 140 | 141 | #### کامنتها 142 | 143 | {{-- این بخش در HTML نهایی نخواهد بود --}} 144 | 145 | -------------------------------------------------------------------------------- /5.0/test.txt: -------------------------------------------------------------------------------- 1 | This is a test. -------------------------------------------------------------------------------- /5.0/testing.md: -------------------------------------------------------------------------------- 1 | # Testing 2 | 3 | - [Introduction](#introduction) 4 | - [Defining & Running Tests](#defining-and-running-tests) 5 | - [Test Environment](#test-environment) 6 | - [Calling Routes From Tests](#calling-routes-from-tests) 7 | - [Mocking Facades](#mocking-facades) 8 | - [Framework Assertions](#framework-assertions) 9 | - [Helper Methods](#helper-methods) 10 | - [Refreshing The Application](#refreshing-the-application) 11 | 12 | 13 | ## Introduction 14 | 15 | Laravel is built with unit testing in mind. In fact, support for testing with PHPUnit is included out of the box, and a `phpunit.xml` file is already setup for your application. 16 | 17 | An example test file is provided in the `tests` directory. After installing a new Laravel application, simply run `phpunit` on the command line to run your tests. 18 | 19 | 20 | ## Defining & Running Tests 21 | 22 | To create a test case, simply create a new test file in the `tests` directory. The test class should extend `TestCase`. You may then define test methods as you normally would when using PHPUnit. 23 | 24 | #### An Example Test Class 25 | 26 | class FooTest extends TestCase { 27 | 28 | public function testSomethingIsTrue() 29 | { 30 | $this->assertTrue(true); 31 | } 32 | 33 | } 34 | 35 | You may run all of the tests for your application by executing the `phpunit` command from your terminal. 36 | 37 | > **Note:** If you define your own `setUp` method, be sure to call `parent::setUp`. 38 | 39 | 40 | ## Test Environment 41 | 42 | When running unit tests, Laravel will automatically set the configuration environment to `testing`. Also, Laravel includes configuration files for `session` and `cache` in the test environment. Both of these drivers are set to `array` while in the test environment, meaning no session or cache data will be persisted while testing. You are free to create other testing environment configurations as necessary. 43 | 44 | The `testing` environment variables may be configured in the `phpunit.xml` file. 45 | 46 | 47 | ## Calling Routes From Tests 48 | 49 | #### Calling A Route From A Test 50 | 51 | You may easily call one of your routes for a test using the `call` method: 52 | 53 | $response = $this->call('GET', 'user/profile'); 54 | 55 | $response = $this->call($method, $uri, $parameters, $cookies, $files, $server, $content); 56 | 57 | You may then inspect the `Illuminate\Http\Response` object: 58 | 59 | $this->assertEquals('Hello World', $response->getContent()); 60 | 61 | #### Calling A Controller From A Test 62 | 63 | You may also call a controller from a test: 64 | 65 | $response = $this->action('GET', 'HomeController@index'); 66 | 67 | $response = $this->action('GET', 'UserController@profile', ['user' => 1]); 68 | 69 | > **Note:** You do not need to specify the full controller namespace when using the `action` method. Only specify the portion of the class name that follows the `App\Http\Controllers` namespace. 70 | 71 | The `getContent` method will return the evaluated string contents of the response. If your route returns a `View`, you may access it using the `original` property: 72 | 73 | $view = $response->original; 74 | 75 | $this->assertEquals('John', $view['name']); 76 | 77 | To call a HTTPS route, you may use the `callSecure` method: 78 | 79 | $response = $this->callSecure('GET', 'foo/bar'); 80 | 81 | 82 | ## Mocking Facades 83 | 84 | When testing, you may often want to mock a call to a Laravel static facade. For example, consider the following controller action: 85 | 86 | public function getIndex() 87 | { 88 | Event::fire('foo', ['name' => 'Dayle']); 89 | 90 | return 'All done!'; 91 | } 92 | 93 | We can mock the call to the `Event` class by using the `shouldReceive` method on the facade, which will return an instance of a [Mockery](https://github.com/padraic/mockery) mock. 94 | 95 | #### Mocking A Facade 96 | 97 | public function testGetIndex() 98 | { 99 | Event::shouldReceive('fire')->once()->with('foo', ['name' => 'Dayle']); 100 | 101 | $this->call('GET', '/'); 102 | } 103 | 104 | > **Note:** You should not mock the `Request` facade. Instead, pass the input you desire into the `call` method when running your test. 105 | 106 | 107 | ## Framework Assertions 108 | 109 | Laravel ships with several `assert` methods to make testing a little easier: 110 | 111 | #### Asserting Responses Are OK 112 | 113 | public function testMethod() 114 | { 115 | $this->call('GET', '/'); 116 | 117 | $this->assertResponseOk(); 118 | } 119 | 120 | #### Asserting Response Statuses 121 | 122 | $this->assertResponseStatus(403); 123 | 124 | #### Asserting Responses Are Redirects 125 | 126 | $this->assertRedirectedTo('foo'); 127 | 128 | $this->assertRedirectedToRoute('route.name'); 129 | 130 | $this->assertRedirectedToAction('Controller@method'); 131 | 132 | #### Asserting A View Has Some Data 133 | 134 | public function testMethod() 135 | { 136 | $this->call('GET', '/'); 137 | 138 | $this->assertViewHas('name'); 139 | $this->assertViewHas('age', $value); 140 | } 141 | 142 | #### Asserting The Session Has Some Data 143 | 144 | public function testMethod() 145 | { 146 | $this->call('GET', '/'); 147 | 148 | $this->assertSessionHas('name'); 149 | $this->assertSessionHas('age', $value); 150 | } 151 | 152 | #### Asserting The Session Has Errors 153 | 154 | public function testMethod() 155 | { 156 | $this->call('GET', '/'); 157 | 158 | $this->assertSessionHasErrors(); 159 | 160 | // Asserting the session has errors for a given key... 161 | $this->assertSessionHasErrors('name'); 162 | 163 | // Asserting the session has errors for several keys... 164 | $this->assertSessionHasErrors(['name', 'age']); 165 | } 166 | 167 | #### Asserting Old Input Has Some Data 168 | 169 | public function testMethod() 170 | { 171 | $this->call('GET', '/'); 172 | 173 | $this->assertHasOldInput(); 174 | } 175 | 176 | 177 | ## Helper Methods 178 | 179 | The `TestCase` class contains several helper methods to make testing your application easier. 180 | 181 | #### Setting And Flushing Sessions From Tests 182 | 183 | $this->session(['foo' => 'bar']); 184 | 185 | $this->flushSession(); 186 | 187 | #### Setting The Currently Authenticated User 188 | 189 | You may set the currently authenticated user using the `be` method: 190 | 191 | $user = new User(['name' => 'John']); 192 | 193 | $this->be($user); 194 | 195 | You may re-seed your database from a test using the `seed` method: 196 | 197 | #### Re-Seeding Database From Tests 198 | 199 | $this->seed(); 200 | 201 | $this->seed('DatabaseSeeder'); 202 | 203 | More information on creating seeds may be found in the [migrations and seeding](/docs/migrations#database-seeding) section of the documentation. 204 | 205 | 206 | ## Refreshing The Application 207 | 208 | As you may already know, you can access your Application ([service container](/docs/{{version}}/container)) via `$this->app` from any test method. This service container instance is refreshed for each test class. If you wish to manually force the Application to be refreshed for a given method, you may use the `refreshApplication` method from your test method. This will reset any extra bindings, such as mocks, that have been placed in the IoC container since the test case started running. 209 | -------------------------------------------------------------------------------- /5.0/views.md: -------------------------------------------------------------------------------- 1 | # Views 2 | 3 | - [کاربرد پایه ای ](#basic-usage) 4 | - [View Composers](#view-composers) 5 | 6 | 7 | ## کاربرد ابتدایی 8 | 9 | viewها شامل کد HTML نرم افزار وب شما هستند، و روشی ساده برای جداکردن کنترلر و منطق کاری از منطق نمایشی هستند. viewها در دایرکتوری `resources/views` قراردارند. 10 | 11 | یک view ساده به شکل زیر است: 12 | 13 | 14 | 15 | 16 | 17 |

    Hello,

    18 | 19 | 20 | 21 | این view را میتوانید به این شکل به مرورگر بفرستید: 22 | 23 | Route::get('/', function() 24 | { 25 | return view('greeting', ['name' => 'James']); 26 | }); 27 | 28 | همانطور که میبینید، اولین آرگومان فرستاده شده برای تابع کمکی `view` به نام فایل view در `resources/views` دایرکتوری اشاره دارد. آرگومان دوم فرستاده شده به تابع کمکی آرایه ای داده هاست که درview استفاده میشود. 29 | 30 | البته، viewها میتوانند در پوشه های تودرتو از دایرکتوری `resources/views` قرار داشته باشند. برای مثال، اگر view در `resources/views/admin/profile.php` ذخیره شده باشد، باید به این شکل استفاده شود: 31 | 32 | return view('admin.profile', $data); 33 | 34 | #### ارسال داده به view 35 | 36 | // Using conventional approach 37 | $view = view('greeting')->with('name', 'Victoria'); 38 | 39 | // Using Magic Methods 40 | $view = view('greeting')->withName('Victoria'); 41 | 42 | در مثال بالا، متغیر `$name` در دسترس view قرار دارد و حاوی مقدار `Victoria` است. 43 | 44 | میتوانید یک آرایه داده را به عنوان پارامتر دوم به تابع کمکی `view` بفرستید: 45 | 46 | $view = view('greetings', $data); 47 | 48 | هنگام انتقال اطلاعات به این شکل، `data` باید آرایه ای با مقادیر کلید/مقدار باشد. درون view، میتوانید با استفاده از کلید مربوط به هر مقدار به آن دست پیدا کنید. برای مثال با فرض وجود `$data['key']` میتوان از `{{ $key }}` درview برای دسترسی به داده استفاده کرد. 49 | 50 | #### اشتراک داده با تمام viewها 51 | 52 | گاهی، ممکن است بخواهید داده ای را در دسترس تمامی viewهای به نمایش درآمده توسط نرم افزارتان قرار دهید. گزینه های زیادی برای این کار دارید: تابع کمکی `view`، [کانترکت](/docs/%7B%7Bversion%7D%7D/contracts) `Illuminate\Contracts\View\Factory`، و یا استفاده از یک وایلدکارد [view کامپوزر](#view-composers). 53 | 54 | برای مثال روش استفاده از تابع کمکی `view`: 55 | 56 | view()->share('data', [1, 2, 3]); 57 | 58 | همچنین میتوانید از فاساد `View` استفاده کنید: 59 | 60 | View::share('data', [1, 2, 3]); 61 | 62 | به طور معمول، فراخوانی متد `share` را در متد `boot` یک service provider قرار میدهیم. اما میتوانید آن را به `AppServiceProvider` بیافزایید یا یک service provider مجزا برای مدیریت به اشتراک گذاری داده با تمام view ها ایجاد کنید. 63 | 64 | > **نکته:** هنگامی که تابع کمکی `view` بدون آرگومان فراخوانی شود، یک پیاده سازی از کانترکت `Illuminate\Contracts\View\Factory` ایجاد میکند. 65 | 66 | #### بررسی وجود view 67 | 68 | اگر میخواهید وجود یک view را بررسی نمایید، میتوانید از متد `exists` استفاده کنید: 69 | 70 | if (view()->exists('emails.customer')) 71 | { 72 | // 73 | } 74 | 75 | #### فراخوانی view از مسیر فایل 76 | 77 | اگر بخواهید میتوانید یک view با استفاده از آدرس مسیر کامل یک فایل ایجاد نمایید: 78 | 79 | return view()->file($pathToFile, $data); 80 | 81 | 82 | ## View Composers 83 | 84 | view composerها کالبکها یا متدهای کلاس هستند که هنگام رندر view فراخوانی میشوند. اگر داده ای دارید که با هر بار رندرشدن، بخواهید به view بایند شود، view composer آن منطق را در یک مکان مدیریت شده نگاهداری میکند. 85 | 86 | #### تعریف یک View Composer 87 | 88 | میتوانیم view composerها را درون یک [service provider](/docs/%7B%7Bversion%7D%7D/providers) قرار دهیم. از فاساد `View` برای دستیابی به کانترکت یک نمونه از `Illuminate\Contracts\View\Factory` استفاده میکنیم: 89 | 90 | **نکته:** لاراول پوشه پیش فرضی برای view composerها ندارد. برای دسته بندی آنها هرکجا که بخواهید آزاد هستید. برای مثال، میتوانید یک دایرکتوری `App\Http\ViewComposers` ایجاد کنید. 127 | 128 | به یاد داشته باشید، باید service provider را به آرایه `providers` در فایل پیکربندی `config/app.php` بیافزایید. 129 | 130 | حال که composer را معرفی کرده ایم، متد `ProfileComposer@compose` با هر بار رندرشدن `profile` فراخوانی میشود. در ادامه کلاس composer را تعریف میکنیم: 131 | 132 | users = $users; 156 | } 157 | 158 | /** 159 | * Bind data to the view. 160 | * 161 | * @param View $view 162 | * @return void 163 | */ 164 | public function compose(View $view) 165 | { 166 | $view->with('count', $this->users->count()); 167 | } 168 | 169 | } 170 | 171 | درست پیش از رندرشدن view، متد `compose` با نمونه کلاس `Illuminate\Contracts\View\View` فراخوانی میشود. بای بایند داده به view میتوانید از متد `with` استفاده کنید. 172 | 173 | > **نکته:** تمامی view composerها از طریق service container تشخیص داده می شوند، بنابراین میتوانید هر وابستگی مورد نیاز را در composer constructor اعلان نوع کنید. 174 | 175 | #### Wildcard View Composers 176 | 177 | متد `composer` کاراکتر `*` را به عنوان وایلدکارد میپذیرد، و به این واسطه شما میتوانید یک composer را برای تمام viewها استفاده نمایید. 178 | 179 | View::composer('*', function($view) 180 | { 181 | // 182 | }); 183 | 184 | #### پیوست یک composer به چند view 185 | 186 | میتوانید یک view composer را برای چندین view به طور همزمان استفاده نمایید: 187 | 188 | View::composer(['profile', 'dashboard'], 'App\Http\ViewComposers\MyViewComposer'); 189 | 190 | #### تعریف چند composer 191 | 192 | میتوانید از متد `composers` برای ثبت گروهی از composerها به طور همزمان استفاده کنید: 193 | 194 | View::composers([ 195 | 'App\Http\ViewComposers\AdminComposer' => ['admin.index', 'admin.profile'], 196 | 'App\Http\ViewComposers\UserComposer' => 'user', 197 | 'App\Http\ViewComposers\ProductComposer' => 'product' 198 | ]); 199 | 200 | ### view creator - سازنده های view 201 | 202 | **سازنده**های view عملکردی شبیه به view composerها دارند؛ هرچند، آنها درست زمان ساخته شدن view اجرا می شوند. برای ثبت یک سازنده view، از متد `creator` استفاده کنید: 203 | 204 | View::creator('profile', 'App\Http\ViewCreators\ProfileCreator'); 205 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # مستندات 2 | Persian documents for laravel 3 | 4 | مستندات فارسی لاراول 5 | 6 | برای مشارکت در ترجمه مستندات و توسعه آن میتوانید ریپازیتوری موجود را فورک کرده و پس از اعمال تغییرات و/یا افزودن فایل جدید ترجمه یا مستندات جدید درخواست ترکیب با ریپازیتوری اصلی ایجاد نمایید و پس از تایید، آخرین تغییرات خود را بر روی ریپازیتوری نهایی قرار دهید. 7 | 8 | ترجمه های انجام شده با نام شما در بخش مستندات سایت لارابوک قرار میگیرد. 9 | 10 | www.larabook.ir/docs 11 | 12 | **نکته:** دقت داشته باشید مستندات مربوط به هر نسخه لاراول را به برنچ مربوط به خود بفرستید. برای مثال مستندات نسخه 5.0 لاراول را به برنچ 5.0 بفرستید 13 | 14 | 15 | **پدید آورندگان** 16 | - علی رضا هنرمند 17 | - حامد پاکدامن 18 | --------------------------------------------------------------------------------