Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add RequestCookies doc information. Add view injection docs #225

Merged
merged 3 commits into from
Jan 4, 2025
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions guide/en/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -63,6 +63,7 @@ Views -
* [Working with client scripts](views/client-scripts.md) -
* [Theming](views/theming.md) -
* [Template engines](views/template-engines.md) -
* [View injections](views/view-injections.md) +


Working with databases +-
Expand Down
27 changes: 27 additions & 0 deletions guide/en/runtime/cookies.md
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,33 @@ private function actionProfile(\Psr\Http\Message\ServerRequestInterface $request
}
```

In addition to obtaining cookie values directly from the server request, you can also utilize the [yiisoft/request-provider](https://github.com/yiisoft/request-provider)
package, which provides a more structured way to handle cookies through the `\Yiisoft\RequestProvider\RequestCookieProvider`. This approach can simplify your code and improve readability.

Here’s an example of how to work with cookies using the `\Yiisoft\RequestProvider\RequestCookieProvider`:

```php
final class MyService
{
public function __construct(
private \Yiisoft\RequestProvider\RequestCookieProvider $cookies
) {}

public function go(): void
{
// Check if a specific cookie exists
if ($this->cookies->has('foo')) {
// Retrieve the value of the cookie
$fooValue = $this->cookies->get('foo');
// Do something with the cookie value
}

// Retrieve another cookie value
$barValue = $this->cookies->get('bar');
// Do something with the bar cookie value
}
}

## Sending cookies

Since sending cookies is, in fact, sending a header but since forming the header isn't trivial, there is
Expand Down
104 changes: 104 additions & 0 deletions guide/en/views/view-injections.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,104 @@
# View injections

The view injections are designed to provide a standardized way to pass parameters to the common layer

of views in an application. Implementing this interface allows developers to manage the data that will be available
across various views, ensuring flexibility and reusability of code.

## Configuration

In config `params.php`:


```php
...
'yiisoft/yii-view' => [
'injections' => [
Reference::to(ContentViewInjection::class),
Reference::to(CsrfViewInjection::class),
Reference::to(LayoutViewInjection::class),
],
],
```

## New injections

Start by defining a class that will implement the `Yiisoft\Yii\View\Renderer\CommonParametersInjectionInterface`. This
class will be responsible for providing the parameters you want to inject into your view templates and layouts.

```php
class MyCustomParametersInjection implements Yiisoft\Yii\View\Renderer\CommonParametersInjectionInterface
{
// Class properties and methods will go here
samdark marked this conversation as resolved.
Show resolved Hide resolved

public function __construct(UserService $userService)
{
$this->userService = $userService;
}

public function getCommonParameters(): array
{
return [
'siteName' => 'My Awesome Site',
'currentYear' => date('Y'),
'user' => $this->userService->getCurrentUser(),
];
}
}
```

Add your new Injection to `params.php`:

```php
'yiisoft/yii-view' => [
'injections' => [
...,
Reference::to(MyCustomParametersInjection::class),
],
],
```

## Using Separate Injections for Different Layouts

If your application has multiple layouts, you can create separate parameter injections for each layout. This approach
allows you to tailor the parameters injected into each layout according to its specific needs, enhancing the flexibility
and maintainability of your application.

Create your custom ViewInjection for specific layout:

```php
readonly final class CartViewInjection implements CommonParametersInjectionInterface
{
public function __construct(private Cart $cart)
{
}

public function getCommonParameters(): array
{
return [
'cart' => $this->cart,
];
}
}
```

Add your new injection to `params.php` under specific layout name. In the following example, it is `@layout/cart`:

```php
'yiisoft/yii-view' => [
'injections' => [
...,
Reference::to(MyCustomParametersInjection::class),
DynamicReference::to(static function (ContainerInterface $container) {
$cart = $container
->get(Cart::class);

return new LayoutSpecificInjections(
'@layout/cart', // layout name for injection

new CartViewInjection($cart)
);
}),
],
],
```
Loading